如何遍历c中的列表

时间:2018-03-26 12:45:08

标签: c linked-list abstract-data-type

让"列出"是一个表示单链表的结构,我有以下功能:

int List_contains(List node, const char* key) {
    List *search;
    search=node.next; 
    assert(search->key!=NULL);
    return 1;
}

和List是以下结构:

typedef struct List { /*A new node*/
    char* key;
    void* value;
    struct List *next;
} List;

功能" List_contains"应该告诉我是否"关键"是否包含在列表中。问题是,我无法遍历列表和行

assert(search->key != NULL);

抛出一个Segfault。我怎么能用我拥有的东西遍历列表呢?

(注意:该功能显然不是"已完成"。)

2 个答案:

答案 0 :(得分:0)

以下是我写的一段时间的搜索示例。

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


int
search_list(struct node *head, int search)
{
    if (!head)
    {
        fprintf(stderr, "Invalid head\n");
        return 1;
    }

    struct node *temp = head;

    while (temp)
    {
        if (temp->data == search)
        {
            printf("Found %d\n", search);
            break;
        }

        temp = temp->next;

    }

    return 0;
}

答案 1 :(得分:0)

int List_contains(List node, const char* key) {
    List *search;
    search=node.next; 
    assert(search->key!=NULL);
    return 1;
}

这里要解析很多...

一般情况下,你会传递一个指向node的指针,这样它就不会被复制,但实际上你做的事情是安全的,在这种情况下,假设没有多线程的恶作剧。 ..

但将来我会寻找: int List_contains(List* node, const char* key) {

下一行你创建一个没有值的指针......这很好,因为你将它分配给下一行,但是可以压缩......

// List *search; 
// search=node.next; # could easily become:
List *search = node.next;

现在,你现在知道你是否在列表的最后......

if(search == null)
{
     return 0;
}

之后你需要做一些比较......

if (strcmp(key,search->key) == 0)
{
    //found it;
    return 1;
}

现在你有代码将匹配列表的第一个元素的键,所以你需要将整个事物放在一个循环中,每次迭代都用search交换search->next并检查空