我試圖在輸入'+ 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;
}
您應該使用實際的字符串比較(如'strncmp')來查找節點是否包含您的字符串。所有這一切:'current_node-> data == data'是比較指針。 – turbulencetoo
因爲C中的字符串很棘手,如果僅從內存管理的角度來看,可能會嘗試使用相同的代碼,但將整數看作'data',看看你是否得到相同的問題。 – turbulencetoo
關於這一行:free_list(&list);,你不能釋放堆棧上的一個結構體,但是,你可以遍歷鏈表,釋放列表中的每個節點(除了第一個節點以外,因爲它在堆棧中) – user3629249