Название довольно понятно.Вот функция, которую я написал для этой цели:
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;
}
}
Голова и хвост списка являются глобальными, и список строится к тому времени, когда эта функция вызывается, когда голова указывает на первый узел, а хвост указываетдо последнего (чей следующий NULL).Я почти уверен, что мой связанный список составлен правильно, так как я могу напечатать их без ошибок.Иногда эта функция работает отлично, а иногда это приводит к нарушению доступа на линии, отмеченной звездочками.Я знаю, что это не совсем неправильно, так как я получаю нужный результат, когда он не выдает ошибку, хотя я часто получаю ошибку, поэтому я должен что-то пропустить.Заранее благодарю за любую помощь.
РЕДАКТИРОВАТЬ: Вот фиксированный код:
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;
}
}