Развернуть двусвязный список си
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <assert.h>
typedef struct Node {
int field;
struct Node* prev;
struct Node* next;
} tNode;
void AddElemEnd(tNode** head, int NewField) {
tNode* Elem;
Elem = malloc(sizeof(tNode)); // Выделяем память под узел , создаем узел
assert(Elem);// Проверяем выделение памяти
Elem->field = NewField; // Присваивание значения узлу
Elem->next = NULL; // Следующий - ноль
if (!*head) {
Elem->prev = NULL;
*head = Elem;
}
else {
tNode* last = *head;
while (last->next != NULL)
last = last->next; // Сдвигаем голову списка
Elem->prev = last;
last->next = Elem;
}
}
void Reverse(tNode **head) {
tNode *curr=*head; //Текущий - голова списка
//tNode *Elem = NULL; // Предыдущий становиться текущим присваиваем значение Elem?
tNode *Elem = curr->prev;
tNode *Neib = curr->next;
while (curr != NULL) { // Пока не дойдем до конца списка
// tNode *Elem = curr->prev;
// tNode *Neib = curr->next;
//Elem = curr->prev;
curr->prev = curr->next; // Меняем ссылки местами (следующий становиться предыдущим)
curr->next = Elem; // Устанавливаем ссылку на следующий
curr = Neib;
curr = curr->prev; // Сдвигаем дальше по списку
}
if (Elem != NULL)
curr = Elem->prev;
}
void FreeMemory(tNode *head) {
while (head) {
tNode *next = head->next;
free(head);
head = next;
}
}
void PrintFunc(tNode *head) {
tNode *p = head;
while (p != NULL) {
printf("%d", p->field);
p = p->next;
}
printf("\n");
}
int main() {
setlocale(LC_ALL, "Russian");
tNode *head = NULL;
int c, d, val, in, ne;
printf("Number of elements\n");
scanf("%d", &d);
for (int i = 0; i < d; i++) {
printf("Input %dth element", i);
scanf("%d", &val);
AddElemEnd(&head, i);
}
Reverse(&head);
PrintFunc(head);
FreeMemory(head);
return 0;
}
Здравствуйте, помогите пожалуйста. Как развернуть двусвязный список?