2301_78618908 2023-10-23 23:17 采纳率: 12.5%
浏览 5

链队的入队出队,但是我这个代码运行之后没有输入输出,怎么办😱(

链队的入队出队,但是我这个代码运行之后没有输入输出,怎么办😱
以下是代码





#include<stdio.h>
#include<stdlib.h>
typedef struct Qnode{
    int data;
    struct Qnode *next;
}Qnodetype;
typedef struct{
    Qnodetype *font;
    Qnodetype *rear;
}Lqueue;
int initiate(Lqueue *q){
    if((q->font=(Qnodetype*)malloc(sizeof(Qnodetype)))==NULL)
    return -1;
    q->font=q->rear;
    q->font->next=NULL;
    return 1;
}
int append(Lqueue *q,int x){
    Qnodetype*p;
    p->data=x;
    p->next=NULL;
    q->rear->next=p;
    q->rear=p;
    return 1;
}
int  Ldelete(Lqueue *q){
     int x;
    Qnodetype*p;
    if(q->font==q->rear)
    return NULL;
    p=q->font->next;
    q->font->next=p->next;
    x=p->data;
    free(p);
    return x;
}
int main(){
    Lqueue q;
    initiate(&q);
    int i,x,j;
    i=0;
    for(i=0;i<6;i++){
        scanf("%d",&x);
        append(&q, x);
    }
    for(j=0;j<6;j++){
        Ldelete(&q);
        int m=Ldelete(&q);
        printf("%d",m) ;
    }
    return 0;
}
  • 写回答

2条回答 默认 最新

  • 酷爱码 2023-10-24 01:32
    关注

    首先,在 initiate 函数中,你错误地将队列的 font 和 rear 指针指向同一个动态分配的节点。这会导致后续操作出错。正确的做法是初始化时让 font 和 rear 都指向 NULL,表示队列为空。

    其次,在 append 函数中,你没有为新节点 p 分配内存空间,而直接使用了一个未初始化的指针 p,这也会导致程序崩溃。正确的做法是在插入新节点前,为 p 分配内存空间:p = (Qnodetype*)malloc(sizeof(Qnodetype))。

    最后,在 Ldelete 函数中,当队列为空时,应该返回一个特定的值来表示出队失败,例如 INT_MIN。同时,在执行完出队操作后,你没有更新队列的 rear 指针,这会导致下一次入队操作出错。正确的做法是在出队操作成功后,更新 rear 指针:q->rear = q->font。

    下面是修改后的代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <limits.h>
    
    typedef struct Qnode {
        int data;
        struct Qnode* next;
    } Qnodetype;
    
    typedef struct {
        Qnodetype* front;
        Qnodetype* rear;
    } Lqueue;
    
    int initiate(Lqueue* q) {
        q->front = NULL;
        q->rear = NULL;
        return 1;
    }
    
    int append(Lqueue* q, int x) {
        Qnodetype* p = (Qnodetype*)malloc(sizeof(Qnodetype));
        if (p == NULL)
            return -1;
        p->data = x;
        p->next = NULL;
        if (q->front == NULL) {
            q->front = p;
            q->rear = p;
        } else {
            q->rear->next = p;
            q->rear = p;
        }
        return 1;
    }
    
    int Ldelete(Lqueue* q) {
        if (q->front == NULL)
            return INT_MIN;
        Qnodetype* p = q->front;
        q->front = p->next;
        int x = p->data;
        free(p);
        if (q->front == NULL)
            q->rear = NULL;
        return x;
    }
    
    int main() {
        Lqueue q;
        initiate(&q);
        int i, x, j;
        for (i = 0; i < 6; i++) {
            scanf("%d", &x);
            append(&q, x);
        }
        for (j = 0; j < 6; j++) {
            int m = Ldelete(&q);
            printf("%d ", m);
        }
        return 0;
    }
    

    现在你应该能够正确输入和输出队列中的数据了。

    评论

报告相同问题?

问题事件

  • 创建了问题 10月23日

悬赏问题

  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥20 spring boot集成mqtt的使用问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络
  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥30 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入
  • ¥15 mmo能不能做客户端怪物