将双向循环链表逆置失败,多次尝试找bug都失败

1,代码是用c语言写的双向链表。
2代码介绍: DuLNode结构体定义,InistListF_DuL初始化表,CreatListF_DuL建立双链表,TraverseF_DuL,输出表中元素, CreatListF2_DuL逆置双链表。
5尝试解决的方法:对照教材代码,确定代码没有写错,再尝试把函数CreatListF2_DuL这个函数没有被执行到,bug确定在这个函数里。

img

3期待结果:1 2 3
3 2 1
4实际结果:1 2 3

#include<stdio.h>
#include<stdlib.h>
#define ElemType int
typedef struct DuLNode
{
    ElemType data;
    struct DuLNode* prior;
    struct DuLNode* next;

}dlinklist;
void InistListF_DuL(dlinklist* L)
{
    L->prior = L->next = NULL;
}
void CreatListF_DuL(dlinklist* L, ElemType a[], int n) {
    dlinklist* s,*r;
    int i;
    L->prior = L->next = NULL;
    r = L;
    for (i = 0; i < n; i++) {
        s = (dlinklist*)malloc(sizeof(dlinklist));
        if (s == NULL)
            return 0;
        s->data = a[i];
        r->next = s;
        s->prior = r;
        r = s;
    }
    r->next = NULL;
}
void TraverseF_DuL(dlinklist* L) {
    dlinklist* p = L;
    if (p == NULL)
        return 0;
    while (p->next != L && p->next != NULL) {
        printf("%d\t", p->next->data);
        p = p->next;
    }
}
int CreatListF2_DuL(dlinklist* L) {
    dlinklist* q,*p;
    if (L == NULL)
        return 0;
    q = L->next;
    while (q != L) {
        p = q->next;
        q->next = q->prior;
        q->prior = p;
        q = p;
    }
    q = L->next;
    L->next = L->prior;
    L->prior = q;
    p = q;
    return 1;
    
}
int main() {
    dlinklist* L = (dlinklist*)malloc(sizeof(dlinklist));
    InistListF_DuL(L);
    if (L == NULL)
        return 0;
    int a[3] = { 1,2,3 };
    CreatListF_DuL(L, a, 3);
    TraverseF_DuL(L);
    CreatListF2_DuL(L);
    TraverseF_DuL(L);
}



根据您的代码和问题描述,您希望在双向链表的基础上实现链表的逆置,并且发现输出的结果不是预期的。经过简单的代码检查,发现 CreatListF2_DuL 函数的逆置代码是正确的,可能是因为链表初始化时未正确处理头结点的问题导致输出结果不正确。因此,您可以尝试修改以下两处代码:

在 InistListF_DuL 函数中,将头结点的初始化修改为:

Copy code
void InistListF_DuL(dlinklist* L)
{
    L->prior = L->next = L;
}

这样可以保证链表的头结点正确初始化。

在 CreatListF_DuL 函数中,将链表节点的插入修改为:

Copy code
r->next = s;
s->prior = r;
r = s;

这样可以确保新节点 s 的前驱节点正确连接到 r,同时也可以避免遍历链表时出现 NULL 指针的情况。

修改后的完整代码如下:

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

#define ElemType int

typedef struct DuLNode
{
    ElemType data;
    struct DuLNode* prior;
    struct DuLNode* next;
} dlinklist;

void InistListF_DuL(dlinklist* L)
{
    L->prior = L->next = L;
}

void CreatListF_DuL(dlinklist* L, ElemType a[], int n)
{
    dlinklist* s, * r;
    int i;
    r = L;
    for (i = 0; i < n; i++) {
        s = (dlinklist*)malloc(sizeof(dlinklist));
        if (s == NULL)
            return;
        s->data = a[i];
        r->next = s;
        s->prior = r;
        r = s;
    }
    r->next = L;
    L->prior = r;
}

void TraverseF_DuL(dlinklist* L)
{
    dlinklist* p = L->next;
    while (p != L) {
        printf("%d\t", p->data);
        p = p->next;
    }
    printf("\n");
}

int CreatListF2_DuL(dlinklist* L)
{
    dlinklist* q, * p;
    if (L == NULL)
        return 0;
    q = L->next;
    while (q != L) {
        p = q->next;
        q->next = q->prior;
        q->prior = p;
        q = p;
    }
    q = L->next;
    L->next = L->prior;
    L->prior = q;
    p = q;
    return 1;
}

int main()
{
    dlinklist* L = (dlinklist*)malloc(sizeof(dlinklist));
    InistListF_DuL(L);
    int a[3] = { 1, 2, 3 };
    CreatListF_DuL(L, a, 3);
    TraverseF_DuL(L);
    CreatListF2_DuL(L);
    TraverseF_DuL(L);
    return 0;
}