rsZheng4916 2022-01-01 11:47 采纳率: 60%
浏览 56

双循环链表的打印问题


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

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

/**
 * @brief 初始化头结点head
 * prior和next都指向自身,形成一个空表
 * @return DuLinkList 空的带头结点的双向循环链表
 */
DuLinkList InitDuList(){
    DuLinkList L = (DuLinkList)malloc(sizeof(DuLNode));
    if(L == NULL){
        printf("---Init failure---\n");
        exit(1);
    }
    L->prior = L;
    L->next = L;
    printf("---Init success---\n");
    return L;
}

void InsertLisit(DuLinkList L,int len){
    DuLinkList p = L;
    for(int i = 0;i < len;i++){
        DuLinkList temp = (DuLinkList)malloc(sizeof(DuLNode));
        temp->data = i;
        // 建立跟双向循环链表的关系
        p->next = temp;
        temp->prior = p;
        p->prior = temp;
        temp->next = p;
        printf("%d- ",temp->data);
        temp = temp->next;
    }
    printf("\n");
}

/**
 * @brief 头插法插入结点
 * @param L 双循环链表
 * @param data 结点数据
 */
void InsertByHead(DuLinkList L,int data){
    // DuLinkList node = CreatNode(data);
    DuLinkList node = (DuLinkList)malloc(sizeof(DuLNode));
    node->data = data;
    node->prior = L;
    node->next = L->next;
    L->next->prior = node;
    L->next = node;
}

void Display(DuLinkList L){
    DuLinkList p = L;
    if(p->next == L)
        printf("Display: 双向循环链表为空!\n");
    else{
        printf("Display: ");
        while(p->next != L){
            p = p->next;
            printf("%d ",p->data);
        }
        printf("\n");
    }
}

int main(){
    DuLinkList L = InitDuList();
    InsertLisit(L,5);
    // for(int i = 0;i < 5;i++){
    //     InsertByHead(L,i);
    // }
    Display(L);
}

按照当前代码打印的话会出现只打印出一个字,不知道这个InsertList的方法搭配Display为什么会出现这个问题?

img

然后如果注释了InsertList的方法改用InsertByHead的方法循环插入,搭配Display却可以正常打印,求解答!

img

  • 写回答

2条回答 默认 最新

  • a5156520 2022-01-01 12:24
    关注

    我在Dev-C++ 里面,调试你的代码,编译报错了,发现是malloc应该使用指针来存放他的返回值,修改后,运行通过了:

    
     
    #include<stdio.h>
    #include<stdlib.h>
    typedef int ElemType;
    typedef struct DuLinkList{
        ElemType data;
        struct DuLinkList *prior;
        struct DuLinkList *next;
    } DuLNode;
    /**
     * @brief 初始化头结点head
     * prior和next都指向自身,形成一个空表
     * @return DuLinkList 空的带头结点的双向循环链表
     */
    DuLinkList * InitDuList(){
        DuLinkList * L = (DuLinkList *)malloc(sizeof(DuLNode));
        if(L == NULL){
            printf("---Init failure---\n");
            exit(1);
        }
        L->prior = L;
        L->next = L;
        printf("---Init success---\n");
        return L;
    }
    void InsertLisit(DuLinkList * L,int len){
        DuLinkList * p = L;
        for(int i = 0;i < len;i++){
            DuLinkList * temp = (DuLinkList *)malloc(sizeof(DuLNode));
            temp->data = i;
            // 建立跟双向循环链表的关系
            p->next = temp;
            temp->prior = p;
            p->prior = temp;
            temp->next = p;
            printf("%d- ",temp->data);
            temp = temp->next;
        }
        printf("\n");
    }
    /**
     * @brief 头插法插入结点
     * @param L 双循环链表
     * @param data 结点数据
     */
    void InsertByHead(DuLinkList * L,int data){
        // DuLinkList node = CreatNode(data);
        DuLinkList * node = (DuLinkList *)malloc(sizeof(DuLNode));
        node->data = data;
        node->prior = L;
        node->next = L->next;
        L->next->prior = node;
        L->next = node;
    }
    void Display(DuLinkList * L){
        DuLinkList * p = L;
        if(p->next == L)
            printf("Display: 双向循环链表为空!\n");
        else{
            printf("Display: ");
            while(p->next != L){
                p = p->next;
                printf("%d ",p->data);
            }
            printf("\n");
        }
    }
    int main(){
        DuLinkList * L = InitDuList();
       // InsertLisit(L,5);
         for(int i = 0;i < 5;i++){
             InsertByHead(L,i);
         }
        Display(L);
    }
    
    评论

报告相同问题?

问题事件

  • 创建了问题 1月1日

悬赏问题

  • ¥15 MATLAB动图的问题
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名