我编写了一个程序,询问用户是否要在链表中插入一个新节点(插入末尾(,然后打印整个链表。每当用户输入值0时,程序就会停止并打印链接列表。
这是代码:
#include <stdlib.h>
#include <stdio.h>
struct ListNode
{
int data;
struct ListNode *next;
};
int main()
{
int val,
flag = 1;
struct ListNode *p,
*head,
*temp;
printf("press 0 to exitn");
do
{
printf("enter the data : ");
scanf("%d", &val);
p = (struct ListNode *)malloc(sizeof(struct ListNode));
if(head == NULL)
{
p -> data = val;
p -> next = NULL;
head = p;
temp = p;
}
else
{
p -> data = val;
p -> next = NULL;
temp -> next = p;
}
printf("continue?");
scanf("%d", &flag);
}while(flag != 0);
temp = head;
while(temp != NULL)
{
printf("%d -> ", temp -> data);
temp = temp -> next;
}
printf("n");
return 0;
}
现在,我在输出中遇到的问题是,它只打印第一个和最后一个节点。中间的其他节点不会打印。
以下是输出示例:
编号:12 13 14 15
输出:12 15
有人能向我解释一下我哪里错了吗?我总是可以把整件事放在一个函数中并执行,但现在我想在不使用函数调用的情况下尝试同样的方法。
在下面的if-else块中,
if(head == NULL)
{
p -> data = val;
p -> next = NULL;
head = p;
temp = p;
}
else
{
p -> data = val;
p -> next = NULL;
temp -> next = p;
}
最初,当head为NULL
时,将head
和temp
都分配给p
。所以,temp指向第一个元素。之后,每次获得新元素时,都会将temp->next
重新分配给该新元素,而不更新temp
。实际上,您每次都在分配head->next
。要更正此问题,您需要每次更新temp
,
if(head == NULL)
{
p -> data = val;
p -> next = NULL;
head = p;
temp = p;
}
else
{
p -> data = val;
p -> next = NULL;
temp -> next = p;
temp = p;
}
在声明head
时,您还需要将其初始化为NULL
,因为默认情况下C中的局部变量不会进行初始化。
只有在创建第一个节点时,才将当前节点(即p
(存储在temp
中。
你需要修改的这个代码片段
if(head == NULL)
{
p -> data = val;
p -> next = NULL;
head = p;
temp = p;
}
else
{
p -> data = val;
p -> next = NULL;
temp -> next = p;
}
至
if(head == NULL)
{
p -> data = val;
p -> next = NULL;
head = p;
temp = p;
}
else
{
p -> data = val;
p -> next = NULL;
temp -> next = p;
temp=p;
}
现在它会很好用的。在while
循环的每次迭代之后,您需要将指向当前节点p
的指针存储在temp
中。
存在以下问题:
-
如BLUEPIXY在评论中所述,
head
未初始化。struct ListNode *p, /* *head, */ // ISSUE: head not initialized head = NULL, *temp;
-
添加额外节点时,您没有更新
temp
else { p->data = val; p->next = NULL; temp->next = p; temp = p; // NEED to update temp }
此外,不需要对malloc
的结果进行强制转换。
此外,建议通过检查其返回值来检查malloc
是否成功。比如,在这种情况下:
p = malloc(sizeof(struct ListNode));
if (p == NULL) {
/* malloc failed. Code to handle the error */
}