#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; }