gpt4 book ai didi

c - 按一定条件删除链表元素

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

我写了这个函数:

List* delPaintingCode(List* head, char *code)
{
List *p,*q;

for(p=head;p!=NULL;q=p,p=p->next)
{
if(!strcmp(code,p->code))
{
if (p==head)
{
q=head;
head=p->next;
free(q);
}
else
{
q->next=p->next;
free(p);
p=q;
}
}
}
return head;
}

当我在另一个函数中调用它时:

void delpainting()
{
char code[50];
printf("code ");
scanf("%s",code);

List *head=NULL;

head=delPaintingCode(filetolist,code);
}

程序崩溃了。我有一个警告:从不兼容的指针类型传递 delPaintingCode 的参数 1

那么我应该如何将字符串传递给函数?

最佳答案

导致崩溃的逻辑问题出现在代码的 if (p==head) 分支中:当您删除初始元素时,会释放 head 无需更新p。这会导致在下一次迭代时取消引用已释放的指针。

您可以通过在其 next 中引入一个带有 head 的假节点来解决该问题,并返回 next,如下所示:

List fake;
fake.next = head;
// This loop always looks ahead by one element, i.e. at p->next.
for(List *p = &fake ; p->next != NULL ; p = p->next) {
if(strcmp(code, p->next->code)) {
continue;
}
List *q = p->next;
p->next = q->next;
free(q);
}
return fake.next;

这种方法也适用于初始元素,因为我们在列表中添加了一个假头,因此第一次 p->next 与 head 相同。这使我们能够统一处理 head 元素和所有其他元素。

关于c - 按一定条件删除链表元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30578011/

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