无法打印c中链接列表中的元素

时间:2018-04-21 06:00:28

标签: c

我刚学习链表。 当我试图在链表中插入元素时,我无法打印那些插入的元素。

int main()
{
    int i,x,n; 
    struct node* head = NULL; 
    printf("Enter number of elements to insert into likedlist :"); 
    scanf("%d",&n); 
    printf("Enter elements: "); 
    for(i=0;i<n;i++) 
    {
        scanf("%d",&x);
        insert(head,x);
    }
    print(head);
} 

struct node* insert(struct node* head,int x)
{
    struct node* p = (struct node*)malloc(sizeof(struct node));
    p->data = x;
    p->next = NULL;
    if(head == NULL)
    {
        head = p;
        return head;
    }
    p->next = head;
    head = p;
    return head;
}

这里我通过更改它的头节点(insert_front)将元素添加到链表中。

void print(struct node* n)
{
    while(n != NULL)
    {
        printf("%d -> ",n->data);
        n = n->next;
    }
    printf("NULL");
}

所以,这段代码出了什么问题。 输出就像这样

示例输入:

 Enter number of elements to insert into likedlist :5
 Enter elements: 1 2 3 4 5

示例输出:

NULL

1 个答案:

答案 0 :(得分:1)

阅读有关C编程的更多信息(首先是一些好的教程书,然后是一些reference site,稍后再参考C11标准n1570)。我们不能在几个段落中教你。

C使用call-by-value evaluation strategy

所以,至少对于新手来说,传统上建议(但不要求)永远不要使用正式参数作为某些赋值的左侧目标,因为对正式参数的任何更改都是 local 到具有该形式参数的函数,并且不会影响调用者。

所以,使用GCC编译所有警告和调试信息gcc -Wall -Wextra -g使用调试器(例如gdb)来了解程序的行为(您的错误可能不在您向我们展示的代码块中)。

能够理解整个程序的行为并进行调试,是开发人员必备的技能。编译器的警告和调试器都可以帮助您理解程序的行为。另请参阅http://norvig.com/21-days.html以获得有用的见解。

因此head中的insert形式参数是来自调用者的实际参数的本地副本

if(head == NULL)
{
    head = p;
    return head;
}

您只修改该副本,而不是原始副本。所以上面的head = p;完全没用(而且令人困惑),你最好只用return p;替换上面大括号中的块

我们不知道您如何致电insert,我们无法提供更多帮助。

也许insert应该得到某个指针的地址 ....或者你的main应该使用它的返回值......

在您编辑的问题中,在main内,替换

    insert(head,x); //WRONG

(它不会更改head中声明的本地main,即使insert正在更改其第一个正式,因为通过值参数传递调用)

    head = insert(head, x);