双链表转置(倒置)不起作用,是什么原因?要怎么改比较好?

问题遇到的现象和发生背景

双链表转置(倒置)不起作用

img

问题相关代码,请勿粘贴截图

#include<stdio.h>
#include<stdlib.h>

typedef struct DuLNode {
int data;
struct DuLNode* prior, * next;
}DuLNode, * DuLinklist;

//头插法建立双向链表
void CreteHeadList(DuLinklist* L, int n) {
DuLinklist p, r;
(L) = (DuLNode)malloc(sizeof(DuLNode));
(*L)->next = NULL;
(*L)->prior = NULL;
r = (*L);
int i = 0;
for (i = 0; i < n; i++) {
p = (DuLNode*)malloc(sizeof(DuLNode));
p->data = i;
if (r->next == NULL) {//插入第一个节点时与其他方法不一样
r->next = p;
p->prior = r;
p->next = NULL;
}
else {
p->next = r->next;
r->next->prior = p;
r->next = p;
p->prior = r;
}
}
}

void Reserve(DuLinklist*L)
{
DuLinklist p, q;
p = (*L);
(*L)->next= NULL;
(*L)->prior = NULL;
while (p->next != NULL) {
if ((*L)->next = NULL) {
q = p;
p = p->next;
(*L)->next = q;
q->prior = (*L);
q->next = NULL;
}
else {
q = p;
p = p->next;
q->next = (*L)->next;
(*L)->next->prior = q;
(*L)->next = q;
}
}
}

void TraverseList(DuLinklist* L) {
DuLinklist p;
p = (*L);
while (p->next != NULL) {
printf("%2d", p->next->data);
p = p->next;
}
}
int main()
{

DuLinklist La;
CreteHeadList(&La, 5);
TraverseList(&La);
Reserve(&La);
TraverseList(&La);
return 0;

}

运行结果及报错内容

img

我的解答思路和尝试过的方法
我想要达到的结果

修改处见注释,供参考:

#include<stdio.h>
#include<stdlib.h>

typedef struct DuLNode {
    int data;
    struct DuLNode* prior, * next;
}DuLNode, * DuLinklist;

//头插法建立双向链表
void CreteHeadList(DuLinklist* L, int n) {
    DuLinklist p, r;
    (*L) = (DuLNode*)malloc(sizeof(DuLNode));
    (*L)->next = NULL;
    (*L)->prior = NULL;
    r = (*L);
    int i = 0;
    for (i = 0; i < n; i++) {
        p = (DuLNode*)malloc(sizeof(DuLNode));
        p->data = i;
        if (r->next == NULL) {//插入第一个节点时与其他方法不一样
            r->next = p;
            p->prior = r;
            p->next = NULL;
        }
        else {
            p->next = r->next;
            r->next->prior = p;
            r->next = p;
            p->prior = r;
        }
    }
}

void Reserve(DuLinklist* L)
{
    DuLinklist p, q;
    p = (*L);
    (*L)->next= NULL;
    (*L)->prior = NULL;
    while (p->next != NULL) {
          if ((*L)->next = NULL) {
              q = p;
              p = p->next;
              (*L)->next = q;
              q->prior = (*L);
              q->next = NULL;
          }
          else {
              q = p;
              p = p->next;
              q->next = (*L)->next;
              (*L)->next->prior = q;
              (*L)->next = q;
          }
    }
}
//带头结点的双向链表的就地逆置   修改
void invert(DuLinklist* L)
{
    DuLinklist q;
    DuLinklist p = (*L)->next;
    (*L)->next = NULL;
    while (p != NULL)
    {
        q = p->next;
        p->next = (*L)->next;
        p->prior = q;
        (*L)->next = p;
        p = q;
    }
}
void TraverseList(DuLinklist* L) {
    DuLinklist p;
    p = (*L);
    while (p->next != NULL) {
          printf("%2d", p->next->data);
          p = p->next;
    }
    printf("\n");
}
int main()
{
    DuLinklist La;
    CreteHeadList(&La, 5);
    TraverseList(&La);
    //Reserve(&La); //修改
    invert(&La);    //修改
    TraverseList(&La);
    return 0;
}

img