Показать после удаления в связанном списке в C - PullRequest
3 голосов
/ 17 мая 2010

На самом деле это была другая проблема, но она изменилась, поэтому я решил открыть новый вопрос.

Мой код

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 - это элемент связанного списка external_list, и давайте отметим его с external_list * p - Этот aaa также может быть в списке внутренних ссылок. (это может быть в p-> head или другом внутреннем списке.) Теперь снова сложная часть. Я пытался применить те же правила с удалением external_list, но всякий раз, когда я удаляю элемент head из inner_list, он выдает ошибку. Где неправильная вещь в print_node или delnode2?

Edit: на самом деле, если это узел external_list удалил связанный список inner_list внутри него, его тоже нужно удалить. Вот почему метод Делиннер используется.

Например:

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

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

1 Ответ

1 голос
/ 17 мая 2010

Что такое inner_list **head параметр 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);
}

Обратите внимание, что temp2 не используется, поэтому я удалил его.

Теперь в вашем коде нет вызова на delnode2 (del_inner_node). Вы можете вызвать его в delnode, если искомая строка не найдена в текущем внешнем узле:

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

Таким образом, вы можете удалить все узлы, содержащие «aaa», одним вызовом:

outer_list *head;
// set up the lists
del_all_nodes(&head, "aaa");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...