与上一次一样,假设我们有双重链接的节点列表
#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");
}
}
我的代码会破坏现有或不存在的节点。那么有任何逻辑错误或其他什么吗?
答案 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新节点,但是您没有释放它。