链队列、循环队列的基本操作-数据结构类C语言

目录

一、功能函数(func.cpp)

二、主函数(main.cpp)

三、头文件(head.h)

一、功能函数(func.cpp)

#include "before.h"
#include <iostream>
#include <cstdlib>

using namespace std;

status InitQueue_LinkQueue(LinkQueue &Q)
{
    Q.front=Q.rear=(QNode *) malloc(sizeof(QNode));
    if(!Q.rear) return ERR;     //空间申请失败
    Q.front->next = NULL;
    return OK;                  //建立空队列成功
}//初始化链队列

status EnQueue_LinkQueue(LinkQueue &Q,ElemType e)
{
    QNode *p = (QNode *) malloc(sizeof(QNode));
    if(!p) return ERR;     //空间申请失败
    p->data = e;
    p->next = NULL;
    Q.rear->next = p;
    Q.rear = p;
    return OK;             //入队成功
}//入链队列

status DeQueue_LinkQueue(LinkQueue &Q,ElemType &e)
{
    if(Q.front == Q.rear) return ERR;          //队空
    if(!Q.front) return OVERFLOW;              //队销毁
    QNode *p = Q.front->next;
    e = p->data;
    Q.front->next = p->next;
    if(Q.rear == p) Q.rear = Q.front;
    free(p);
    return OK;                                 //出队列成功
}//出链队列

void DestroyQueue_LinkQueue(LinkQueue &Q)
{
    QNode *p;
    while(Q.front)
    {
        p = Q.front->next;
        free(Q.front);
        Q.front = p;
    }
    Q.rear = Q.front;
}//销毁链队列

status LengthQueue_LinkQueue(LinkQueue Q)
{
    int cnt = 0;
    while(Q.front->next != NULL)
    {
        cnt ++;
        Q.front = Q.front->next;
    }
    return cnt;
}//求队列长度

status GetHead_LinkQueue(LinkQueue Q)
{
    return Q.front->next->data;
}//取队首

void PrintQueue_LinkQueue(LinkQueue Q)
{
    if(!Q.front) cout << "当前链队列已被销毁,无法打印!" << endl;
    else if(Q.front == Q.rear) cout << "当前链队列为空,无法打印!" << endl;
    else
    {
        int num = 0;
        QNode *point = Q.front->next;
        cout << "当前链队列元素为:" << endl;
        while(point)
        {
            cout << point->data << " ";
            num ++;
            point = point->next;
            if(num % 7 == 0) cout << endl;
        }
    }
}//打印队列

//循环队列
status InitQueue_SqQueue(SqQueue &Q)
{
    if(!Q.base) return ERR;    //空间分配失败
    Q.front = Q.rear = 0;
    return OK;                 //建立成功
}//初始化循环队列

status EnQueue_SqQueue(SqQueue &Q,ElemType e)
{
    if((Q.rear+1)%MAXQsize == Q.front) return ERR;     //队列满
    Q.base[Q.rear] = e;
    Q.rear = (Q.rear+1)%MAXQsize;
    return OK;                                         //入队成功
}//入队列

status DeQueue_SqQueue(SqQueue &Q,ElemType &e)
{
    if(Q.front == Q.rear && Q.front == -1) return OVERFLOW;              //队列被销毁
    else if(Q.front == Q.rear) return ERR;                               //队列为空
    else
    {
        e = Q.base[Q.front];
        Q.front = (Q.front+1)%MAXQsize;
        return OK;                                                      //出队成功
    }
}//出队列

status LengthQueue_SqQueue(SqQueue Q)
{
    return (Q.rear-Q.front+MAXQsize)%MAXQsize;
}//求当前队列长度

status GetHeadQueue_SqQueue(SqQueue Q)
{
    return Q.base[Q.front];
}//取队首

void DestroyQueue_SqQueue(SqQueue &Q)
{
    Q.front = Q.rear = -1;
}//销毁循环队列

void PrintQueue_SqQueue(SqQueue Q)
{cout << "Q.f " << Q.front << " Q.r" << Q.rear << endl;
    if(Q.front == -1 && Q.rear == Q.front) cout << "该循环队列已被销毁!无法打印!" << endl;
    else if(Q.front == Q.rear && Q.front == 0) cout << "该顺序队列为空!无法打印!" << endl;
    else
    {
        int cnt = 0;
        cout << "当前顺序队列的元素为:" << endl;
        while(Q.rear != Q.front)
        {
            cout << Q.base[Q.front] << " ";
            cnt ++;
            Q.front = (Q.front+1) % MAXQsize;
            if(cnt%7 == 0) cout << endl;
        }
    }
}//打印循环队列

