【问题标题】:Excercise about C lists关于 C 列表的练习
【发布时间】:2012-07-13 12:01:54
【问题描述】:

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

#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

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

【问题讨论】:

  • 这是作业吗?另外:1.不需要在调用full()之前转换malloc的结果,2.在调用full()之前不需要malloc,3.你没有调用free()...
  • @EitanT 当然是;如果不是,OP 就不敢投 malloc() 的返回值。
  • @EitanT 我总是转换 malloc 的结果,因为是的,这是一个家庭作业,而且如果我不转换,我的编译器会返回这个错误:invalid conversion from void*' to nodo*' Where should我打电话免费吗?
  • @wild91 你的 C 编译器是什么蹩脚的? void * 必须隐式兼容任何指针类型。
  • @wild91 也许您正在使用 C++ 编译器进行编译? void* 不需要转换为另一个指针。另外,我冒昧地格式化了您的代码。下次将其标记为 [tag: homework]。

标签: c list linked-list


【解决方案1】:

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

有问题的行是

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

相反,说

head = NULL

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

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

祝你好运!

【讨论】:

    【解决方案2】:

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

    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 仍然指向列表的头部。

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

    【讨论】:

      猜你喜欢
      • 2015-09-16
      • 2022-11-21
      • 2015-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-23
      • 1970-01-01
      相关资源
      最近更新 更多