【问题标题】:Simple linked list-C简单链表-C
【发布时间】:2025-11-30 23:00:02
【问题描述】:

在暑假结束 C 编程之后,我又回到了最繁忙的课程中,并且正在努力赶上进度,尤其是在指针方面。

当前的分配让我们将程序从数组结构转换为简单的链表。为了刷新我的记忆,我尝试在一个独立的程序中实现它,但遇到了麻烦。

我的代码:

struct node{
  int val;
  struct node *next;
};

typedef struct node *item;

item newNode(void); //function prototype

void main(){
    item *cur, *itemList;
    int i;

    itemList=NULL;

    for (i=0; i<=10; i++){
        cur= newNode();
        cur->val=i;
        cur->next= itemList;

    }
}

item newNode(void) {
    item box;  /* the new object to return */

    box = (item) malloc (sizeof (struct node));

    if (box == NULL) {
        printf("ERROR: emalloc failed for new Box\n");
        exit(0);
    }

    /* initialize fields */
    box->val=0;

    return box;

}

第一条错误消息来自cur= newBox(),并指出正在对不兼容的指针类型进行分配。我不知道为什么,因为 cur 是一个指向节点的指针,而 box 是一个结构。不兼容的指针哪里来的?

【问题讨论】:

  • 您调用了函数newBox,但只声明了newNode,可能是调用中的拼写错误?请记住,C 具有“隐式 int”规则,其中假定未定义的函数具有原型 int func()
  • 这是我帖子中的错字,而不是代码。我是这样编辑的
  • 一般来说,我发现 typedef 被过度使用(就像这里它导致你的错误一样)。除非你能非常清楚地向你的猫解释你为什么使用它,否则不要使用它。

标签: c pointers linked-list


【解决方案1】:

curitem* 类型,指向项目的指针。但是newNode(void) 的返回类型是item。它们都不是类型兼容的。

【讨论】:

    【解决方案2】:

    你需要一个指针

    如果你的 typedef 是这样就更清楚了:

    typedef struct node item;
    

    然后:

    item *newNode(void) {
        item *box;  /* the new object to return */
    
        box = (item) malloc (sizeof (struct node));
    
        if (box == NULL) {
            printf("ERROR: emalloc failed for new Box\n");
            exit(0);
        }
    
        /* initialize fields */
        box->val=0;
    
        return box;
    
    }
    

    你也可以在不同的地方调用函数 newNode 和 newBox。

    你还需要重置头指针:

    for (i=0; i<=10; i++){
        cur= newBox();
        cur->val=i;
        cur->next= itemList;
        itemList = cur;
    
    }
    

    【讨论】:

      【解决方案3】:

      第一个问题是你在做item *cur, *itemList; 这是一个node**。将其更改为 item cur, itemList; 以获取 node*'s;您不需要指向node 的指针,只需指向node 的指针。

      另一个问题是您将节点的所有next 指针设置为itemList,而没有在每次循环迭代结束时将itemList 设置为cur(这将使itemList 指向循环结束时列表的开头)。

      【讨论】:

        【解决方案4】:

        您主要使用item*,即node**。只需在 main 的声明列表中删除 *

        【讨论】: