队列的基本操作(全)

目录

1.实现功能

2.建队列

3.进队列

4.打印队列信息

5.队列的判空

6.求队列的长度

7.求队尾元素

8.删除队列元素同时返回队尾元素的值

9.求队头元素

10.输入队列元素

11.摧毁一个队列

12.请空队列

13.switch case选择

14.全部代码内容

15.运行图片


本帖可以实现的功能

1.实现功能

void pro()
{
    printf("0.退出\n");
    printf("1.建立一个新队列\n");
    printf("2.按照输出方式打印队列信息\n");
    printf("3.求队列长度\n");
    printf("4.获取对头元素\n");
    printf("5.获取队尾元素\n");
    printf("6.删除对头元素\n");
    printf("7.判断队列是否为空\n");
    printf("8.在队尾插入一个数\n");
    printf("9.清空一个队列\n");
    printf("10.摧毁一个队列\n");
}

2.建队列

void InitQueue(LinkQueue &Q)
{
    //建立链队列
    Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
    Q.front = Q.rear;
    if (!Q.front)
        printf("开辟空间失败\n");
    Q.front->next = NULL;
    printf("链式队列存储空间开辟完成\n");
    // Q.front->next=Q.rear->next;
}

3.进队列

Status EnQueue(LinkQueue &Q, int e)
{
    //在队列的尾部插入元素
    QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
    p->data = e;
    p->next = NULL;
    Q.rear->next = p;
    Q.rear = p;
}

4.打印队列信息

