2014-10-11 2 views
0

Как следует из названия. Удаление первого узла в связанном списке работает как шарм. Это те другие узлы dang! Хорошо, вот мой код. Я думаю, что правильно удаляю, но я не правильно связываюсь.Как удалить узел в связанном списке, основываясь на строке

Вот что и определение типов Структура выглядеть следующим образом:

typedef struct List *ListP; 
typedef struct Entry *EntryP; 
typedef char *ListItemP; 

struct List 
{ 
    int sizeL; 
    struct Entry *head; 
}; 

struct Entry 
{ 
    ListItemP content; 
    struct Entry *next; 
    int sizeL; 
}; 

То, как функция removeItemList работает в main.c есть это передавая указатель списка (ListP thisList) и строку (ListItemP thisItem) , После того, как параметры переданы, функция ищет ту же строку, что и узел в списке (через strcmp()), и когда она находит ее, она удаляет ее. NewEntry initialized Entry struct и имеет вход, который передает символ в newEntry-> content. В любом случае, вот эта функция:

void removeItemList(ListP thisList, ListItemP thisItem) 
{ 
    EntryP temp = newEntry(0x00); 
    EntryP temp2 = newEntry(0x00); 

    temp->next = thisList->head; 
    temp2->next = thisList->head; 
    if (strcmp(temp->next->content, thisItem) == 0) 
    { 
     thisList->head = temp->next->next; 
    } 
    else { 
     while(temp->next != 0x00) 
     { 
      if(strcmp(temp->next->content,thisItem) == 0) { 
       break; 
      } 
      temp->next = temp->next->next; 
      temp->sizeL++; 
     } 
     if (temp->next == 0x00) { 
     } 
     else { 
      int i = 0; 
      for(i = 0; i < temp->sizeL - 1 ; i++) 
      { 
       temp2->next = temp2->next->next; 
       printf("%s \n", temp2->content); 
      } 
      temp2->next = temp->next->next; 
      free(temp2->next); 
     } 
    } 
    thisList->sizeL--; 
} 

Я думаю, что узел перед удаляемым узлом завершается, указывая на нуль. Однако мне трудно понять, как это исправить. Наверное, поэтому я здесь! Все будет очень признательно, спасибо вам большое!

EDIT: ОБНОВЛЕНО CODE, PLUS Diplay СПИСОК КОД

Обновлено removeItemList()

void removeItemList(ListP thisList, ListItemP thisItem) 
{ 
    EntryP current = newEntry(0x00); 
    EntryP prev = newEntry(0x00); 

    prev = 0x00; 
    current = thisList->head; 

    if (strcmp(current->content, thisItem) == 0) 
    { 
     thisList->head = current->next->next; 
    } 
    else { 

     while (current->next != 0x00) 
     { 
      prev = current; 
      current = current->next; 
      if (strcmp(current->content, thisItem) == 0) 
      { 
       prev->next = current->next; 
       free(current); 
      } 
     } 
    } 
} 

DisplayList():

void displayList(ListP thisList) 
{ 
    EntryP temp = newEntry(0x00); 
    temp->next = thisList->head; 
    while(temp->next != 0x00) 
    { 
     printf("%s \n", temp->next->content); 
     temp->next = temp->next->next; 
    } 
    free(temp); 
} 

Если бы я просто использовать Е() заявления, Я могу получить доступ ко всему просто, и узел кажется удаленным. Однако, если я пытаюсь напечатать их с помощью displayList(), я получаю segfault после печати узла до того, как он будет удален. Поэтому кажется, что я неправильно привязываю узлы.

ответ

1

Для удаления любых промежуточных узлов поддерживайте два указателя на список, prev и cur. Инициализируйте prev до null и cur к заголовку списка. Теперь перейдите в список до тех пор, пока не встретите удаляемый узел. Прежде чем перейти к следующему узлу в анализе, переназначьте prev на cur и cur для следующего. Когда требуемый узел достигнут, сделать

prev->next = cur->next; 
free(cur); 

return;// If necessary. 

Всего псевдокода:

prev = null; 
cur = list->head; 

while(cur!=null) 
{ 
    if(//This is the node to be deleted) 
    { 
     prev->next = cur->next; 
     free(cur); 
     return; 
    } 

    prev = cur; 
    cur = cur->next; 

} 
//Node not found case 

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

UPDATE: Я заметил несколько ошибок в вашей функции DisplayList(). Почему вы анализируете с помощью temp-> next во время обхода? Для меня это похоже на окольный способ. Просто проанализируйте с помощью temp.

void displayList(ListP thisList) 
{ 
    EntryP temp = thisList->head; 
    while(temp!= 0x00) 
    { 
     printf("%s \n", temp->content); 
     temp = temp->next; 
    } 
} 

И почему вы освободили временный узел во время отображения списка? Если вы просто хотите отобразить содержимое списка, освобождение узла не имеет смысла. мне.

+0

Итак, если бы я использовал простые инструкции printf, все в моем списке есть. Однако, если я получаю доступ к нему с помощью функции, такой как – like9orphanz

+0

Пожалуйста, разместите свой полный запрос, чтобы я мог попробовать и помог u – SoulRayder

+0

Я разместил его как отредактировать! – like9orphanz

Смежные вопросы