Мне нужно написать функцию, чтобы перевернуть двойной связанный список, чтобы хвост стал головой.Обратный двойной связанный список
Например, элементы перед: {(1,1), (1,2), (2,2), (2,3)}
после: {(2,3) , (2,2), (1,2), (1,1)}
Вот структура:
struct snake {
unsigned int i;
unsigned int j;
struct snake *next;
struct snake *prev;
};
Это функция prototipe я должен использовать:
void snake_reverse(struct snake **s);
я пытался что-то вроде этого и несколько других попыток
void snake_reverse(struct snake **s) {
struct snake *last, *tmp = NULL;
last = *s;
while (last != NULL)
{
tmp = last->prev;
last->prev = last->next;
last->next = tmp;
last = last->prev;
}
if(tmp != NULL)
*s = tmp->prev;
}
попытался Также это:
while (last != NULL)
{
tmp = last->next;
last->next = last->prev;
last->prev = tmp;
last = tmp;
}
if(tmp != NULL)
*s = tmp;
, но он не работает. Я почти уверен, что не ошибаюсь. Первый -> prev из списка NULL, последний -> следующий из списка - NULL.
У меня нет ошибок или сбоев, но задача функции состоит в том, чтобы инвертировать направление змеи путем изменения всех элементов и изменения главы списка. Можете ли вы сказать, что здесь не так?
EDIT: Проблема была в другом модуле программы, которую я не сделал.
В любом случае лучшим решением является решение kmkaplan. Спасибо всем
Когда вы описываете проблему, вы не можете просто сказать «она не работает»; лучше, если вы более точны: вот что я сделал, ожидаемый результат - X, но у меня есть Y (альтернативно: есть сбой с сообщением об ошибке Z). Возможно, настоящая ошибка заключается в том, как вы проверяете свою функцию. – coredump
См. Также 'last = last-> prev': было бы целесообразно иметь' last = tmp' вместо этого? – coredump
@coredump извините, если я не могу быть более конкретным, но эта функция используется как модуль в программе, и я не могу контролировать остальную часть программы. Во всяком случае, я не получаю ошибок или сбоев, но задача функций состоит в том, чтобы инвертировать направление змеи, изменяя все элементы и меняя головку списка. last-> prev имеет адрес последней и следующей причины, по которым мы их переключили. tmp имеет последний-> пред.Так что они разные – RUsl