从C中的链表中删除节点 [英] Deleting a node from linked list in C

查看:23
本文介绍了从C中的链表中删除节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

My problem is deleting a node from linked list.

我有两个结构:

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的链表.

My problem is in deleting a node from outer_list linked list. For example when user entered aaa to delete, delete function should find the node with outer_list->word = aaa and delete this node and reconnect the list again. I tried the below code to do this. but After finding and deleting I'm losing the list. I don't know what's wrong. Please notice that outer_list have also a linked list of inner_list inside.

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 中删除相同的元素.

Now my problem is updated. While deleting an element from inner list I am also trying the delete the same element from inner_list too.

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

For example: - Let's say aaa is an element of outer_list linked list and let's point it with outer_list *p - This aaa can also be in an inner_list linked list too. (it can be in p->head or another innerlist.) Now, the tricky part again. I tried to apply the same rules with outer_list deletion but whenever i delete the head element of inner_list it gives an error. Here is what I tried:

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并执行删除但是当第一个元素被删除时它会崩溃.请询问更多信息.我可能会用很乱的词.

Here i'm trying to send the node and checking all the inner_lists of outer_list elements and perform deletion however when the first element is deleted it crashes. Please ask for further information. I might use very untidy words.

推荐答案

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

FIX#1 (optional) - it is a good practice to initialize all variables. note that in this specific case since you have handles the head secanrio then you should not have a problem becuase m is set to temp later on, but still..

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

FIX#2 - make sure you delete the inner list completely before you free a node.

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

Here is the code (untested, sorry)

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中的链表中删除节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