无法打印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;idata = 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 

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

C使用按值调用的评估策略 。

因此,至少对于新手来说,传统上建议(但不要求)永远不要使用正式参数作为某些赋值的左侧目的地,因为对forms参数的任何更改都是具有该forms参数的函数的局部变量,并且不影响来电者。

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

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

所以insertheadforms参数是来自调用者的实际参数的本地副本

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

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

我们不知道您如何调用insert ,我们无法提供帮助。

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

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

  insert(head,x); //WRONG 

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

  head = insert(head, x);