小白Vayne 2022-10-09 21:54 采纳率: 33.3%
浏览 30
已结题

单循环链表表示队列,出队操作会出错

#include "stdio.h"
#include "malloc.h"
typedef int DataType;
typedef struct node
{
    DataType data;
    struct node *next;
}linklistq;
typedef struct
{
    linklistq *rear,*front;
}linkqueue;
linkqueue *Initqueue()
{
    linklistq *p = (linklistq *)malloc(sizeof(linklistq));
    linkqueue *q = (linkqueue *)malloc(sizeof(linkqueue));
    q->front = p;
    q->rear = p;
    return q;
}
int emptyqueue(linkqueue *q)
{
    if(q->rear = q->front){return 1;}
    else{return 0;}
}
int inqueue (linkqueue *q,DataType x)
{
    linklistq *p =  (linklistq *)malloc(sizeof(linklistq));
    p->data = x;
    p->next = NULL;
    q->rear->next = p;
    q->rear = p;
}
int dequeue(linkqueue *q,DataType *x)
{
    linklistq *p;
    if(emptyqueue(q))
    {
        printf("队空,不能出队\n");
        return 0;
    }
    else 
    {
        p = q->front->next;
        *x = p->data;
        q->front->next = p->next;
        if(p->next == NULL)
        {
            q->rear = q->front;
        }
        free(p);
        return 1;
    }
}
void showqueue(linkqueue *q)
{
    
    linklistq *p = q->front->next;//有头指针 
    if(p == NULL)
    {
        printf("队列为空");
    }
    else
    {
        printf("队列中的元素依次为:");
        while(p != NULL)
        {
            printf("%5d",p->data);
            p = p->next;
        }
    }
}
int menuqueue()
{  int n;
       printf("\n               队列子系统");
       printf("\n==========================================");
       printf("\n |          1-初始化队列                 |");
       printf("\n |          2-入队操作                   |");
       printf("\n |          3-出队操作                   |");
       printf("\n |          4-遍历操作                   |");
       printf("\n |          0-退出                       |"); 
       do
       { printf("\n\t\t please number 0---4 select:");
          scanf("%d",&n);
       } while((n<0)||(n>4));
       return n;
}
int main()
{
    DataType x;
    linkqueue *q;
    int i,n,flag;
    int kk;
    do
    {
        kk = menuqueue();
        switch(kk)
        {
            case 1:
                q = Initqueue();
                printf("队列的初始化完成!");
                break;
            case 2:
                printf("请输入要入队的元素个数:");
                scanf("%d",&n);
                printf("请输入%d个整数进行入队:",n);
                for(i = 0;i<n;i++){
                    scanf("%d",&x);
                    inqueue(q,x);
                }
                printf("入队操作完成!");
                break;
            case 3:
                printf("请输入要出队的元素个数:");
                scanf("%d",&n);
                printf("出队的元素顺序依次为:");
                for(i = 0;i<n;i++);
                {
                    flag = dequeue(q,&x);
                    printf("%5d",x);
                }
                if(flag == 1){printf("出队成功!");}
                else
                {
                printf("出队失败!");
                }
                break;
            case 4:
                showqueue(q);
                break;
            case 0:
                printf("退出");
                break;
            }
        }while(kk != 0);
}

img

  • 写回答

1条回答 默认 最新

  • 梦里逆天 2022-10-09 22:41
    关注
    #include "stdio.h"
    #include "malloc.h"
    typedef int DataType;
    typedef struct node
    {
        DataType data;
        struct node *next;
    }linklistq;
    typedef struct
    {
        linklistq *rear,*front;
    }linkqueue;
    linkqueue *Initqueue()
    {
        linklistq *p = (linklistq *)malloc(sizeof(linklistq));
        linkqueue *q = (linkqueue *)malloc(sizeof(linkqueue));
        q->front = p;
        q->rear = p;
        return q;
    }
    int emptyqueue(linkqueue *q)
    {
        if(q->rear == q->front){return 1;}
        else{return 0;}
    }
    int inqueue (linkqueue *q,DataType x)
    {
        linklistq *p =  (linklistq *)malloc(sizeof(linklistq));
        p->data = x;
        p->next = NULL;
        q->rear->next = p;
        q->rear = p;
    }
    int dequeue(linkqueue *q, int n)
    {
        linklistq *p;
        if(emptyqueue(q))
        {
            printf("队空,不能出队\n");
            return 0;
        }
        else 
        {
            int count = 0;
            printf("出队的元素顺序依次为:");
            while (count < n)
            {
                p = q->front->next;
                if (p != NULL)
                {
                    printf("%5d",p->data);
                    count++;
                }
                q->front->next = p->next;
                if(p->next == NULL)
                {
                    q->rear = q->front;
                }
            }
            free(p);
            return 1;
        }
    }
    void showqueue(linkqueue *q)
    {
        
        linklistq *p = q->front->next;//有头指针 
        if(p == NULL)
        {
            printf("队列为空");
        }
        else
        {
            printf("队列中的元素依次为:");
            while(p != NULL)
            {
                printf("%5d",p->data);
                p = p->next;
            }
        }
    }
    int menuqueue()
    {  int n;
           printf("\n               队列子系统");
           printf("\n==========================================");
           printf("\n |          1-初始化队列                 |");
           printf("\n |          2-入队操作                   |");
           printf("\n |          3-出队操作                   |");
           printf("\n |          4-遍历操作                   |");
           printf("\n |          0-退出                       |"); 
           do
           { printf("\n\t\t please number 0---4 select:");
              scanf("%d",&n);
           } while((n<0)||(n>4));
           return n;
    }
    int main()
    {
        DataType x;
        linkqueue *q;
        int i,n,flag;
        int kk;
        do
        {
            kk = menuqueue();
            switch(kk)
            {
                case 1:
                    q = Initqueue();
                    printf("队列的初始化完成!");
                    break;
                case 2:
                    printf("请输入要入队的元素个数:");
                    scanf("%d",&n);
                    printf("请输入%d个整数进行入队:",n);
                    for(i = 0;i<n;i++){
                        scanf("%d",&x);
                        inqueue(q,x);
                    }
                    printf("入队操作完成!");
                    break;
                case 3:
                    printf("请输入要出队的元素个数:");
                    scanf("%d",&n);
                    flag = dequeue(q, n);
    //                printf("出队的元素顺序依次为:");
    //                for(i = 0;i<n;i++);
    //                {
    //                    flag = dequeue(q);
    //                    printf("%5d",x);
    //                }
                    if(flag == 1){printf("出队成功!");}
                    else
                    {
                    printf("出队失败!");
                    }
                    break;
                case 4:
                    showqueue(q);
                    break;
                case 0:
                    printf("退出");
                    break;
                }
            }while(kk != 0);
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月18日
  • 已采纳回答 10月10日
  • 创建了问题 10月9日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效