//隊列的一些基本操作
/*
1,構造一個空隊列InitQueue(LinkQueue &Q)
2,銷毀隊列Q
3,將Q清為空隊列
4,若隊列Q為空隊列,則返回TRUE,否則返回FALSE
5,返回Q元素的個數,即隊列的長度
6,返回隊列的隊頭元素
7,插入e為隊列的新的隊尾元素
8,刪除隊列的隊頭元素
9,依次輸出隊列中的每一個元素
*/
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status; //函數結果狀態類型
typedef int QElemType; //數據元素類型
typedef struct QNode
{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front; //隊頭指針
QueuePtr rear; //隊尾指針
}LinkQueue;
//構造一個空隊列Q
Status InitQueue(LinkQueue &Q)
{
Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
if(!Q.front)
exit(OVERFLOW);
Q.front->next = NULL;
return OK;
}
//插入元素e為Q的新的隊尾元素
Status EnQueue(LinkQueue &Q,QElemType e)
{
QueuePtr p;
p = (QueuePtr)malloc(sizeof(QNode));
if(!p)
exit(OVERFLOW);
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
return OK;
}
//定義QueueLength(LinkQueue Q)函數,返回隊列中元素的個數
Status QueueLength(LinkQueue Q)
{
int i = 0;
while(Q.front->next)
{
Q.front = Q.front->next;
i++;
}
return i;
}
//定義QueueEmpty(LinkQueue Q)函數,若隊列為空,則返回TRUE,否則返回FLASE
Status QueueEmpty(LinkQueue Q)
{
if(Q.front == Q.rear)
{
printf("隊列為空...\n");
return TRUE;
}
else
{
printf("隊列不為空...\n");
return FALSE;
}
}
//若隊列不為空,則用e返回Q的隊頭元素
Status GetHead(LinkQueue &Q,QElemType &e)
{
QueuePtr p;
if(Q.front == Q.rear)
return ERROR;
p = Q.front->next;
e = p->data;
return e;
}
//依次輸出隊列中的每一個元素
Status Foreach(LinkQueue &Q)
{
QueuePtr p;
if(!Q.front)
exit(OVERFLOW);
p = Q.front->next;
while(p)
{
printf("%3d",p->data);
p = p->next;
}
return OK;
}
//若隊列不空,則刪除Q的隊頭元素,用e返回其值,並返回OK;
//否則返回ERROR
Status DeQueue(LinkQueue &Q,QElemType &e)
{
QueuePtr p;
if(!Q.front)
exit(OVERFLOW);
p = Q.front->next;
e = p->data;
//printf("e=%d",e);
Q.front->next = p->next;
if(Q.rear == p)
Q.rear = Q.front;
free(p);
return e;
}
//清空一個隊列
Status ClearQueue(LinkQueue &Q)
{
Q.front = Q.rear;
return OK;
}
//銷毀一個隊列Q
Status DestroyQueue(LinkQueue &Q)
{
while(Q.front)
{
Q.rear = Q.front->next;
free(Q.front);
Q.front = Q.rear;
}
return OK;
}
//主函數
int main()
{
LinkQueue q;
int n,i,e;
//調用InitQueue(LinkQueue &Q)函數,構造一個空隊列
InitQueue(q);
printf("隊列已創建好...");
printf("\n");
//調用EnQueue(LinkQueue &Q,QElemType e)函數,插入新的隊尾元素
printf("請輸入入隊列元素的個數:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("Please input a integer number:");
scanf("%d",&e);
EnQueue(q,e);
}
printf("\n");
//調用QueueLength(LinkQueue Q)函數,輸出隊列中元素的個數
printf("隊列中的元素個數(即隊列的長度)是;%d",QueueLength(q));
printf("\n");
//調用GetHead(LindQueue &Q,QElemType &e)函數,輸出隊頭元素
printf("隊頭元素是:%d",GetHead(q,e));
printf("\n");
//調用Foreach(LinkQueue &Q)函數,依次輸出隊列中的每一個元素
printf("遍歷隊列元素:");
Foreach(q);
printf("\n");
//調用DeQueue(LinkQueue &Q,QElemType &e)函數,刪除隊頭的元素,並打印出來
printf("被刪除的隊頭元素是:%d",DeQueue(q,e));
printf("\n");
//調用ClearQueue(LinkQueue &Q)函數,清空隊列
ClearQueue(q);
printf("隊列已被清空...");
printf("\n");
//再次遍歷隊列
printf("再次遍歷隊列的結果是...");
Foreach(q);
printf("\n");
//調用DestroyQueue(LinkQueue &Q)函數,銷毀一個隊列Q
printf("隊列已被銷毀...");
DestroyQueue(q);
printf("\n");
return 0;
}

