链队列基本操作模拟系统

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef short ElemType;
typedef short Status;
struct QNode/* 链队列的结点 */
{
    ElemType data;
    struct QNode *next;
};
struct QueueInfo/* 链队列的头尾指针 */
{
    QNode *Qfront;/* 队头指针 */
    QNode *Qrear; /* 队尾指针 */
};
/* */
Status InitQueue(QueueInfo* &q);
Status EnQueue(QueueInfo* &q, ElemType e);
Status DeQueue(QueueInfo* &q, ElemType &e);
ElemType GetHead(struct QueueInfo* &q);
Status MenuPrint();
Status QueueLength(struct QueueInfo* &q);
Status Operation(struct QueueInfo* &q);
/* */
int main()
{
    QueueInfo Q;
    QueueInfo *W = &Q;
    InitQueue(W);/* 初始化队列头结点 */
    MenuPrint();
    Operation(W);
}
/* 顶层操作函数 */
Status Operation(struct QueueInfo* &q)
{
    short choice;
    ElemType e;
    printf("Please input your choice from 1 to 5: ");
    while(scanf("%hd", &choice) != 1)
    {
        while(getchar() != '\n') ;
        printf("Now the input buffer has been cleaned, please input a valid number not a character.\n");
        printf("Please input your choice from 1 to 5: ");
    }
    while(1)
    {
        if(choice == 5)
        {
            printf("Thanks for your using, see you.\n");
            break;
        }
        switch(choice)
        {
            case 1:
                printf("Please input the value of the element that will enter the queue: ");
                scanf("%hd", &e);
                if(EnQueue(q, e) == ERROR)
                {
                    printf("The queue has already been full, so the element can not enter into it.\n");
                }
                break;
            case 2:
                if(DeQueue(q, e) == OK)
                {
                    printf("The element that have just been deleted from the queue is %hd.\n", e);
                }
                else
                {
                    printf("The queue is now empty, so there is no element that can be deleted from it.\n");
                }
                break;
            case 3:
                printf("The length of the queue is %hd now.\n", QueueLength(q));
                break;
            case 4:
                e = GetHead(q);
                if(e != ERROR)
                {
                    printf("The front element of the queue is %hd.\n", e);
                }
                else
                {
                    printf("The queue is empty now, so there is no element in it.\n");
                }
                break;
            default:
                printf("Please input a valid number from 1 to 5.\n");
                break;
        }
        printf("Please input your choice from 1 to 5: ");
        while(scanf("%hd", &choice) != 1)
        {
            while(getchar() != '\n') ;
            printf("Now the input buffer has been cleaned, please input a valid number not a character.\n");
            printf("Please input your choice from 1 to 5: ");
        }
    }
    return OK;
}
/* 打印操作菜单 */
Status MenuPrint()
{
    printf("--------------------------顺序队列基本操作模拟系统--------------------------\n");
    printf("--------------------------1. 入队-------------------------------------------\n");
    printf("--------------------------2. 出队-------------------------------------------\n");
    printf("--------------------------3. 求队列长度-------------------------------------\n");
    printf("--------------------------4. 取队列的队头元素-------------------------------\n");
    printf("--------------------------5. 退出系统---------------------------------------\n");
    return OK;
}
/* 求队列长度 */
Status QueueLength(struct QueueInfo* &q)
{
    short len = 0;
    struct QNode *p = q -> Qfront -> next;
    while(p != NULL)
    {
        len ++;
        p = p -> next;
    }
    return len;
}
/* 取队头元素 */
ElemType GetHead(struct QueueInfo* &q)
{
    if(q -> Qfront == q -> Qrear)
    {
        /* 队空 */
        return ERROR;
    }
    return q -> Qfront -> next -> data;
}
/* 出队 */
Status DeQueue(QueueInfo* &q, ElemType &e)
{
    struct QNode *p;
    if(q -> Qfront == q -> Qrear)
    {
        /* 队空 */
        return ERROR;
    }
    p = q -> Qfront -> next;/* p指向队头元素 */
    e = p -> data;/* e保存队头元素的值 */
    q -> Qfront -> next = p -> next;/* 修改头结点的指针域 */
    if(p == q -> Qrear)
    {
        /* 最后一个元素被删除, 队尾指针指向头结点 */
        q -> Qrear = q -> Qfront;
    }
    free(p);
    return OK;
}
/* 入队 */
Status EnQueue(QueueInfo* &q, ElemType e)
{
    struct QNode *p = (struct QNode*)malloc(sizeof(struct QNode));
    if(p == NULL)
    {
        /* 申请动态内存失败 */
        exit(0);
    }
    p -> data = e;/* 将新结点数据域置为e */
    p -> next = NULL;
    q -> Qrear -> next = p;/* 将新结点插入到队尾 */
    q -> Qrear = p;
    return OK;
}
/* 初始化链队列 */
Status InitQueue(QueueInfo* &q)
{
    /* 链队的初始化操作就是构造一个只有一个头结点的空队 */
    /* 生成新结点作为头结点, 一开始队头和队尾指针都指向此结点 */
    q -> Qfront = (struct QNode*)malloc(sizeof(struct QNode));
    if(q -> Qfront == NULL)
    {
        /* 申请动态内存失败 */
        exit(0);
    }
    q -> Qrear = q -> Qfront;
    q -> Qfront -> next = NULL;
    return OK;
}

 

上一篇:CCPC威海 L&C


下一篇:5.15 牛客挑战赛40 B 小V的序列 关于随机均摊分析 二进制