鏈隊列——隊列的鏈式表示和實現

隊列的鏈式表示:

#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;
} 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章