简单的链表-C

时间:2011-09-06 03:17:30

标签: c pointers linked-list

从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是一个结构。不兼容的指针来自哪里?

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

你需要一个指针

如果你的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;

}

答案 2 :(得分:1)

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

答案 3 :(得分:0)

cur的类型为item*,指向item的指针。但newNode(void)的返回类型为item。它们都不兼容。