void print(LinkQueue Q)
{
    //打印对列信息,按照输出方向
    QueuePtr p;
    p = Q.front->next;
    while (p != NULL)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

5.队列的判空

void QueueEmpty(LinkQueue Q)
{
    //判断是否为空队列
    if (Q.front == Q.rear)
    {
        printf("空\n");
    }
    else
    {
        printf("不空\n");
    }
}

6.求队列的长度

void QueueLength(LinkQueue Q)
{
    //求队列的长度
    int length = 0;
    QueuePtr p, q;
    p = Q.front->next;
    while (p != NULL)
    {
        p = p->next;
        length++;
    }
    printf("长度为%d\n", length);
}

7.求队尾元素

void QueueRear(LinkQueue Q)
{
    //求队尾
    printf("队尾元素是:%d\n", Q.rear->data);
}

8.删除队列元素同时返回队尾元素的值

Status DeQueue(LinkQueue &Q)
{
    int e;
    if (Q.front == Q.rear)
    {
        printf("这个队列为空\n");
    }
    QueuePtr p = Q.front->next;
    e = p->data;
    Q.front->next = p->next;
    if (Q.rear == p)
    {
        Q.rear = Q.front;
    }
    free(p);
    return e;
}

9.求队头元素

void QueueFront(LinkQueue Q)
{
    //求对头
    printf("对头元素为:%d\n", Q.front->next->data);
}

10.输入队列元素

Status CreatQueue(LinkQueue &Q)
{
    //输入队列元素
    printf("请输入队列里面的元素\n");
    int e;
    scanf("%d", &e);
    while (e != -1)
    {
        EnQueue(Q, e);
        scanf("%d", &e);
    }
}

11.摧毁一个队列

Status DestoryQueue(LinkQueue &Q)
{
    QueuePtr p;
    while(!p)
    {
        p=Q.front;
        Q.front=Q.front->next;
        free(p);
    }
    printf("摧毁队列完成\n");
}

12.请空队列

Status ClearQueue(LinkQueue &Q)
{
    Q.rear=Q.front->next=NULL;
    printf("清空操作已经完成\n");
}

13.switch case选择

void swi(LinkQueue Q)
{
    int num;
    pro();
    printf("请输入功能数字:");
    scanf("%d", &num);
    while (num)
    {
        switch (num)
        {
        case 0:
            num = 0;
            break;
        case 1:
            printf("建立一个新队列\n");
            InitQueue(Q);
            printf("\n\n");
            CreatQueue(Q);
            printf("建立成功\n");
            break;
        case 2:
            if (Q.rear == NULL)
            {
                printf("在进行操作二时,需要进行操作一\n");
            }
            else
            {
                printf("队列信息如下:\n");
                print(Q);
            }
            break;
        case 3:
            if (Q.rear == NULL)
            {
                printf("在进行操作三时,需要进行操作一\n");
            }
            else
            {
                printf("队列");
                QueueLength(Q);
            }
            break;
        case 4:
            if (Q.rear == NULL)
            {
                printf("在进行操作四时,需要进行操作一\n");
            }
            else
            {
                printf("获取对头元素\n");
                QueueFront(Q);
            }
            break;
        case 5:
            if (Q.rear == NULL)
            {
                printf("在进行操作五时,需要进行操作一\n");
            }
            else
            {
                printf("获取队尾元素\n");
                QueueRear(Q);
            }
            break;
        case 6:
            if (Q.rear == NULL)
            {
                printf("在进行操作六时,需要进行操作一\n");
            }
            else
            {
                printf("删除对头元素,");
                int e;
                e = DeQueue(Q);
                printf("删除的对头元素是:%d\n", e);
            }
            break;
        case 7:
            if (Q.rear == NULL)
            {
                printf("在进行操作七时,需要进行操作一\n");
            }
            else
            {
                printf("判断队列是否为空\n");
                QueueEmpty(Q);
            }
            break;
        case 8:
            if (Q.rear == NULL)
            {
                printf("在进行操作八时,需要进行操作一\n");
            }
            else
            {
                printf("在队尾插入一个数\n");
                int n;
                printf("请输入一个数字:");
                scanf("%d", &n);
                printf("\n");
                EnQueue(Q, n);
                printf("插入成功\n");
            }
            break;
        case 9:
            if (Q.rear == NULL)
            {
                printf("在进行操作九时,需要进行操作一\n");
            }
            else
            {
                ClearQueue(Q);
            }
        break;
        case 10:
            if (Q.rear == NULL)
            {
                printf("在进行操作十时,需要进行操作一\n");
            }
            else
            {
                DestoryQueue(Q);
                Q.rear=NULL;
            }
            break;
        default:
            printf("输入错误,请重新输入\n");
        }
        printf("\n\n");
        pro();
        printf("请输入功能数字:");
        scanf("%d", &num);
    }
}

14.全部代码内容

// define区
#define Stack_Init_Size 100
#define Stack_Increment 10
#define OK 1
#define OVERFLOW -2
#define ERROR 0

//预处理
#include <stdio.h>
#include <stdlib.h>

//typedef
typedef int Status;
typedef struct QNode
{
    int data;
    struct QNode *next;
} QNode, *QueuePtr;
typedef struct
{
    QueuePtr front;
    QueuePtr rear;
} LinkQueue;

//函数区声明
void InitQueue(LinkQueue &Q);               //建立链队列
Status EnQueue(LinkQueue &Q, int e);        //在队列的尾部插入元素
void print(LinkQueue Q);                    //打印对列信息,按照输出方向
void QueueEmpty(LinkQueue Q);                //判断是否为空队列
void QueueLength(LinkQueue Q);              //求队列的长度
void QueueRear(LinkQueue Q);                //求队尾
Status DeQueue(LinkQueue &Q);               //求对头
void QueueFront(LinkQueue Q);               //输入队列元素
Status CreatQueue(LinkQueue &Q);            //创建队列
Status DestoryQueue(LinkQueue &Q);          //摧毁队列
Status ClearQueue(LinkQueue &Q);            //请空队列
void pro();                                 //功能  
void swi(LinkQueue Q);                      //switch

//主函数
int main()
{
    LinkQueue Q;
    Q.rear = NULL;
    swi(Q);
}


void InitQueue(LinkQueue &Q)
{
    //建立链队列
    Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
    Q.front = Q.rear;
    if (!Q.front)
        printf("开辟空间失败\n");
    Q.front->next = NULL;
    printf("链式队列存储空间开辟完成\n");
    // Q.front->next=Q.rear->next;
}

Status EnQueue(LinkQueue &Q, int e)
{
    //在队列的尾部插入元素
    QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
    p->data = e;
    p->next = NULL;
    Q.rear->next = p;
    Q.rear = p;
}

void print(LinkQueue Q)
{
    //打印对列信息,按照输出方向
    QueuePtr p;
    p = Q.front->next;
    while (p != NULL)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

void QueueEmpty(LinkQueue Q)
{
    //判断是否为空队列
    if (Q.front == Q.rear)
    {
        printf("空\n");
    }
    else
    {
        printf("不空\n");
    }
}

void QueueLength(LinkQueue Q)
{
    //求队列的长度
    int length = 0;
    QueuePtr p, q;
    p = Q.front->next;
    while (p != NULL)
    {
        p = p->next;
        length++;
    }
    printf("长度为%d\n", length);
}

void QueueRear(LinkQueue Q)
{
    //求队尾
    printf("队尾元素是:%d\n", Q.rear->data);
}

Status DeQueue(LinkQueue &Q)
{
    int e;
    if (Q.front == Q.rear)
    {
        printf("这个队列为空\n");
    }
    QueuePtr p = Q.front->next;
    e = p->data;
    Q.front->next = p->next;
    if (Q.rear == p)
    {
        Q.rear = Q.front;
    }
    free(p);
    return e;
}

void QueueFront(LinkQueue Q)
{
    //求对头
    printf("对头元素为:%d\n", Q.front->next->data);
}
/*
int DeQueue(LinkQueue &Q)

{
    //删除对列的对头元素
    QNode *p;
    p = Q.front->next;
    int e = p->data;
    Q.front->next = p->next;
    free(p);
    return e;
}*/

Status CreatQueue(LinkQueue &Q)
{
    //输入队列元素
    printf("请输入队列里面的元素\n");
    int e;
    scanf("%d", &e);
    while (e != -1)
    {
        EnQueue(Q, e);
        scanf("%d", &e);
    }
}

Status DestoryQueue(LinkQueue &Q)
{
    QueuePtr p;
    while(!p)
    {
        p=Q.front;
        Q.front=Q.front->next;
        free(p);
    }
    printf("摧毁队列完成\n");
}

Status ClearQueue(LinkQueue &Q)
{
    Q.rear=Q.front->next=NULL;
    printf("清空操作已经完成\n");
}

void pro()
{
    printf("0.退出\n");
    printf("1.建立一个新队列\n");
    printf("2.按照输出方式打印队列信息\n");
    printf("3.求队列长度\n");
    printf("4.获取对头元素\n");
    printf("5.获取队尾元素\n");
    printf("6.删除对头元素\n");
    printf("7.判断队列是否为空\n");
    printf("8.在队尾插入一个数\n");
    printf("9.清空一个队列\n");
    printf("10.摧毁一个队列\n");
}

void swi(LinkQueue Q)
{
    int num;
    pro();
    printf("请输入功能数字:");
    scanf("%d", &num);
    while (num)
    {
        switch (num)
        {
        case 0:
            num = 0;
            break;
        case 1:
            printf("建立一个新队列\n");
            InitQueue(Q);
            printf("\n\n");
            CreatQueue(Q);
            printf("建立成功\n");
            break;
        case 2:
            if (Q.rear == NULL)
            {
                printf("在进行操作二时,需要进行操作一\n");
            }
            else
            {
                printf("队列信息如下:\n");
                print(Q);
            }
            break;
        case 3:
            if (Q.rear == NULL)
            {
                printf("在进行操作三时,需要进行操作一\n");
            }
            else
            {
                printf("队列");
                QueueLength(Q);
            }
            break;
        case 4:
            if (Q.rear == NULL)
            {
                printf("在进行操作四时,需要进行操作一\n");
            }
            else
            {
                printf("获取对头元素\n");
                QueueFront(Q);
            }
            break;
        case 5:
            if (Q.rear == NULL)
            {
                printf("在进行操作五时,需要进行操作一\n");
            }
            else
            {
                printf("获取队尾元素\n");
                QueueRear(Q);
            }
            break;
        case 6:
            if (Q.rear == NULL)
            {
                printf("在进行操作六时,需要进行操作一\n");
            }
            else
            {
                printf("删除对头元素,");
                int e;
                e = DeQueue(Q);
                printf("删除的对头元素是:%d\n", e);
            }
            break;
        case 7:
            if (Q.rear == NULL)
            {
                printf("在进行操作七时,需要进行操作一\n");
            }
            else
            {
                printf("判断队列是否为空\n");
                QueueEmpty(Q);
            }
            break;
        case 8:
            if (Q.rear == NULL)
            {
                printf("在进行操作八时,需要进行操作一\n");
            }
            else
            {
                printf("在队尾插入一个数\n");
                int n;
                printf("请输入一个数字:");
                scanf("%d", &n);
                printf("\n");
                EnQueue(Q, n);
                printf("插入成功\n");
            }
            break;
        case 9:
            if (Q.rear == NULL)
            {
                printf("在进行操作九时,需要进行操作一\n");
            }
            else
            {
                ClearQueue(Q);
            }
        break;
        case 10:
            if (Q.rear == NULL)
            {
                printf("在进行操作十时,需要进行操作一\n");
            }
            else
            {
                DestoryQueue(Q);
                Q.rear=NULL;
            }
            break;
        default:
            printf("输入错误,请重新输入\n");
        }
        printf("\n\n");
        pro();
        printf("请输入功能数字:");
        scanf("%d", &num);
    }
}

15.运行图片

在没有建立队列时:

建立队列

打印队列

求长度

获取对头元素

获取队尾元素

删除对头元素

队尾插入一个数字

 验证

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值