gpt4 book ai didi

c - 删除附加在C中链表末尾的节点

转载 作者:太空宇宙 更新时间:2023-11-04 06:13:08 25 4
gpt4 key购买 nike

我有一个链表,其中每个节点存储一个单词和一个数字。我可以在列表顶部 (push)、列表中心 (insertAfter) 和列表末尾 (append)。我现在添加了一个删除节点的函数,它将获取一个字符,它将在列表中搜索该字符并删除存储该字符的节点。

问题是 deleteNode 将与添加到列表顶部的普通节点一起使用,但是当我在末尾添加一个节点或将其添加到列表中间时,它不会'不工作。

Tl;dr deleteNode 适用于使用 push 创建的节点,但不适用于使用 appendinsertAfter 创建的节点.

我收到的错误是segmentation fault,所以我没有收到来自编译器的特定错误。我试图通过运行代码的不同部分来调试它,但我仍然找不到问题。

struct Node
{
int data;
char *word;
struct Node *next;
};


void push(struct Node** head_ref, int new_data, char *new_word)
{
struct Node* new_node = (struct Node*) malloc(sizeof(struct Node));

new_node->data = new_data;


new_node->word= malloc(strlen(new_word));
strcpy(new_node->word, new_word);

new_node->next = (*head_ref);

(*head_ref) = new_node;
}

/* Given a node prev_node, insert a new node after the given
prev_node */
void insertAfter(struct Node* prev_node, int new_data, char *new_word)
{

if (prev_node == NULL)
{
printf("the given previous node cannot be NULL");
return;
}

struct Node* new_node =(struct Node*) malloc(sizeof(struct Node));

new_node->data = new_data;

new_node->word= malloc(strlen(new_word));
strcpy(new_node->word, new_word);

new_node->next = prev_node->next;
prev_node->next = new_node;
}


void append(struct Node** head_ref, int new_data, char *new_word)
{

struct Node* new_node = (struct Node*) malloc(sizeof(struct Node));

struct Node *last = *head_ref;


new_node->data = new_data;

new_node->word= malloc(strlen(new_word));
strcpy(new_node->word, new_word);

new_node->next = NULL;


if (*head_ref == NULL)
{
*head_ref = new_node;
return;
}


while (last->next != NULL)
last = last->next;


last->next = new_node;
return;
}



void deleteNode(struct Node **head_ref, char *word)
{

struct Node* temp = *head_ref, *prev;
if (strcmp(word, (*head_ref)->word)==0)
{
*head_ref = temp->next; // Changed head
free(temp); // free old head
return;
}



while (strcmp(word, (*head_ref)->word)!=0)
{
prev = temp;
temp = temp->next;
}

if (temp == NULL) return;


prev->next = temp->next;

free(temp); // Free memory

}

最佳答案

这部分看起来很奇怪:

while (strcmp(word, (*head_ref)->word)!=0)
{
prev = temp;
temp = temp->next;
}

strcmp 中您使用 head_ref 但在正文中您更新 temp 以移动到下一个元素。

你打算做什么:

while (strcmp(word, temp->word)!=0)
{
prev = temp;
temp = temp->next;
}

此外,可能应该检查 temp 是否为 NULL。喜欢:

while (temp && strcmp(word, temp->word)!=0)

关于c - 删除附加在C中链表末尾的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52155588/

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