*题目:设计一个整型的链队列。
* 编写队列的进队、出队、读队头元素、显示队列中全部元素程序。
*题目:设计一个输入限制性的双队列,
*要求:输入只能在一端进行,而输出可以选择从队头输出
* 或队尾输出,全部选择完毕后能显示所选择的输出结果。
*题目:设计一个选择式菜单,以菜单方式选择队列的各种基本操作。
* 队 列 子 系 统
* *********************************
* * 1------进 队 *
* * 2------出 队 *
* * 3------读队头元素 *
* * 4------显 示 *
* * 5------双 队 列 *
* * 0------返 回 *
* *********************************
* 请选择菜单号(0--5):
*/
#include #include #define QUEUEMAX 30 typedef struct //顺序队列 { int queu[QUEUEMAX]; int front; //队头 int rear; //队尾 }linkQueues; typedef struct queuenode { int data; struct queuenode *next; }queueNode; typedef struct { queueNode *front; //队头指针 queueNode *rear; //队尾指针 }linkQueue; void inQueue(linkQueue *p); void outQueue(linkQueue *p); void readFront(linkQueue *p); void showQueue(linkQueue *p); void inQueues(linkQueues *p); void outQueue_front(linkQueues *p); void outQueue_rear(linkQueues *p); void doubleQueue(); /************************************************* Function: main() Description: 主调函数 Calls: inQueue() outQueue() readQueue() showQueue() Input: NULL Return: void Others: NULL *************************************************/ void main() { int choice, i = 1; linkQueue *p = (linkQueue *)malloc(sizeof(linkQueue)); p->front = p->rear = NULL; //链队列队头队尾的指针初始化 while (i) { printf(\"\\n 队 列 子 系 统\\n\"); printf(\"*********************************\\n\"); printf(\"* 1------进 队 *\\n\"); printf(\"* 2------出 队 *\\n\"); printf(\"* 3------读队头元素 *\\n\"); printf(\"* 4------显 示 *\\n\"); printf(\"* 5------双 队 列 *\\n\"); printf(\"* 0------返 回 *\\n\"); printf(\"*********************************\\n\"); printf(\"请选择菜单号(0--5):\"); fflush(stdin); //清空输入的缓存区 choice = getchar(); switch(choice) { case '1': inQueue(p); //入队 break; case '2': outQueue(p); //出队 break; case '3': readFront(p); //读对头元素 break; case '4': showQueue(p); //读队中所有元素 break; case '5': doubleQueue(); break; case '0': i = 0; break; default: i = 1; break; } } } /************************************************* Function: inQueue() Description: 入队 Calls: NULL Input: p 链队列指针 Return: void Others: NULL *************************************************/ void inQueue(linkQueue *p) { queueNode *q; int x; q = (queueNode *)malloc(sizeof(queueNode)); printf(\"请输入入队的整数:\"); scanf(\"%d\ getchar(); q->data = x; q->next = NULL; if (p->front == NULL) //队头指针为空时 { p->front = q; //队头指针指向结点 p->rear = q; //队尾指针指向结点 } else { p->rear->next = q; //队列元素增加 p->rear = q; } if (q) //判断新的元素指针是否正确 { printf(\"%d 入队成功!\\n\ } } /************************************************* Function: outQueue() Description: 出队 Calls: NULL Input: p 链队列指针 Return: void Others: NULL *************************************************/ void outQueue(linkQueue *p) { queueNode *q; int x; if (p->front == NULL) //队头指针为空时 { printf(\"出队失败!\\n\"); } else { q = p->front; x = q->data; p->front = p->front->next; if (p->front == NULL) //若队头指针为空,则队尾指针也要为空。 { p->rear = NULL; } free(q); printf(\"%d 出队成功\\n\ } } /************************************************* Function: readFront() Description: 读队头元素 Calls: NULL Input: p 链队列指针 Return: void Others: NULL *************************************************/ void readFront(linkQueue *p) { int x; if (p == NULL || p->front == NULL) { printf(\"读对头元素失败!\\n\"); } else { x = p->front->data; printf(\"队头元素为:%d\\n\ //队列不存在或队头指针为空 } } /************************************************* Function: showQueue() Description: 显示队列中全部元素 Calls: NULL Input: p 链队列指针 Return: void Others: NULL *************************************************/ void showQueue(linkQueue *p) { queueNode *q; if (p->front == NULL) { printf(\"队列为空!\\n\"); } else { printf(\"队列元素为:\"); q = p->front; while (q != NULL) { printf(\"%4d\ q = q->next; } printf(\"\\n\"); } } /************************************************* Function: inQueues() Description: 顺序队列入队 Calls: NULL Input: p:顺序队列指针 Return: void Others: NULL *************************************************/ void inQueues(linkQueues *p) { int x; printf(\"请输入入队元素:\"); scanf(\"%d\ p->rear = (p->rear++)%(QUEUEMAX); //确定插入位置 if (p->front == p->rear) //判断队列是否已满 { printf(\"队列已满!\\n\"); } else { p->queu[p->rear] = x; //入队 printf(\"%d入队成功!\\n\ } } /************************************************* Function: outQueue_front() Description: 顺序队列队头出队 Calls: NULL Input: p:顺序队列指针 Return: void Others: NULL *************************************************/ void outQueue_front(linkQueues *p) { int y; if (p->front == p->rear) { printf(\"队列为空!\\n\"); } else { y = p->queu[++(p->front)]; //先确定出队位置再队头出队 printf(\"队头%d出队成功!\\n\ } if (p->front == QUEUEMAX) //队列循环 { p->front = 0; } } /************************************************* Function: outQueue_rear() Description: 顺序队列队尾出队 Calls: NULL Input: p:顺序队列指针 Return: void Others: NULL *************************************************/ void outQueue_rear(linkQueues *p) { int j; if (p->front == p->rear) { printf(\"队列为空!\\n\"); } else { j = p->queu[p->rear--]; //先确定出队位置再队尾出队 printf(\"队尾%d出队成功!\\n\ } if (p->rear < 0 && p->front != -1) //队列循环 { p->rear == QUEUEMAX-1; } } /************************************************* Function: doubleQueue() Description: 有限制的双队列 Calls: inQueues() outQueue_front() outQueue_rear() Input: void Return: void Others: NULL *************************************************/ void doubleQueue() { linkQueues p; //初始化 p.front = -1; p.rear = -1; int i, j; for (i = 0; i < 6; i++) { inQueues(&p); //入队 } j = 1; while (j) { printf(\"1----队头出队;2----队尾出队;0----返回\\n\"); scanf(\"%d\ switch (i) { case 1: outQueue_front(&p); //队头出队 break; case 2: outQueue_rear(&p); break; case 0: j = 0; break; default : j = 1; break; } //队尾出队 } } 因篇幅问题不能全部显示,请点此查看更多更全内容