Ma quest'ultimo codice è tutta farina del tuo sacco? Chiedo perchè noto parecchie differenze rispetto al precedente.
In ogni caso ecco come diventerebbe il codice che hai appena postato
- indentandolo meglio;
- rimuovendo typedef per me fuorvianti;
- eliminando l'inutile funzione isEmpty() che tu stesso a volte utilizzi e a volte no;
- rimuovendo l'inutile passaggio per l'array;
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct node_
{
int item;
struct node_ *next;
} node;
void insert(node **p, int value)
{
node* nuovo = (node*)malloc(sizeof(node));
if(nuovo)
{
nuovo->item = value;
node* current = *p;
node* previous = NULL;
while(current && value > current->item)
{
previous = current;
current = current->next;
}
if(!previous)
{
nuovo->next = *p;
*p = nuovo;
}
else
{
nuovo->next = current;
previous->next = nuovo;
}
}
else
{
printf("non inserito: memoria non disponibile.\n");
}
}
void print(node *current)
{
if(!current)
{
printf("la lista e' vuota\n\n");
}
else
{
puts("\nLa lista e':\n");
while(current)
{
printf("%d-->", current->item);
current = current->next;
}
puts("NULL\n");
}
}
int main()
{
srand(time(0));
node *head = NULL;
unsigned int dim = rand() % 10;
for(unsigned int i = 0; i < dim; ++i)
{
insert(&head, rand() % 100);
}
print(head);
}
Ti faccio inoltre notare che la funzione insert() può essere semplificata in
void insert(node **p, int value)
{
node* nuovo = (node*)malloc(sizeof(node));
if(nuovo)
{
nuovo->item = value;
while(*p && value > (*p)->item)
{
p = &(*p)->next;
}
nuovo->next = *p;
*p = nuovo;
}
else
{
printf("non inserito: memoria non disponibile.\n");
}
}
Detto questo, non vedo come un ulteriore membro prev, in una lista doppiamente concatenata, possa essere d'aiuto in un inserimento in ordine. Quindi l'unica differenza rispetto al caso di lista semplice è che devi aggiornare anche i membri prev dei nodi.