Ho trovato anche questo codice per le liste, molto piu stringato ma con il problema di non avere nemmeno un commento a disposizione:
Non mi è chiara inanzitutto la funzione list_insert_after che vi riporto di seguito:codice:#include<stdlib.h> #include<stdio.h> #include<string.h> typedef struct node_s { void *data; struct node_s *next; } NODE; NODE *list_create(void *data) { NODE *node; if(!(node=malloc(sizeof(NODE)))) return NULL; node->data=data; node->next=NULL; return node; } NODE *list_insert_after(NODE *node, void *data) { NODE *newnode; newnode=list_create(data); newnode->next = node->next; node->next = newnode; return newnode; } NODE *list_insert_beginning(NODE *list, void *data) { NODE *newnode; newnode=list_create(data); newnode->next = list; return newnode; } int list_remove(NODE *list, NODE *node) { while(list->next && list->next!=node) list=list->next; if(list->next) { list->next=node->next; free(node); return 0; } else return -1; } int list_foreach(NODE *node, int(*func)(void*)) { while(node) { if(func(node->data)!=0) return -1; node=node->next; } return 0; } NODE *list_find(NODE *node, int(*func)(void*,void*), void *data) { while(node) { if(func(node->data, data)>0) return node; node=node->next; } return NULL; } int printstring(void *s) { printf("%s\n", (char *)s); return 0; } int findstring(void *listdata, void *searchdata) { return strcmp((char*)listdata, (char*)searchdata)?0:1; } int main() { NODE *list, *second, *inserted; NODE *match; /* Create initial elements of list */ list=list_create((void*)"First"); second=list_insert_after(list, (void*)"Second"); list_insert_after(second, (void*)"Third"); printf("Initial list:\n"); list_foreach(list, printstring); putchar('\n'); /* Insert 1 extra element in front */ list=list_insert_beginning(list, "BeforeFirst"); printf("After list_insert_beginning():\n"); list_foreach(list, printstring); putchar('\n'); /* Insert 1 extra element after second */ inserted=list_insert_after(second, "AfterSecond"); printf("After list_insert_after():\n"); list_foreach(list, printstring); putchar('\n'); /* Remove the element */ list_remove(list, inserted); printf("After list_remove():\n"); list_foreach(list, printstring); putchar('\n'); /* Search */ if((match=list_find(list, findstring, "Third"))) printf("Found \"Third\"\n"); else printf("Did not find \"Third\"\n"); system("PAUSE"); return 0; }
Praticameente questa prima crea il nuovo nodo, poi però dice "newnode->next = node->next;" che significa? cioè il sucessivo di newnode è se stesso? non mi torna.codice:NODE *list_insert_after(NODE *node, void *data) { NODE *newnode; newnode=list_create(data); newnode->next = node->next; node->next = newnode; return newnode; }
Anche perchè ho provato a fare "newnode->next = NULL;" e non va più l'ultima funzione di ricerca di un elemento.


Rispondi quotando