Gee. 2022-06-13 21:45 采纳率: 53.3%
浏览 29
已结题

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

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

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

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

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

1条回答 默认 最新

  • qzjhjxj 2022-06-13 23:04
    关注

    修改处见注释,供参考:

    #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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 6月22日
  • 已采纳回答 6月14日
  • 创建了问题 6月13日

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!