Название довольно понятное. Вот функция, которую я написал для этой цели:Удаление всех узлов с определенным значением в связанном списке
void wipeLoneCells()
{
cell *tmp;
tail = head;
while (1)
{
if (head == tail && !tail->flag)
{
head = head->next;
free(tail);
tail = head;
continue;
}
tmp = tail->next;
/***/ if (tmp->next == NULL && !tmp->flag)
{
tail->next = NULL;
free(tmp);
break;
}
else if (!tmp->flag)
{
tail->next = tmp->next;
free(tmp);
continue;
}
tail = tail->next;
}
}
голова и хвост в списке являются глобальными, и список построен к тому времени эта функция вызывается с головой, указывая на первый узел и хвост указывает на last (чей следующий NULL). Я почти уверен, что мой связанный список построен правильно, так как я могу печатать их без ошибок. Иногда эта функция работает отлично, и иногда она приводит к нарушению доступа на линии, помеченной звездочками. Я знаю, что это не совсем так, потому что я получаю результат, который я хочу, когда он не вызывает ошибку, хотя я часто получаю ошибку, поэтому я должен упускать из виду. Спасибо заранее за любую помощь.
EDIT: Вот фиксированный код:
void wipeLoneCells()
{
cell *tmp;
tail = head;
while (1)
{
if (head == tail && !tail->flag)
{
head = head->next;
free(tail);
tail = head;
continue;
}
tmp = tail->next;
if (tmp->next == NULL && !tmp->flag)
{
tail->next = NULL;
free(tmp);
break;
}
else if (tmp->next == NULL)
{
tail = tmp;
break;
}
else if (!tmp->flag)
{
tail->next = tmp->next;
free(tmp);
continue;
}
tail = tail->next;
}
}
Можете ли вы показать нам определение для 'cell'? – fge
Проблемы с списком ссылок намного проще решить, если вы используете ручку и бумагу и набираете шаги, которые должны выполняться вручную, и код записи на этой основе. –