C编程表节点显示最后一个负元素



我有一些问题与链表。基本上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 = nelse块中的节点添加值时,在您通过执行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;
}

相关内容

  • 没有找到相关文章

最新更新