gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:28:33 25 4
gpt4 key购买 nike

我的问题是从链表中删除一个节点。

我有两个结构:

typedef struct inner_list 
{
int count;
char word[100];
inner_list*next;
} inner_list;
typedef struct outer_list
{
char word [100];
inner_list * head;
int count;
outer_list * next;
} outer_list;

我的问题是从 outer_list 链表中删除一个节点。例如,当用户输入aaa 删除时,delete 函数应该找到outer_list->word = aaa 的节点并删除该节点并重新连接列表。我尝试了下面的代码来做到这一点。但在找到并删除后我丢失了列表。我不知道出了什么问题。请注意,outer_list 内部还有一个 inner_list 链表。

void delnode(outer_list **head,char num[100])//thanks to both Nir Levy and Jeremy P.
{
outer_list *temp, *m;
m=temp=*head; /*FIX #1*/
while(temp!=NULL) {
if(strcmp(temp->word,num)==0) {
if(temp==*head) {
delinner(temp->head); /* FIX#2 */
*head=temp->next;

free(temp);
return;
} else {
delinner(temp->head); /* FIX#2 */
m->next=temp->next;

free(temp);
return;
}
} else {
m=temp;
temp= temp->next;
}
}
printf(" ELEMENT %s NOT FOUND ", num);
}
void delinner(inner_list *head) { /* FIX#2 */
inner_list *temp;
temp=head;
while(temp!=NULL) {
head=temp->next;
free(temp);
temp=head;
}
}

现在我的问题更新了。从内部列表中删除一个元素时,我也在尝试从 inner_list 中删除相同的元素。

例如:- 假设 aaa 是 outer_list 链表的一个元素,我们用 outer_list *p 指向它- 这个 aaa 也可以在 inner_list 链表中。 (它可以在 p->head 或另一个内部列表中。)现在,棘手的部分又来了。我尝试对 outer_list 删除应用相同的规则,但每当我删除 inner_list 的头元素时,它都会出错。这是我尝试过的:

void delnode2(outer_list *up,inner_list **head,char num[100])
{
inner_list *temp2,*temp, *m;
outer_list *p;
p = up;

while(p!=NULL){m=temp=temp2=p->head;
while(temp!=NULL) {
if(strcmp(temp->word,num)==0) {
if(temp==(*head)) {
*head=temp->next;

free(temp);
return;
} else {
m->next=temp->next;

free(temp);
return;
}
} else {
m=temp;
temp= temp->next;
}
}
p=p->next;
}
printf(" ELEMENT %s NOT FOUND ", num);
}

我在这里尝试发送节点并检查 outer_list 元素的所有 inner_lists 并执行删除,但是当第一个元素被删除时它崩溃了。请询问更多信息。我可能会使用非常不整洁的词。

最佳答案

FIX#1(可选)- 初始化所有变量是一个好习惯。请注意,在这种特定情况下,因为您已经处理了 head secanrio 那么您应该没有问题,因为 m 稍后设置为 temp,但仍然..

FIX#2 - 确保在释放节点之前完全删除内部列表。

这是代码(未经测试,抱歉)

void delnode(outer_list *head,char num[100])
{
outer_list *temp, *m;
m=temp=head; /*FIX #1*/
while(temp!=NULL) {
if(strcmp(temp->word,num)==0) {
if(temp==head) {
head=temp->next;
delinner(temp->inner_list); /* FIX#2 */
free(temp);
return;
} else {
m->next=temp->next;
delinner(temp->inner_list); /* FIX#2 */
free(temp);
return;
}
} else {
m=temp;
temp= temp->next;
}
}
printf(" ELEMENT %s NOT FOUND ", num);
}
void delinner(inner_list *head) { /* FIX#2 */
inner_list *temp;
temp=head;
while(temp!=NULL) {
head=temp->next;
free(temp);
temp=head;
}
}

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

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