gpt4 book ai didi

c - 从链表中删除项目时出现段错误

转载 作者:行者123 更新时间:2023-11-30 18:56:23 25 4
gpt4 key购买 nike

我正在尝试创建一个程序,您在其中输入“+word”,它会添加该单词,当您输入“-word”时,它会将该单词从链接列表中取出。

插入这个词对我来说效果很好,但删除它会导致段错误。我不确定问题出在哪里。另外,有没有办法可以提示段错误在哪里?

void
remove_from_list(struct linked_list *list, char *data)
{
struct node *current_node = list->head;
struct node *previous_node = NULL;

while (current_node != NULL) {
if (current_node->data == data) {
break;
}
previous_node = current_node;
current_node = current_node->next;
}
if (previous_node == NULL) {
list->head = list->head->next;
} else {
previous_node->next = current_node->next;
}
free(current_node);
if (list->tail == current_node)
list->tail = previous_node;
}

int
main(void)
{
struct linked_list list = { .head = NULL, .tail = NULL };
char word[50];

do {
printf("Enter string: ");
fgets(word, 50, stdin);
if (word[0] == '+')
add_to_list(&list, word);
else if (word[0] == '-')
remove_from_list(&list, word);
} while (word[0] != '\n');

print_list_rec(&list);
free_list(&list);
return 0;
}

最佳答案

出现段错误的主要原因是您在尝试删除时没有处理列表中没有数据的情况。

if (previous_node == NULL) { 
list->head = list->head->next;
} else { // ------------------------- If at the end of the list you go in here
previous_node->next = current_node->next;
}

current_nodeNull,因此 current_node->next 段错误。

您转到列表末尾的原因是因为您没有正确比较数据中的字符串。使用 strcmp() 像@this建议的那样正确比较。但是您应该处理列表中没有数据的情况。

<小时/>

您可以在 while 循环和第一个 if 语句之间添加一个检查,这将处理空列表和不在列表中的数据 -

if(current_node == NULL) // Empty list or wasn't found
return;
<小时/>

另一个说明:

在检查当前节点是否是尾部之前,先释放它。颠倒此顺序。​​

if (list->tail == current_node)
list->tail = previous_node;
free(current_node);

关于c - 从链表中删除项目时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24416909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com