在C中的链表中删除后显示

时间:2010-05-17 15:44:27

标签: c 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;
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;
    }
}
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);
}
void print_node(outer_list *parent_node) 
{ 


 while(parent_node!=NULL){
 printf("%s\t%d\t", parent_node->word, parent_node->count);

    inner_list *child_node = parent_node->head;
 printf("list: ");
 if(child_node ==NULL){printf("BUARADA");}

 while (child_node != NULL) {
  printf("%s-%d", child_node->word,child_node->count);

        child_node = child_node->next;

        if (child_node != NULL) {
            printf("->");
        }
 }
    printf("\n");
 parent_node = parent_node->next;
 }
}

从外部列表中删除元素时,我也尝试从inner_list中删除相同的元素。

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

编辑: 实际上,如果删除了outer_list节点,则应删除其内部的inner_list链表。这就是使用delinner方法的原因。

例如:

outer     inner
aaa       bb->cc
bb        aaa->cc

when i wanted to delete "aaa" The result should be:
outer     inner
bb         cc 

1 个答案:

答案 0 :(得分:1)

inner_list **head的{​​{1}}参数是多少?我假设delnode()是外部列表节点,您要从其内部列表中删除包含up中给出的字符串的节点。 num只是不适合这张照片。而且你似乎还没有正确使用它。我重写了一下这个函数,省略了参数,改变了注释行,并给出了更有意义的名字:

head

请注意,void del_inner_node(outer_list *up, char num[100]) { inner_list *temp, *m; outer_list *p; p = up; while (p != NULL) { m = temp = p->head; while(temp!=NULL) { if(strcmp(temp->word,num)==0) { if(temp==p->head) { // refer to p->head p->head=temp->next; // refer to p->head 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); } 未使用,因此我将其删除。

现在,在您的代码中,没有对temp2delnode2)的调用。如果在当前外部节点中找不到搜索到的字符串,您实际上可以在del_inner_node内调用它:

delnode

通过这种方式,您可以通过一次调用删除包含“aaa”的所有节点:

void del_all_nodes(outer_list **head,char num[100])//thanks to both Nir Levy and Jeremy P.
{
    ...
    while(temp!=NULL) {
        if(strcmp(temp->word,num)==0) {
            ...
        } else {
            del_inner_node(temp,num);
            m=temp;
            temp= temp->next;
        }
    }
    ...
}