我刚学习链表。 当我试图在链表中插入元素时,我无法打印那些插入的元素。
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
答案 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);