Mostra dopo la cancellazione nella lista collegata in C

In realtà questo era un altro problema, ma è cambiato così ho deciso di aprire una nuova domanda.

Il mio codice è

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

Durante l’eliminazione di un elemento dalla lista esterna, sto anche provando a eliminare lo stesso elemento anche da inner_list.

Ad esempio: – Diciamo che aaa è un elemento della lista collegata outer_list e lo puntiamo con outer_list * p – Questo aaa può anche trovarsi in una lista collegata inner_list. (può essere in p-> head o in un’altra innerlist.) Ora, la parte difficile di nuovo. Ho provato ad applicare le stesse regole con la cancellazione di outer_list ma ogni volta che cancello l’elemento head di inner_list dà un errore. Dov’è la cosa sbagliata in print_node o delnode2?

Modifica: in realtà se un nodo outer_list cancellato l’elenco collegato di inner_list all’interno di esso dovrebbe essere rimosso anche. Questo è il motivo per cui è stato usato il metodo delinner.

Per esempio:

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

Qual è il parametro inner_list **head delnode() di delnode() ? Suppongo che up sia il nodo della lista esterna, dalla cui lista interna si voglia rimuovere il nodo contenente la stringa data in num . head non si adatta a questa immagine. E comunque non sembra che tu lo stia usando correttamente. Ho riscritto la funzione un po ‘, omettendo il parametro, cambiando le righe commentate e dando nomi più significativi:

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

Nota che temp2 non è usato, quindi l’ho rimosso.

Ora, nel tuo codice non vi è alcuna chiamata a delnode2 ( del_inner_node ). Si potrebbe effettivamente chiamarlo all’interno del delnode , nel caso in cui la stringa cercata non è stata trovata nel nodo esterno corrente:

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

In questo modo puoi rimuovere tutti i nodes contenenti “aaa” con una sola chiamata:

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