Как следует из названия. Удаление первого узла в связанном списке работает как шарм. Это те другие узлы 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 после печати узла до того, как он будет удален. Поэтому кажется, что я неправильно привязываю узлы.
Итак, если бы я использовал простые инструкции printf, все в моем списке есть. Однако, если я получаю доступ к нему с помощью функции, такой как – like9orphanz
Пожалуйста, разместите свой полный запрос, чтобы я мог попробовать и помог u – SoulRayder
Я разместил его как отредактировать! – like9orphanz