#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("\n队列为空\n");
return ERROR;
}
QNode *p = Q.front->next;
printf("\n队列中的元素是:");
while(p)
{
visit(*p);
p = p->next;
}
return OK;
}//遍历队列
void PrintNode(QNode node)
{
printf("%d ", node.data);
}//打印node数据
void PrintMenu()
{
printf("\n 链队列基本操作 \n");
printf("\n ------------------- \n");
printf("\n* 1-入队 *\n");
printf("\n* 2-出队 *\n");
printf("\n* 3-遍历 *\n");
printf("\n* 4-清空队列 *\n");
printf("\n* 5-求队列长度 *\n");
printf("\n* 6-取队头元素 *\n");
printf("\n* 0-退出 *\n");
printf("\n ------------------- \n");
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("菜单号输入错误,请重新输入!\n");
}while(cdh < 0 || cdh > 6);
switch(cdh)
{
case 0:
z = 0; break;
case 1://入队
printf("请输入入队元素:");
scanf("%d", &e);
if(EnQueue(Q, e))
printf("\n元素%d入队成功!\n",e);
else
printf("\n元素%d入队失败!\n",e);
break;
case 2://出队
if(DeQueue(Q, e))
printf("\n出队成功!出队元素是%d\n",e);
else
printf("\n出队失败!\n");
break;
case 3://遍历
QueueTraves(Q, PrintNode);
putchar('\n');
break;
case 4://清空队列
if(ClearQueue(Q))
printf("\n清空队列成功!\n");
else
printf("\n清空队列失败!\n");
break;
case 5 ://求队长
printf("\n队列长度是:%d\n",QueueLength(Q));
break;
case 6 ://取队头元素
if(GetHead(Q, e))
printf("队头元素是:%d\n",e);
else
printf("取队头元素失败!\n");
break;
}
}
return 0;
}