Ho trovato anche questo codice per le liste, molto piu stringato ma con il problema di non avere nemmeno un commento a disposizione:
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;
}
Non mi è chiara inanzitutto la funzione list_insert_after che vi riporto di seguito:
codice:
NODE *list_insert_after(NODE *node, void *data)
{
NODE *newnode;
newnode=list_create(data);
newnode->next = node->next;
node->next = newnode;
return newnode;
}
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.
Anche perchè ho provato a fare "newnode->next = NULL;" e non va più l'ultima funzione di ricerca di un elemento.