Удаление элементов из структуры - PullRequest
1 голос
/ 29 марта 2012

У меня следующий связанный список:

struct scoreentry_node {
    struct scoreentry_node *next;
    int score;
    char name[1];    
}
;

typedef struct scoreentry_node *score_entry;

Я пытаюсь написать функцию, которая удаляет все узлы, содержащие определенное имя.Вот что у меня пока есть, но я не уверен, что прав:

score_entry disqualify(score_entry a, char* name)
{
 score_entry tmp = a;
 while (tmp != NULL){
    if (strcmp(tmp->name, name) == 0)
    {
     score_entry trash = tmp; 
     tmp = tmp->next;    
     free(trash);
    }
    else { tmp = tmp->next; }
  }
return a;
}

Это дает мне кучу ошибок .. Есть предложения?

Ответы [ 3 ]

3 голосов
/ 29 марта 2012
score_entry disqualify(score_entry a, char* name)
{
  score_entry new_front = a, tmp;
  // delete "wrong" entries from the front
  while (new_front != NULL){
    if (strcmp(new_front->name, name) == 0)
    {
      score_entry trash = new_front; 
      new_front = new_front->next;    
      free(trash);
    }
    else
    {
      // first list entry is valid
      // delete "wrong" entries from inside the list
      tmp = new_front;
      while ( tmp->next != NULL )
      {
        if ( strcmp(tmp->next->name,name)==0 )
        {
          score_entry trash = tmp->next;
          tmp->next = tmp->next->next;
          free(trash);
        } else
        {
          tmp = tmp->next;
        }
      }
    }
 }
return new_front;
}

Вы также должны получить какую-нибудь книгу, связанную с общими структурами данных - вам кажется, что вы заинтересованы в этом, и это может быть вам очень полезно.

0 голосов
/ 29 марта 2012

Если вы удаляете члена из списка, вы должны устранить этот пробел, связав указатель «next» предыдущей записи со следующей записью. Код ниже делает это. Обратите внимание, что я изменил score_entry, так что typedef больше не содержит указатель - я предпочитаю не маскировать типы. Обратите внимание, что функция возвращает head, который мог бы измениться, если бы мы удалили первую запись в списке.

typedef struct scoreentry_node score_entry;

static score_entry *
disqualify(score_entry *head, const char *name)
{
    score_entry *se = head;
    score_entry *prev = head;

    while (se) {
        if (!strcmp(se->name, name)) {
            score_entry *next = se->next;

            if (head == se) {
                head = next;
            } else {
                prev->next = next;
            }
            free(se);
            se = next;

        } else {
            prev = se;
            se = se->next;
        }
    }
    return head;
}
0 голосов
/ 29 марта 2012

Вы используете strcmp для строки, не заканчивающейся нулем (tmp->name). Я предполагаю, что он не заканчивается нулем, так как он имеет длину 1. Похоже, вы действительно сравниваете символ, а не строку, поэтому простой оператор равенства символов будет правильным решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...