#include<stdio.h> #include<stdlib.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -1 typedef struct QNode { int data; struct QNode *next; }QNode, *QueuePtr; typedef struct { QueuePtr front, rear; }LinkQueue; int InitQueue(LinkQueue &Q) { Q.front = Q.rear = (QNode *)malloc(sizeof(QNode)); if(!Q.front)exit(OVERFLOW); Q.front->next = NULL; return OK; }//队列初始化 int DestroyQueue(LinkQueue &Q) { while(Q.front) { Q.rear = Q.front->next; free(Q.front); Q.front = Q.rear; } return OK; }//销毁队列 int ClearQueue(LinkQueue &Q) { QNode *p = Q.front -> next; while(p) { p = p->next; free(Q.front->next); Q.front->next = p; } Q.rear = Q.front; return OK; }//清空队列 int QueueEmpty(LinkQueue Q) { if(Q.front == Q.rear) return TRUE; return FALSE; } int QueueLength(LinkQueue Q) { if(Q.front == Q.rear) return 0; int j = 0; QNode *p = Q.front->next; while(p) { p = p->next; j++; } return j; }//求队长 int GetHead(LinkQueue Q, int e) { if(Q.front == Q.rear) return ERROR; e = Q.front->next->data; return OK; }//取队头元素 int EnQueue(LinkQueue &Q, int e) { QNode *p = (QNode *)malloc(sizeof(QNode)); if(!p) exit(OVERFLOW); p->data = e; p->next = NULL; Q.rear->next = p; Q.rear = p; return OK; }//入队 int DeQueue(LinkQueue &Q, int &e) { if(Q.front == Q.rear) return ERROR; 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; }//出队 int QueueTraves(LinkQueue Q, void (*visit)(QNode node)) { if(Q.front == Q.rear) { printf(" 队列为空 "); return ERROR; } QNode *p = Q.front->next; printf(" 队列中的元素是:"); while(p) { visit(*p); p = p->next; } return OK; }//遍历队列 void PrintNode(QNode node) { printf("%d ", node.data); }//打印node数据 void PrintMenu() { printf(" 链队列基本操作 "); printf(" ------------------- "); printf(" * 1-入队 * "); printf(" * 2-出队 * "); printf(" * 3-遍历 * "); printf(" * 4-清空队列 * "); printf(" * 5-求队列长度 * "); printf(" * 6-取队头元素 * "); printf(" * 0-退出 * "); printf(" ------------------- "); printf("请选择菜单号(0-6):"); } int main() { LinkQueue Q; InitQueue(Q); int e, z = 1, cdh; while(z) { do { PrintMenu(); scanf("%d", &cdh); if(cdh < 0 || cdh > 6) printf("菜单号输入错误,请重新输入! "); }while(cdh < 0 || cdh > 6); switch(cdh) { case 0: z = 0; break; case 1://入队 printf("请输入入队元素:"); scanf("%d", &e); if(EnQueue(Q, e)) printf(" 元素%d入队成功! ",e); else printf(" 元素%d入队失败! ",e); break; case 2://出队 if(DeQueue(Q, e)) printf(" 出队成功!出队元素是%d ",e); else printf(" 出队失败! "); break; case 3://遍历 QueueTraves(Q, PrintNode); putchar(' '); break; case 4://清空队列 if(ClearQueue(Q)) printf(" 清空队列成功! "); else printf(" 清空队列失败! "); break; case 5 ://求队长 printf(" 队列长度是:%d ",QueueLength(Q)); break; case 6 ://取队头元素 if(GetHead(Q, e)) printf("队头元素是:%d ",e); else printf("取队头元素失败! "); break; } } return 0; }