gpt4 book ai didi

无法使用c中的循环链表中的条件删除节点

转载 作者:行者123 更新时间:2023-11-30 16:36:28 26 4
gpt4 key购买 nike

我有一个循环链表,如下所示,它保存要处理的数据的状态。状态用于决定从列表中删除,可以是开头、中间或结尾。该列表有时甚至可能根本没有任何数据,或者可能有多个节点需要删除。

struct data
{
bool status;
char other_info[20];
struct data *next;
};

我尝试了以下代码

struct data* delete_nodes(struct data *head)
{
struct data* first = NULL, *prev = NULL, *temp = NULL;
first = head;
temp = head;
prev = head;
do
{
//prev = temp;

if (temp != NULL && temp->next == head)
{
head->next = NULL;
free(temp);
head = NULL;
return head;
}

if (temp != NULL && temp->status == true)
{
//temp = prev;
prev->next = temp->next;
free(temp);
temp = prev->next;

}
else if(temp != NULL)
temp = temp->next;
if (temp == NULL)
return head;
} while (temp != NULL && first != temp);
head = temp;
return head;
}

现在,将数据推送到其中可以正常工作。如果只有一个节点,删除也可以正常工作。但是当有多个节点需要删除时就会崩溃。

delete_nodes()函数由一个线程调用,该线程处理数据(如果有)并调用 delete_nodes()

最佳答案

此代码块

    if (temp != NULL && temp->status == true)
{
//temp = prev;
prev->next = temp->next;
free(temp);
temp = prev->next;

}

第一次迭代时肯定是错误的。

在第一次迭代时,prevtemp 都与 head 相同。因此,prev 指向与您free-ing 相同的内存。

考虑删除所有对 NULL 的检查,只在开始时进行检查,即

struct data* delete_nodes(struct data *head)
{
if (head == NULL) return NULL;
// Hereafter no further checks for NULL is needed

一个完整的函数可能如下所示:

struct data* delete_nodes(struct data *head)
{
if (head == NULL) return NULL;

struct data *prev = NULL;
struct data *temp = head;
struct data *first = head;

do
{
struct data *next = temp->next;
if (temp->status)
{
if (prev == NULL)
{
// Delete head element
head = temp->next;
}
else
{
// Delete middle element
prev->next = temp->next;
}
free(temp);
}
else
{
prev = temp;
}
temp = next;
} while (temp != first);

if (prev == NULL)
{
// List is empty
return NULL;
}
return head;
}

关于无法使用c中的循环链表中的条件删除节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48477250/

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