【发布时间】:2021-07-25 23:56:30
【问题描述】:
我用 C 写链表
第一个创建的节点的下一个(node->next)是NULL
最后创建的节点是 HEAD。 (倒序)
我创建了 3 个节点 a, b, c
我想删除 b 节点
这是我的代码:
struct node {
char *name;
void *data;
int size;
struct node *next;
};
typedef struct node Node;
void remove_data(Node *node, char* d_name) {
while (node != NULL) {
// remove data from heap
if (strcmp(node->next->name, d_name) == 0) {
node->next = node->next->next;
printf("remove %s\n", node->next->name);
printf("%s -> %s\n", node->name, node->next->name);
free(node->next);
break;
} else {
node = node->next;
}
}
}
并调用此函数remove_data(head, d_name);
我预测这个程序会打印
remove b
a -> c
但它会打印出来
remove b
b -> b
这是为什么呢?
【问题讨论】:
-
顺便说一句:为什么要将字符串
d_name与node->next->name进行比较?如果头节点包含您正在搜索的文本,您将永远找不到它。为什么不与node->name比较呢?此外,如果remove_data删除了头部,它需要某种方式将新头部传递给调用者。 -
请完成一个完整的例子。您没有显示您的节点/列表结构,您没有显示您如何构建列表。
-
@lulle:您可能正在寻找
[ m r e ](没有空格)。它扩展为:minimal reproducible example -
啊,谢谢。我怎么不知道呢哈哈。无论如何,正如 AndreasWenzel 所提到的,如果你使用 compare to 'node->next->name' 你 a) 如果 'head' 包含它,你将永远找不到文本,而且可以说更糟糕的是,b) 'node->next' 可能为 NULL。
标签: c struct linked-list singly-linked-list function-definition