gpt4 book ai didi

c - 删除链表中的第一个节点

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

我试图从 C 上的简单链表中删除节点,当我删除除第一个节点之外的任何其他节点时它工作正常,但是当我尝试删除第一个节点时整个列表困惑,我试过不同的解决方案,我有相同的结果,我不知道该怎么办了

我的一个尝试是这样的:

void deleteClient (client **p, int n){
client *t = *p;

if (t){
while (t && t->id != n)
t = t->next;
if (t){
client * ax = t;
t = t->next;
free(ax);
}
}
}

另一个是这个

void deleteClient (client **p, int n){
client *t = *p;

if (t)
if (t->id == n){
client * ax = *p;
*p = (*p)->next;
free(ax);
return;
}
else{
while (t->next && t->next->id != n)
t = t->next;
if (t->next){
client * ax = t->next;
t->next = t->next->next;
free(ax);
}
}
}

但在两个版本的代码中,它只能从第二个节点开始删除,如果我尝试删除第一个节点,则会弄乱整个列表。

最佳答案

您可以通过简单地使用指向节点的指针来保存当前节点和指向下一个节点的指针来消除对多种情况的测试(节点是第一个,如果不是第一个,等等),例如

/** delete node with value n from list (for loop) */
void deleteClient (client **p, int n)
{
client **ppn = p; /* pointer to pointer to node*/
client *pn = *p; /* pointer to node */

for (; pn; ppn = &pn->next, pn = pn->next) {
if (pn->id == n) {
*ppn = pn->next; /* set address to next */
free (pn);
break;
}
}
}

此方法在 Linus on Understanding Pointers 中有详细说明

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

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