typedef struct list
{
struct list * next;
int val;
}*list_t;
list_t add(list_t l,int e)
{
list_t head;
if(l == NULL)
{
l = malloc(sizeof(list_t));
l->val = e;
l->next = NULL;
return l;
}
head = l;
while(l != NULL)
l=l->next;
l = malloc(sizeof(list_t));
l->val = e;
l->next = NULL;
return head;
}
Sample driver:
int main()
{
list_t ints=NULL;
int i;
for(i=0;i<156;i+=2)
ints = add(ints,i);
while(ints->next != NULL)
{
printf("%d\n",ints->val);
ints=ints->next;
}
system("pause");
return 0;
}
Program works, but “add” function rewinds the list so that the body of main’s loop is never achieved.It surprised me a lot, because I thought that I’d been passing list as a value! Could you explain this phenomenom?
The problem is not that the add function rewinds the list, is that it’s not working at all: Nowhere in your code are you stating that the previous end of the list should link to the newly added element.
I’ve modified it slightly:
The code now works as expected.
Remember that
lis a local variable in theaddfunction. Any changes made tolwill be lost if it’s not allowed to leave the scope of the function somehow (like you do when you return it, inside the first if). Changes made to the variablelpoints to, using either the*or the->operators, will be effective to whoever has access to that variable.I recomend that you start reading on debugging techniques. They vary depending on your environment, and can go from cryptic commandline tools like gdb to full-fledged graphical object browsers and such. This way you will be able to see what happens step by step and monitor memory changes and check what’s really being stored in your variables.
EDIT: Fixed pointer trouble as commented. Memory allocations now provide for the whole struct variable, and pointers are no longer used implicitly.