gpt4 book ai didi

c - 正确从双向链表中删除节点

转载 作者:行者123 更新时间:2023-11-30 14:36:43 24 4
gpt4 key购买 nike

在尝试删除节点时,我能够释放分配的内存,但无法将其分配为 NULL,因此我的程序停止打印这些地址。我相信我必须使用双指针来做到这一点。

我尝试在释放后等于 NULL,但这会导致程序崩溃。

typedef struct Linked_List_type
{
struct Node_type *first;
struct Node_type *last;
} LinkedList;
typedef struct Node_type
{
int data;
char name[15];
char phone[15];
struct Node_type *next;
struct Node_type *prev;
} Node;
//This is how I insert
void LinkedList_insert (LinkedList * this, int val, char * name, char * phone)
{
//creo un nodo para insertar
Node *it = this->first;
Node *newNode = new_Node (val, name, phone);
if (!this)
{
printf ("Lista no creada\n");
}
for (it = this->first; it != NULL; it = it->next)
{
if (strcmp(it->name, name)==0) //Evitar repeticiC3n
{
printf ("Valor repetido\n");
return;
}
}
if (!this->first)
{
newNode->next = NULL;
this->last = newNode;
this->first = newNode;
//first y last ocupan el mismo valor, siguiente apunta a nulo
//solo si la lista estC! vacC-a
}
else
{
newNode->prev = this->last;
this->last->next = newNode;
this->last = this->last->next;
}
}
//This is how I remove
Bool LinkedList_removestr(LinkedList * this, char * str)
{
Node * tmp = NULL;
Node * it = this->first;
Bool Bandera = FALSE;
while(it!=NULL)
{
if(it->next!=NULL && strcmp(it->name,str)==0)
{
tmp=it;
it=it->next;
free(tmp);
Bandera=TRUE;
}
if(it->next==NULL && strcmp(it->name,str)==0)//si first es igual al que quiero remover
{
tmp=it;
free(tmp);//no apunto a next porque no hay
Bandera=TRUE;
}
it=it->next;
}
return Bandera;
}

删除后,在打印列表时,我希望列表跳过删除的节点地址,或者不显示它,但是使用我的删除功能后,在打印列表时,节点会打印地址,我相信。

最佳答案

删除节点it时,需要将前一个节点的next指针替换为it->next,并将下一个节点的previous指针替换为 >它->上一个

但是,执行此操作时,您还必须考虑列表开头和结尾的特殊情况:

if (it->prev != NULL)
it->prev->next = it->next;
else
this->first = it->next;

if (it->next != NULL)
it->next->prev = it->prev;
else
this->last = it->prev;

您的tmp变量应该仅用于保存指向要检查的下一个节点的指针,以防被释放。将其全部放入循环中:

Bool LinkedList_removestr(LinkedList * this, char * str)
{
Node * tmp = NULL;
Node * it = this->first;
Bool Bandera = FALSE;

while (it != NULL)
{
/* Save it->next, because 'it' may be freed */
tmp = it->next;

if (strcmp(it->name, str) == 0)
{
Bandera = TRUE;

/* Adjust next pointer of previous node */
if (it->prev != NULL)
it->prev->next = it->next;
else
this->first = it->next;

/* Adjust previous pointer of next node */
if (it->next != NULL)
it->next->prev = it->prev;
else
this->last = it->prev;

free(it);
}

it = tmp;
}

return Bandera;
}

关于c - 正确从双向链表中删除节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57881594/

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