//菜单打印
void Menu()
{
    printf("\t\t\t***********************此为队列的菜单**********************\n");
    printf("\t\t\t\t1、链队列                          2、循环队列           \n");
    printf("\t\t\t\t0、退出操作程序                                          \n");
    printf("\t\t\t*********************************************************\n");
}

void Menu_LinkQueue()
{
    printf("\t\t\t**********************此为链队列菜单***********************\n");
    printf("\t\t\t\t1、初始化链队列                  2、入链队列              \n");
    printf("\t\t\t\t3、出链队列                      4、求队列长度            \n");
    printf("\t\t\t\t5、求队首元素                    6、销毁链队列            \n");
    printf("\t\t\t\t7、打印链队列                    0、退出当前程序          \n");
    printf("\t\t\t\tTips:进行完选项1之后才可进行其余操作!                     \n");
    printf("\t\t\t*********************************************************\n");
}

void Menu_SqQueue()
{
    printf("\t\t\t********************此为顺序队列菜单**********************\n");
    printf("\t\t\t\t1、初始化顺序队列                2、入顺序队列           \n");
    printf("\t\t\t\t3、出顺序队列                    4、求队列长度           \n");
    printf("\t\t\t\t5、求队首元素                    6、销毁顺序队列         \n");
    printf("\t\t\t\t7、打印顺序队列                  0、退出当前程序         \n");
    printf("\t\t\t\tTips:进行完选项1之后才可进行其余操作!                    \n");
    printf("\t\t\t********************************************************\n");
}

//
// Created by somewon on 2022/10/18.
//

二、主函数(main.cpp)

#include <iostream>
#include "before.h"

using namespace std;

int main() {
    int choice,ch;
    do {
        Menu();
        cout << "请输入你的选择:";
        cin >> choice;
        if(choice == 1)        //链队列
        {
            do {
                Menu_LinkQueue();
                cout << "请输入你的选择:";
                cin >> ch;
                LinkQueue Q;
                int fine;
                ElemType e;
                switch(ch)
                {
                    case 0:
                        goto END;
                    case 1:
                        fine = InitQueue_LinkQueue(Q);
                        if(fine == OK) cout << "初始化链队列成功!" <<endl;
                        else cout << "初始化链队列失败!" << endl;
                        break;
                    case 2:
                        cout << "请输入需要入队列的元素:";
                        cin >> e;
                        fine = EnQueue_LinkQueue(Q,e);
                        if(fine == OK)
                        {
                            cout << "元素入队成功!" <<endl;
                            PrintQueue_LinkQueue(Q);
                        }
                        else cout << "空间申请失败,元素入队失败!" << endl;
                        break;
                    case 3:
                        fine = DeQueue_LinkQueue(Q,e);
                        if(fine == OK)
                        {
                            cout << "出队成功!被出队元素值为:" << e << endl;
                            PrintQueue_LinkQueue(Q);
                        }
                        else if(fine == ERR)cout << "队列当前为空,出队失败!请再次进行操作!" << endl;
                        else if(fine == OVERFLOW) cout << "当前队列已被销毁,无法出队!请再次进行操作!" << endl;
                        break;
                    case 4:
                        if(!Q.front) cout << "当前队列已被销毁!" <<endl;
                        else if(Q.front == Q.rear) cout << "当前队列为空!" << endl;
                        else cout << "当前链队列的长度为:" << LengthQueue_LinkQueue(Q) << endl;
                        break;
                    case 5:
                        if(!Q.front) cout << "当前链队列已被销毁,无队首元素!" << endl;
                        else if(Q.front == Q.rear) cout << "当前链队列为空,无队首元素!" << endl;
                        else cout << "当前链队列的队首元素为:" <<GetHead_LinkQueue(Q) << endl;
                        break;
                    case 6:
                        DestroyQueue_LinkQueue(Q);
                        cout << "当前链队列销毁成功!" << endl;
                        break;
                    case 7:
                        PrintQueue_LinkQueue(Q);
                        break;
                }
            }while(ch);
        }
        else if(choice == 2)   //顺序队列
        {
            do {
                Menu_SqQueue();
                cout << "请输入你的选择:";
                cin >> ch;
                SqQueue Q;
                ElemType e;
                int fine;
                switch(ch)
                {
                    case 0:
                        goto END;
                    case 1:
                        fine = InitQueue_SqQueue(Q);
                        if(fine == OK) cout << "循环队列初始化成功!" << endl;
                        else cout << "循环队列初始化失败!" << endl;
                        break;
                    case 2:
                        cout << "请输入需要入队的元素:";
                        cin >> e;
                        fine = EnQueue_SqQueue(Q,e);
                        if(fine == OK)
                        {
                            cout << "该元素入队成功!" << endl;
                            PrintQueue_SqQueue(Q);
                        }
                        else cout << "队列空间已满,无法入队列!" << endl;
                        break;
                    case 3:
                        fine = DeQueue_SqQueue(Q,e);cout << "Q.f " << Q.front << " Q.r" << Q.rear << endl;
                        if(fine == ERR) cout << "当前循环队列为空,无法出队列元素!" << endl;
                        else if(fine == OVERFLOW) cout << "当前队列已被销毁,无法出队列元素!" <<endl;
                        else
                        {
                            cout << "出队列成功,所出元素为:" << e << endl;
                            PrintQueue_SqQueue(Q);
                        }
                        break;
                    case 4:
                        if(Q.front == -1 && Q.front == Q.rear) cout << "当前队列已被销毁!" <<endl;
                        else if(Q.front == Q.rear && Q.rear == Q.front) cout << "当前队列为空!" << endl;
                        else cout << "当前循环队列的长度为:" << LengthQueue_SqQueue(Q) << endl;
                        break;
                    case 5:cout << "Q.f " << Q.front << endl;
                        if(Q.front== -1 && Q.rear == Q.front) cout << "当前队列已被销毁,无队首元素!" << endl;
                        else if(Q.front == Q.rear && Q.front == 0) cout << "当前队列为空,无队首元素!" << endl;
                        else cout << "当前循环队列的队首元素为:" << GetHeadQueue_SqQueue(Q) << endl;
                        break;
                    case 6:
                        DestroyQueue_SqQueue(Q);
                        cout << "当前循环队列已被销毁!" << endl;
                        break;
                    case 7:
                        PrintQueue_SqQueue(Q);
                        break;
                    default:
                        cout << "无该操作!" << endl;
                        fflush(stdin);
                }
            }while(ch);
        }
        else if(choice == 0) goto ENDD;
        else
        {
            cout << "无该操作!" << endl;
        }
        END:
        cout << "已退出当前程序!" << endl;
    }while(choice);

    ENDD:
    cout << "整个项目操作结束!欢迎下次修改!" << endl;
    return 0;
}
//
//Created by somewon on 2022/10/18.
//

