C - 搜索方法中的链表

时间:2016-02-28 20:25:38

标签: c dynamic data-structures linked-list doubly-linked-list

与上一次一样,假设我们有双重链接的节点列表

#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int value;
    struct Node* next;
    struct Node* prev;
} Node;

typedef struct LinkedList {
    Node *first;
    Node *last;
} LinkedList;

void initList(LinkedList* l) {
    l->first = NULL;
    l->last = NULL;
}

我的任务是编码搜索方法,它应该找到一个给定值的节点

Node* search(LinkedList *list, int value) { ... }

好吧,我的尝试遵循

Node* search(LinkedList *list, int value) {

    Node *node = malloc(sizeof(Node));
    if (node == NULL)
        return NULL;

    node->value = value;
    node->prev = NULL;
    node->next = list->first;

    while((node->value != value) && (node->next != NULL)){
        node->prev = node->next;
        node->next = (node->next)->next;
    }

    return node;
}

根据实施测试(这不是我的工作: - )

void test_search_exist() {
    printf("Test 3: ");

    LinkedList l;
    initList(&l);

    Node n1, n2;
    n1.value = 1;
    n1.next = &n2;
    n1.prev = NULL;
    n2.value = 2;
    n2.next = NULL;
    n2.prev = &n1;
    l.first = &n1;
    l.last = &n2;

    Node *i = search(&l, 2);

    if (i == &n2) {
        printf("OK\n");
    }else{
        printf("FAIL\n");
    }
}

void test_search_not_exist(){
    printf("Test 4: ");

    LinkedList l;
    initList(&l);

    Node n1, n2;
    n1.value = 1;
    n1.next = &n2;
    n1.prev = NULL;
    n2.value = 2;
    n2.next = NULL;
    n2.prev = &n1;
    l.first = &n1;
    l.last = &n2;

    Node *i = search(&l, 3);

    if (i == NULL) {
        printf("OK\n");
    }else{
        printf("FAIL\n");
    }
}

我的代码会破坏现有或不存在的节点。那么有任何逻辑错误或其他什么吗?

1 个答案:

答案 0 :(得分:1)

首先:不要在搜索中分配。数据成员已存在,因为您已提前创建它们。 其次:遍历列表并检查每个节点的值。

Node* search(LinkedList *list, int value) 
{
    Node *node = list->first;
    Node *found = NULL;

    while(node != NULL)
    {
        if(node->value == value)
        {
            found = node;
            break;
        }

        node = node->next;
    }

    return found;
}

更具体地说明您所犯的错误:

您分配了一个节点,然后使用第一个节点的指针填充它,但是使用您要搜索的值。然后你开始循环遍历列表,条件是当node-&gt;值等于你要搜索的值时停止。由于node-&gt;值已使用您正在搜索的值进行初始化,因此此比较始终为false(因为它相同),循环将终止并且您得到错误的结果。

除此之外,您的原始代码会导致内存泄漏,因为您使用malloc新节点,但是您没有释放它。