我正在阅读Skiena的“算法设计手册”,用于个人学习,我正在尝试在C中实现链接列表。
如何使用insert_list()
函数然后打印出我的列表以验证值?
/* definition of linked list */
typedef struct list {
int item;
struct list *next;
} list;
/* insert item into list */
void insert_list(list **l, int x) {
list *p;
p = malloc(sizeof(list));
p->item = x;
p->next = *l;
*l = p;
}
我写了一个主要功能,试图找出如何使用insert_list()
:
int main(void) {
struct list *root;
struct list *traverse;
root = (struct list *)malloc(sizeof(struct list));
root->next = 0;
root->item = 5;
traverse = root;
insert_list(traverse, 1); /* this is the problem */
printf("%d\n", root->item);
}
我在使用gcc:expected 'struct list **' but argument is of type 'struct list *
编译时收到错误
如何正确使用此功能将项目插入并打印我的列表?如果没有insert_list()调用,它会按预期将root-> item打印为5。
你有一个很好的功能。现在:使用它。
int main(void) {
// You have a typedef, so you should omit the struct keyword
/*struct */ list *root= NULL, *p;
insert_list(&root, 5);
insert_list(&root, 1);
for (p=root; p; p=p->next){
printf("%d\n", p->item);
}
return 0;
}
正如评论中所提到的,编译它的方法是将对insert_list()
的调用更改为:
insert_list(&traverse, 1);
insert_list()
函数获取指向struct list
的指针,而不只是指向struct list
的指针。
你以奇怪的方式编写了代码。你首先指定traverse
等于root
,然后调用insert_list()
函数,它将用指向它创建的新节点的指针覆盖traverse
。此时,新节点将是树的“根”,而不是您最初创建的root
节点。当您稍后尝试遍历列表时,这可能会导致混淆。