2010-05-17 7 views
3

En fait, c'était un autre problème mais cela a changé, j'ai donc décidé d'ouvrir une nouvelle question.Affichage après la suppression dans la liste chaînée en C

Mon code est

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; 
} 
} 

Lors de la suppression d'un élément de la liste extérieure Je tente aussi de supprimer le même élément de inner_list aussi. Par exemple: - Disons que aaa est un élément de la liste chaînée outer_list et pointons-la avec outer_list * p - Cette aaa peut aussi être dans une liste liée à inner_list. (Il peut être dans p-> head ou une autre liste intérieure.) Maintenant, la partie délicate à nouveau. J'ai essayé d'appliquer les mêmes règles avec la suppression de outer_list mais chaque fois que je supprime l'élément head de inner_list cela donne une erreur. Où est la mauvaise chose dans print_node ou delnode2?

Éditer: En fait, si un noeud outer_list est supprimé, la liste chaînée de inner_list à l'intérieur de celui-ci doit également être supprimée. C'est pourquoi la méthode delinner est utilisée.

Par exemple:

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

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

Quelle est exactement l'erreur que vous obtenez? –

+0

bien la suppression est si l'élément à supprimer n'est pas la tête de innerlist. quand je voulais supprimer le premier élément, il donne une erreur lors de l'affichage. Il peut être un problème dans delnode2 peut-être qu'il ne peut pas complètement supprimer le nœud ou la fonction print_node a un problème – LuckySlevin

Répondre

1

Quel est le paramètre inner_list **head de delnode()? Je suppose que up est le nœud de liste externe, à partir de la liste interne duquel vous voulez supprimer le nœud contenant la chaîne donnée en num. head ne rentre pas dans cette image. Et vous ne semblez pas l'utiliser correctement de toute façon. Je réécris la fonction un peu, en omettant le paramètre, changer les lignes de commentaires et de donner des noms plus significatifs:

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); 
} 

Notez que temp2 n'est pas utilisé, donc je l'ai enlevé. Maintenant, dans votre code, il n'y a pas d'appel à delnode2 (del_inner_node). Vous pouvez effectivement l'appeler au sein delnode, dans le cas où la chaîne recherchée n'a pas été trouvée dans le noeud externe actuel:

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; 
     } 
    } 
    ... 
} 

De cette façon, vous pouvez supprimer tous les noeuds contenant « aaa » avec un seul appel:

outer_list *head; 
// set up the lists 
del_all_nodes(&head, "aaa"); 
+0

Merci beaucoup. Tu m'as sauvé de beaucoup de codes mais en combinant deux choses. Merci. – LuckySlevin