测试链接列表

时间:2017-12-25 21:31:36

标签: c data-structures

我正在阅读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,如预期的那样。

2 个答案:

答案 0 :(得分:2)

你有一个很好的功能。现在:使用它。

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;
}

答案 1 :(得分:1)

正如评论中所提到的,将其编译的方法是将对insert_list()的调用更改为:

insert_list(&traverse, 1);

insert_list()函数将指针指向<{1}}的指针,而不只是指向struct list的指针。

您以奇怪的方式编写了代码。您首先将struct list指定为等于traverse,然后调用root函数,该函数将使用指向其创建的新节点的指针覆盖insert_list()。此时,新节点将是&#34; root&#34;您的树,而不是您最初创建的traverse节点。当您稍后尝试遍历列表时,这可能会引起混淆。