z_wonderland_ 2023-11-15 19:37 采纳率: 0%
浏览 6

初始化循环链队列好像不会,但编译器没有报错,程序不运行直接结束



#include <stdio.h>
#include <malloc.h>
typedef struct node{
    int data;
    struct node *next;
}QNode;//循环链队列节点的类型

typedef struct{
    QNode *rear;
}LQueue;

LQueue* init_LQueue();//创建并初始化循环链队列
int Empty_LQueue(LQueue *q);//判空
int in_LQueue(LQueue *q,int x);//入队
int out_LQueue(LQueue *q);//出队
int length_LQueue(LQueue *q);//求队列的长度
void print_LQueue(LQueue *q);//输出队列中的所有元素

int main(){
    LQueue *q;
    int x,n,i;

    q = init_LQueue();
    printf("请输入要入队的元素:");
    while((x = getchar()) != '\n'){
        in_LQueue(q,x);
    }
    print_LQueue(q);
    printf("当前队的长度为:%d",length_LQueue(q));

    printf("请输入出队元素的个数:(不得大于%d)",length_LQueue(q));
    fflush(stdin);
    n = getchar();
    for(i = 0;i < n;i++){
        out_LQueue(q);
    }
    print_LQueue(q);
    printf("当前队的长度为:%d",length_LQueue(q));
    return 0;
}
//创建循环链队列
LQueue* init_LQueue(){
    LQueue *q = (LQueue*)malloc(sizeof(LQueue));

    if(q != NULL){
        q->rear->next = q->rear;
    }
    return q;
}
//判空
int Empty_LQueue(LQueue *q){
    if(q->rear->next == NULL)
        return 1;
    else
        return 0;
}
//入队
int in_LQueue(LQueue *q,int x){
    QNode *p;
    p = (QNode*)malloc(sizeof(QNode));

    p->data = x;
    p->next = q->rear->next;
    q->rear->next = p;
    q->rear = p;

    return 1;
}
//出队
int out_LQueue(LQueue *q){
    QNode *p;
    int judge = Empty_LQueue(q);

    if(judge == 1){
        printf("队列已空");
        return 0;
    }
    else{
        p = q->rear->next;
//    *x = p->data;
        q->rear->next = p->next;
        free(p);

        return 1;
    }
}
//求队列长度
int length_LQueue(LQueue *q){
    int length = 0;
    QNode *t;
    t = (QNode*)malloc(sizeof(QNode));
    while(t != q->rear){
        length++;
        t = t->next;
    }
    return length;
}

//输出队列中所有元素
void print_LQueue(LQueue *q){
    QNode *p;
    p = (QNode*)malloc(sizeof(QNode));
    printf("当前队列中所有元素为:\n");
    while(p != q->rear){
        printf("%d ",p->data);
    }
}
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-15 22:52
    关注

    【以下回答由 GPT 生成】

    首先,请注意,你在初始化循环链队列函数 init_LQueue() 中存在一个错误。在 init_LQueue() 函数中,你没有为 q->rear 分配内存空间。这导致了运行时错误。在初始化队列之前,需要先为 q->rear 分配内存空间。你可以通过以下方式修复它:

    LQueue* init_LQueue(){
        LQueue *q = (LQueue*)malloc(sizeof(LQueue));
        if(q != NULL){
            q->rear = (QNode*)malloc(sizeof(QNode));
            q->rear->next = q->rear;
        }
        return q;
    }
    

    另外,你在 main() 函数中读取出队元素个数时使用了 getchar() 函数,这无法读取到多个数字。你可以使用 scanf() 函数来解决这个问题。将 main() 函数中获取 n 的部分修改为以下代码可以实现该功能:

    scanf("%d", &n);
    

    以上是你代码中的错误和需要修改的部分。修复这些错误后,你的代码应该可以正确运行了。下面是完整的修复代码:

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct node{
        int data;
        struct node *next;
    }QNode;//循环链队列节点的类型
    
    typedef struct{
        QNode *rear;
    }LQueue;
    
    LQueue* init_LQueue();//创建并初始化循环链队列
    int Empty_LQueue(LQueue *q);//判空
    int in_LQueue(LQueue *q, int x);//入队
    int out_LQueue(LQueue *q);//出队
    int length_LQueue(LQueue *q);//求队列的长度
    void print_LQueue(LQueue *q);//输出队列中的所有元素
    
    int main(){
        LQueue *q;
        int x, n, i;
    
        q = init_LQueue();
        printf("请输入要入队的元素:");
    
        while((x = getchar()) != '\n'){
           in_LQueue(q,x);
        }
    
        print_LQueue(q);
        printf("当前队的长度为:%d\n",length_LQueue(q));
    
        printf("请输入出队元素的个数:(不得大于%d)",length_LQueue(q));
    
        scanf("%d", &n);
        for(i = 0; i < n; i++){
            out_LQueue(q);
        }
    
        print_LQueue(q);
        printf("当前队的长度为:%d\n",length_LQueue(q));
    
        return 0;
    }
    //创建循环链队列
    LQueue* init_LQueue(){
        LQueue *q = (LQueue*)malloc(sizeof(LQueue));
        if(q != NULL){
            q->rear = (QNode*)malloc(sizeof(QNode));
            q->rear->next = q->rear;
        }
        return q;
    }
    //判空
    int Empty_LQueue(LQueue *q){
        if(q->rear == q->rear->next)
           return 1;
        else
           return 0;   
    }
    //入队
    int in_LQueue(LQueue *q, int x){
        QNode *p = (QNode*)malloc(sizeof(QNode));
        if(p == NULL)
           return 0;
        else{
            p->data = x;
            p->next = q->rear->next;
            q->rear->next = p;
            q->rear = p;
            return 1;
        }
    }
    //出队
    int out_LQueue(LQueue *q){
        if(Empty_LQueue(q))
           return 0;
        else{
            QNode *p = q->rear->next->next;
            q->rear->next->next = p->next;
            if(q->rear == p){
                q->rear = q->rear->next;
            }
            free(p);
            return 1;
        }
    }
    //求队列的长度
    int length_LQueue(LQueue *q){
        int i = 0;
        QNode *p = q->rear->next->next;
        while(p != q->rear->next){
            p = p->next;
            i++;
        }
        return i;
    }
    //输出队列中的所有元素
    void print_LQueue(LQueue *q){
        QNode *p = q->rear->next->next;
        while(p != q->rear->next){
            printf("%d ", p->data);
            p = p->next;
        }
        printf("\n");
    }
    

    这样修改后,你应该可以得到预期的结果了。希望这能帮到你!



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 11月15日

悬赏问题

  • ¥20 Html备忘录页面制作
  • ¥15 黄永刚的晶体塑性子程序中输入的材料参数里的晶体取向参数是什么形式的?
  • ¥20 数学建模来解决我这个问题
  • ¥15 计算机网络ip分片偏移量计算头部是-20还是-40呀
  • ¥15 stc15f2k60s2单片机关于流水灯,时钟,定时器,矩阵键盘等方面的综合问题
  • ¥15 YOLOv8已有一个初步的检测模型,想利用这个模型对新的图片进行自动标注,生成labellmg可以识别的数据,再手动修改。如何操作?
  • ¥30 NIRfast软件使用指导
  • ¥20 matlab仿真问题,求功率谱密度
  • ¥15 求micropython modbus-RTU 从机的代码或库?
  • ¥15 django5安装失败