三、头文件(head.h)

#ifndef C___BEFORE_H
#define C___BEFORE_H

#define OK 1
#define ERR 0
#define OVERFLOW (-1)
#define MAXQsize 5

typedef int ElemType;
typedef int status;

//链队列
typedef struct QNode
{
    ElemType data;
    struct QNode *next;
}QNode,*QueuePtr;

typedef struct
{
    QueuePtr front;
    QueuePtr rear;
}LinkQueue;

status InitQueue_LinkQueue(LinkQueue &Q);             //初始化链队列
status EnQueue_LinkQueue(LinkQueue &Q,ElemType e);    //入链队列
status DeQueue_LinkQueue(LinkQueue &Q,ElemType &e);   //出链队列
void DestroyQueue_LinkQueue(LinkQueue &Q);            //销毁链队列
status LengthQueue_LinkQueue(LinkQueue Q);            //队列长度
status GetHead_LinkQueue(LinkQueue Q);                //输出队首元素
void PrintQueue_LinkQueue(LinkQueue Q);               //打印链队列

//循环队列
typedef struct
{
    ElemType base[MAXQsize];
    int front;
    int rear;
}SqQueue;

status InitQueue_SqQueue(SqQueue &Q);                  //初始化循环队列
status EnQueue_SqQueue(SqQueue &Q,ElemType e);         //入队列
status DeQueue_SqQueue(SqQueue &Q,ElemType &e);        //出队列
status LengthQueue_SqQueue(SqQueue Q);                 //队列长度
status GetHeadQueue_SqQueue(SqQueue Q);                //取队首
void DestroyQueue_SqQueue(SqQueue &Q);                 //销毁队列
void PrintQueue_SqQueue(SqQueue Q);                    //打印循环队列

//菜单声明
void Menu();             //主选择菜单
void Menu_LinkQueue();   //链队列菜单
void Menu_SqQueue();     //顺序队列菜单

#endif //C___HEAD_H

//
// Created by somewon on 2022/10/18.
//

猜你喜欢

转载自blog.csdn.net/somewon/article/details/127427832