隊列的鏈式表示:
#include<cstdio>
#include<cstdlib>
#define QElemType int
#define Status int
using namespace std;
//鏈隊的結構 (數據域和指針域)
typedef struct QNode{
QElemType data; //數據域
struct QNode *next; //指針域
}QNode, *QueuePtr;
//鏈隊頭尾指針結構
typedef struct {
QueuePtr front; //隊頭指針(出隊)
QueuePtr rear; //隊尾指針 (入隊)
}LinkQueue;
//初始化
Status InitQueue(LinkQueue &Q){
Q.front = Q.rear = new QNode; //新建頭結點,隊頭隊尾均指向它
if(!Q.front){
printf("隊列分配內存失敗");
return 0;
}
Q.front->next = NULL;
return 0;
}
//入隊
Status EnQueue(LinkQueue &Q,QElemType e){
QueuePtr p = new QNode; //新建結點
if(!p){
printf("分配內存失敗");
return 0;
}
p->data = e; //新結點賦值
p->next = NULL; //新結點的指針域爲空,(隊尾插入)
Q.rear->next = p; //隊尾指針指向p
Q.rear = p; //隊尾指針後移
printf("入隊成功\n");
return 0;
}
//創建隊列 (重複調用入隊操作)
void CrQueue(LinkQueue &Q,int n){
InitQueue(Q); //初始化隊列
for(int i=0;i<n;i++){ //循環n次EnQueue操作
int e;
scanf("%d",&e);
EnQueue(Q,e);
}
printf("創建成功\n");
}
//出隊
Status DeQueue(LinkQueue &Q,QElemType e){
if(Q.front == Q.rear){ //判空
printf("隊列爲空\n");
return 0;
}
QueuePtr p = Q.front->next; //新建結點獲取隊頭元素
e = p->data; //給e賦值
Q.front->next = p->next; //出隊,重新賦值隊頭結點(Q.front->next)爲下一個結點
/**隊列中的最後一個結點出隊,會導致隊列尾指針丟失,
應該將隊尾指針重新賦值(指向頭指針)
*/if(Q.rear == p)
Q.rear = Q.front;
free(p);
printf("%d出隊成功\n",e);
return 0;
}
//遍歷
Status QueueTraverse(LinkQueue Q){
printf("遍歷開始:");
QueuePtr p = Q.front->next; //隊頭元素之前有一個空的頭結點
while(p != Q.rear->next){ //當p沒有到達隊尾指針
printf("%d ",p->data);
p = p->next;
}
printf("\n");
return 0;
}
//判空
Status QueueEmpty(LinkQueue Q){
if(Q.front == Q.rear){
printf("隊列爲空\n");
return true;
}else{
printf("隊列不爲空\n");
return false;
}
}
//獲取隊列元素個數
int QueueLength(LinkQueue Q){
QueuePtr p = Q.front->next;
int count=0;
while(p != Q.rear->next){ //當p沒有到達隊尾指針
p = p->next;
count++;
}
printf("隊列元素個數爲:%d\n",count);
}
//獲取隊頭元素
Status GetHead(LinkQueue Q,QElemType e){
if(Q.front == Q.rear){
printf("隊列爲空\n");
return 0;
}
e = Q.front->next->data; //隊頭元素之前有一個空的頭結點
printf("隊頭元素爲:%d\n",e);
return 0;
}
//置空
Status ClearQueue(LinkQueue &Q){
Q.rear = Q.front;
printf("置空操作成功\n");
return 0;
}
//銷燬
Status DestoryQueue(LinkQueue &Q){
while(Q.front){
Q.rear = Q.front->next; //將隊尾指針每次都指向隊頭指針的下一個結點
free(Q.front); //釋放隊頭指針
Q.front = Q.rear; //隊頭指針重新賦值
}
printf("銷燬成功\n");
return 0;
}
int main(){
int n;
QElemType value1,value2;
LinkQueue Q;
printf("請輸入隊列元素個數:");
scanf("%d",&n);
CrQueue(Q,n);
GetHead(Q,value1);
QueueLength(Q);
QueueTraverse(Q);
DeQueue(Q,value2);
QueueTraverse(Q);
ClearQueue(Q);
QueueEmpty(Q);
QueueTraverse(Q);
DestoryQueue(Q);
return 0;
}