编写C程序,实现链队列的下列功能: 

1、 设计一个虚拟界面,让用户选择操作(根据提示输入数据)

2、 采用模块化编程思想,编写main函数和若干子函数(实现功能)

3、 队列的基本功能有:创建空队列、入队、出队、取队头元素等。

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 6
#define false 0
#define true 1
typedef int datatype;

typedef struct Qnode
{
    datatype data;            //数据域
    struct Qnode* next;        //指针域
}Qnode;    //结点

typedef struct
{
    Qnode* front;            //队头指针
    Qnode* rear;            //队尾指针
    int num;
}LinkQueue;                    //链队列

void printStar()            //连续输入几十个*,用来设计虚拟界面的边框
{
    int i;
    for (i = 0; i < 70; i++)
        printf("*");
    printf("\n");
}

void menu()
{
    printStar();
    printf("\t\t\t欢迎进入链队列操作界面!\n");
    printf("请从键盘输入数字,完成对应的操作(1到5为有效操作,输入其他退出程序)\n");
    printf("\t 1.初始化链队列\n");
    printf("\t 2.入队\n");
    printf("\t 3.出队\n");
    printf("\t 4.取队头元素\n");
    printf("\t 5.输出该链队列\n");
    printStar();
}

LinkQueue* InitQueue()    //初始化链队列
{
    LinkQueue* q;
    Qnode* p;
    q = (LinkQueue*)malloc(sizeof(LinkQueue));//申请头结点的内存空间
    p = (Qnode*)malloc(sizeof(Qnode));
    q->front = q->rear = p; //对头和队尾指针指向p结点
    q->front->next = NULL;
    q->num = 0;
    printf("链队列初始化成功!\n");
    return q;
}

void EnQueue(LinkQueue* Q, datatype x)    //入队
{
    Qnode* p;
    p = (Qnode*)malloc(sizeof(Qnode));
    if (Q->num == MaxSize - 1) {
        printf("队列已满,无法进行入队操作!\n");
    }
    p->data = x;
    Q->rear->next = p;
    p->next = NULL;
    Q->rear = p;
    Q->num++;
    printf("入队完毕\n");
}


void DeQueue(LinkQueue* Q)    //出队
{
    Qnode* p;
    datatype x;
    if (Q->front == Q->rear)
        printf("队列为空队列,无法进行出队操作!\n");
    else
    {
        p = Q->front->next;
        x = p->data;
        Q->front->next = p->next;
        if (Q->rear == p) {
            Q->rear = Q->front;
        }
        Q->num--;
    }
}

int  GetHead(LinkQueue* Q)    //取队头元素
{
    Qnode* p = Q->front->next;
    if (Q->front == Q->rear)    //空队列
        printf("队列为空队列!\n");
    else
    {
        return p->data;
    }
}

void display(LinkQueue* Q)    //输出该链队列
{
    if (Q->front == Q->rear)    //空队列
        printf("队列为空队列!\n");
    else
    {
        Qnode* k = Q->front->next;
        while (k)
        {
            printf("%d ", k->data);
            k = k->next;
        }
        printf("NULL");
        printf("\n");
    }
}

void main()
{
    int select, x = 0, flag = 1;
    LinkQueue* p = NULL;

    menu();
    while (flag == 1) {
        printf("您选择的操作是:");
        fflush(stdin);
        scanf_s("%d", &select);
        switch (select) {        //根据用户的输入,调用前面写的子函数,完成链队列的5个功能
        case 1:    p = InitQueue(); //初始化
            printf("\n");
            break;
        case 2:printf("请输入要入队的数据:");
            scanf_s("%d", &x);
            EnQueue(p, x); //入队
            printf("\n");
            break;
        case 3: DeQueue(p); //出队
            printf("出队\n", x);
            break;
        case 4:x = GetHead(p);    //取队头元素
            printf("头元素: %d\n", x);
            break;
        case 5:display(p);    //输出该链队列
            printf("\n");
            break;
        default:printf("您选择退出程序,欢迎下次光临!\n");
            flag = 0;
        }
    }
    printf("\n");
    system("pause");
}

posted on 2022-11-12 18:06  wshidaboss  阅读(60)  评论(0编辑  收藏  举报