无法打印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以获得有用的见解。
所以insert
的head
forms参数是来自调用者的实际参数的本地副本 。
在
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);