练习C列表

时间:2012-07-13 12:01:55

标签: c list linked-list

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

#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

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

2 个答案:

答案 0 :(得分:3)

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

有问题的行是

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

相反,说

head = NULL

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

9708864号码是垃圾值。当你打电话给malloc()时,无论发生在记忆中的是什么。这就是你必须初始化所有变量的原因!或者,在这种情况下,使用memset()calloc()将这些块设置为某个合理的值。 (但是,无论如何,这条线完全是多余的。)

祝你好运!

答案 1 :(得分: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;
}

这将创建列表的头部,但随后使用“running”或“current”列表指针 - nes - 作为列表创建者。

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

我做了另一个修改,以便在您输入数字后发生行终止符。