我有一些问题与链表。基本上user会一直输入值这些值会被添加到链表中直到user输入-1。下面是我的代码:
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
typedef struct node
{
int num;
struct node *next;
}ListNode;
int main() {
int n = 0;
ListNode *newNode = NULL, *head = NULL;
newNode = malloc(sizeof(ListNode));
head = newNode;
printf("Enter a list of numbers, terminated by the value -1: ");
do {
scanf("%d", &n);
if (n == -1) {
newNode->next = NULL;
break;
}
else {
newNode->num = n;
newNode->next = malloc(sizeof(ListNode));
newNode = newNode->next;
}
} while (n != -1);
newNode = head;
while (newNode != NULL)
{
printf("%d ", newNode->num);
newNode = newNode->next;
}
return 0;
}
假设输入的是1 2 3 4 -1
。期望的输出应该是1 2 3 4
。然而,我得到了1 2 3 4 -842150451
。我想知道为什么会有- 5这个数字。问题在于我的打印listNode部分?
总是比用户输入的数字多分配一个节点。最后一个节点的num
未初始化(这就是您的垃圾值的来源)。
这里有一个可能的修复:
ListNode **pnode, *head = NULL;
pnode = &head;
printf("Enter a list of numbers, terminated by the value -1: ");
while (scanf("%d", &n) == 1 && n != -1) {
*pnode = malloc(sizeof **pnode);
(*pnode)->num = n;
(*pnode)->next = NULL;
pnode = &(*pnode)->next;
}
循环条件确保我们能够读取一个数字,并且该数字不是-1。
我们只在此之后分配一个新节点(即只分配与输入的节点数量相同的节点数量)。
pnode
指向节点链中的最后一个指针。它标记了下一个节点应该插入的位置。最初这是&head
(即第一个节点存储在head
中(通过分配给*pnode
)),但它随着每次插入(pnode = &(*pnode)->next
,新的最后一个指针)沿着列表移动。
您可以将打印循环更改为:
while (newNode->next != NULL)
{
printf("%d ", newNode->num);
newNode = newNode->next;
}
虽然这只是不打印您正在创建的最后一个冗余节点。最好是修改代码,这样就不会出现冗余节点了!
每当您通过执行newNode->num = n
向else
块中的节点添加值时,在您通过执行newNode->next=malloc(sizeof(ListNode))
创建新节点后不久。想想如果它是你刚刚插入的列表中的最后一个值。之后真的需要创建一个新节点吗?
列表中的节点总是比值多一个。最后一个节点的num
值未分配。如果第一个值是-1会发生什么?您应该仍然在head
中有一个节点。移除第一个malloc,并在循环中赋值malloc后的newNode->num
。你必须在那里分配head
,通过检查它是否仍然为null
根据newNode->next != NULL的条件在打印时使用'while'循环应该可以解决您的问题。
在do/while循环中分配的下一个节点未初始化。因此,最后一个节点有一个未确定的num
字段。
不要使用do/while
循环。检查scanf
的返回值,按需分配节点,而不是提前分配。
以下是更正后的简化版本:
#include <stdlib.h>
#include <stdio.h>
typedef struct node {
int num;
struct node *next;
} ListNode;
int main(void) {
int n;
ListNode *head = NULL, **tailp = &head;
printf("Enter a list of numbers, terminated by the value -1: ");
while (scanf("%d", &n) == 1 && n != -1) {
ListNode *newNode = malloc(sizeof(ListNode));
newNode->num = n;
newNode->next = NULL;
*tailp = newNode;
tailp = &newNode->next;
}
for (ListNode *np = head; np != NULL; np = np->next) {
printf("%d ", np->num);
}
printf("n");
return 0;
}