1

我需要有关链接列表的以下代码的帮助:

#include <stdlib.h>
#include <stdio.h>

struct nodo {
    int d;
    struct nodo *next;
};

struct nodo *full();

int main()
{
    struct nodo *l;
    /* l=(struct nodo *)malloc(sizeof(struct nodo)); */
    l = full();
    while(l!=NULL) {
        printf("-->%d\n", l->d);
        l  =l->next;
    }
    system("PAUSE");
}
struct nodo *full()
{
    int i;
    struct nodo *head, *nes;
    head = (struct nodo *)malloc(sizeof(struct nodo));
    head->next = NULL;
    for(i = 1; i < 5; i++) {
        nes = (struct nodo *)malloc(sizeof(struct nodo));
        printf("Insert the %d element:\n", i);
        scanf("%d", &nes->d);
        nes->next = head;
        head = nes;
    }
    return head;
}

例如,如果我尝试输入1, 2, 3, 4,我会得到以下输出:

 -->4
 -->3
 -->2
 -->1
 -->9708864

为什么我得到最后一个号码?我的代码有什么问题?

4

2 回答 2

3

正如@Vinska 在评论中指出的那样,第 3 行full()是不必要的;它正在创建一个额外的节点。

有问题的行是

head = (struct nodo *)malloc(sizeof(struct nodo));

相反,说

head = NULL

使用您现有的代码,您的链表有 5 个元素。第一个是在上述行上创建的。正如预期的那样,其余四个项目在循环中创建,总共有 5 个元素。

9708864数字是垃圾值。它是您调用时发生在内存中的任何内容malloc()。这就是为什么您必须初始化所有变量的原因!或者,在这种情况下,使用memset()calloc()将这些块设置为某个合理的值。(但是,无论如何,这条线在这里完全是多余的。)

祝你好运!

于 2012-07-13T12:27:06.423 回答
0

在您的代码中,我没有看到您保留了链表的开头。我会这样做:

struct nodo *full()
{
    int i;
    struct nodo *head, *nes;
    head = (struct nodo *)malloc(sizeof(struct nodo));
    nes = head;

    for(i = 1; i < 5; i++) {
        nes->next = (struct nodo *)malloc(sizeof(struct nodo));
        printf("Insert the %d element:", i);
        scanf("%d", &nes->d);
        printf("%s","\n");
        nes = nes->next;
    }
    return head;
}

这将创建列表的头部,然后使用您的“运行”或“当前”列表指针 - nes - 作为列表创建者。

在创建列表时,head 仍然指向列表的头部。

我进行了另一项修改,以便在您输入数字后出现行终止符。

于 2012-07-13T12:31:20.617 回答