链表问题

时间:2011-03-25 22:15:12

标签: c linked-list

我对这个小程序有疑问。它为列表添加了一些值。如果我取消注释//printf("%d",first->val);,程序会出错。一切似乎都没问题;(

 #include <stdio.h>
 #include <stdlib.h>

 typedef struct element {
   struct element *next;
   int val;
 } el_listy;

el_listy *first = 0;


void add_to_list(el_listy *lista, int value)
{

 if(lista == 0)
    {
        lista = malloc (sizeof(el_listy));
        lista->val = value;
        lista->next = 0;
        printf("added as first \n");
    }
        else
        { printf("added as fsecond  \n");
    el_listy *wsk = lista,*tmp;

                while(wsk->next != 0) wsk = wsk->next;

                tmp = malloc (sizeof(el_listy));
                tmp->val = value;
                tmp->next = 0;  

                wsk->next = tmp;                    
        }
}

 int main ()
 {
         add_to_list(first,2);
            add_to_list(first,4);
            //printf("%d",*first->val);
            system("pause");
   return 0;
 }

5 个答案:

答案 0 :(得分:4)

first->val就像(*first).val一样,你不能同时使用它们。另外,正如missno所说,add_to_list永远不会改变first你应该将它的地址作为参数传递,而不是指针本身,这意味着add_to_list(&first,4);(并改变add_to_list的实现)

答案 1 :(得分:2)

您的计划永远不会更改first的值。它仍然是一个空指针,因此在解除引用时会出错。

答案 2 :(得分:1)

->已经跟随指针,因此*会尝试将first视为指向el_listy的指针。您可能会发现cdecl有帮助。

答案 3 :(得分:1)

您应该使用(*first).valfirst->val。否则你会得到错误的间接等级。

答案 4 :(得分:0)

是的,这是一个简单的错误。

调用* add_to_list()*函数后,

fitsr 不会改变。

你应该定义这样的函数:

add_to_list(El_list **lista, ...)