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

查看:232
本文介绍了从用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 删除,删除功能应该找到outer_list-&GT的节点;字= AAA并删除此节点,并重新连接列表再次。我想下面的code做到这一点。但要找到并删除后,我失去了名单。我不知道什么是错。请注意,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->头或其他innerlist。)现在,棘手的部分一次。我试图用outer_list删除,但每当我删除inner_list它给出了一个错误的头元素的运用相同的规则。
这里是我的尝试:

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设定为临时以后,你应该不会有问题,但仍..

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.

下面是code(未经测试,对不起)

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天全站免登陆