gpt4 book ai didi

c - 删除链表中的节点

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

我刚刚开始研究节点和简单的链表。虽然我发现链接列表令人困惑,但我仍然开始更多地理解它们,并可以按照不同的教程对它们进行编码。

但是为了删除节点,我尝试了一段不太有效的代码,并发现了另一段可以正常工作的代码。只是我不太明白为什么一个有效而另一个无效。

这是不起作用的:

void remove_character(Character **head)
{
Character *current=*head,
*temp=malloc(sizeof(Character));//temporary node to
//remove node
char *name=malloc(100);

if(current!=NULL)//if there is at least one node
{
printf("Enter name: ");
scanf("%s", name);
}

if(!strcmp(name, (*head)->name))//removes head and
//makes next node head
{
temp=(*head);
(*head)=(*head)->next;
free(temp->name);
free(temp);
current=*head;
}

while(current!=NULL)
{
if(!strcmp(name, current->name))
{
temp=current;//assign node to be removed
current=current->next;//move to next node
free(temp->name);
free(temp);//free removed node
}
current=current->next;
}
}

但这有效:

void remove_character(Character **head)
{
Character *current=*head,
*temp=malloc(sizeof(Character));
char *name=malloc(100);

if(current!=NULL)
{
printf("Enter name: ");
scanf("%s", name);
}

if(!strcmp(name, (*head)->name))
{
temp=(*head);
(*head)=(*head)->next;
free(temp->name);
free(temp);
current=*head;
}

while(current!=NULL)
{
if(current->next!=NULL)
{
if(!strcmp(name, current->next->name))
{//if next node is node to be removed
temp=current->next;
current->next=current->next->next;
//moves to next node
free(temp->name);
free(temp);
}
}
current=current->next;
}
}

基本上,第二个预期一个节点并进一步链接一个节点,但为什么这个应该工作而不是另一个(它在删除的节点所在的位置打印段错误......节点看起来很容易,但管理起来很复杂。尤其是当你不善于想象它是如何工作的时候。

最佳答案

在第一种方法中,您并不主动。

即在访问特定节点后检查字符串,并找到要删除的节点您只需释放它并进一步移动,而无需修复列表

再添加一个指针来指向前一个节点应该可以解决此问题。

        if(!strcmp(name, (*head)->name))
{
/* Code to delete in the head node */

temp=(*head);
(*head)=(*head)->next;
free(temp->name);
free(temp);
current=*head;
}
else
{

/* Code to delete in the rest of the list*/
character *prev=*head;
while(current!=NULL)
{
if(!strcmp(name, current->name))
{
prev->next = current->next;//move to next node
free(current->name);
free(current);//free removed node
break;
}
prev = current;
current=current->next;
}
}

在第二种方法中,你是积极主动的。

也就是说,您在访问特定节点之前检查字符串,并且一旦找到要访问的下一个节点被删除,然后您释放它并在修复列表后进一步移动。

if(!strcmp(name, current->next->name))   // Found out next node to be deleted
{
temp=current->next; // Get the next node
current->next=current->next->next; // Adjust the list by skipping the next node

free(temp->name); // Free the node.
free(temp);
}

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

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