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