資料結構實驗5、鏈佇列的基本操作

henu_Scarlett發表於2020-11-11

作者說:

這個實驗就是關於佇列的鏈式儲存結構,只要牢牢把握一點:

佇列的特點是:先進先出,再利用指標、連結串列等相關知識,就可以完成實驗了。

提示:

佇列的相關演算法在資料結構課本(就那個紫皮兒的書)第三章  佇列那一節,有書的朋友們可以去看看,還有很多值得研究、品味的演算法。


一、執行效果截圖

二、實驗要求

(1)實驗目的

通過該實驗,使學生理解鏈佇列的構造特點並靈活應用,掌握鏈隊基本操作的程式設計實現,認識佇列是在一端進行插入,在另一端進行刪除集中操作的線性結構,掌握佇列的“先入先出”操作特點,知道判斷佇列空和滿的條件,進一步熟悉C語言中指標操作。

(2)實驗內容

用鏈式儲存結構,實現教材定義的佇列的基本操作。

(3)參考介面

選單中包括以下功能:

1.初始化佇列

2.銷燬佇列

3.清空佇列

4.佇列判

5.求佇列長度

6.獲取隊頭元素

7.插入一個 元素

8.刪除一個元素

9.輸出所有元素

要求自定義的函式中不允許出現提示語和輸出語句。

(4)驗收/測試用例

通過選單呼叫各個操作,測試點:

  • 沒有初始化前進行其他操作,程式是否能控制住;
  • 初始化一個佇列;
  • 判佇列空,螢幕顯示佇列為空;
  • 3個數入隊, 3、5、7;
  • 長度,螢幕輸出3;
  • 取隊頭元素,再判佇列是否空,然後再判佇列長度,(讓學生知道取隊頭元素不改變佇列中的內容,隊頭指標不發生改變);
  • 出隊,再判佇列長度和顯示佇列中剩餘的元素;(多次出隊,佇列為空之後再執行出隊操作,是否提示佇列為空);
  • 入隊一個元素2,再出隊,再判斷佇列是否為空,(主要測試出隊操作中特殊情況下的那兩行程式碼是否寫了);
  • 銷燬隊,再做其他操作,判斷程式是否能控制。

三、程式碼示例

/*
有關這個實驗的演算法在資料結構課本第三章佇列那一節,但是書上不是很全,
不過看懂了那幾個操作之後,剩下的就比較好完成了,主要記住一點,
就是:佇列的特點是先進先出。
掌握這一點,其他的就只需要靠指標的操作就可以了。 
*/
#include<iostream>
#include<stdlib.h>
using namespace std;

typedef int Qelemtype;

typedef struct Qnode{
	Qelemtype data;
	struct Qnode *next;
}Qnode,*Queueptr;

typedef struct{
	Queueptr front;//隊頭指標。 
	Queueptr rear; //隊尾指標。 
}Linkqueue;

Linkqueue Queue;

void InitQueue(Linkqueue &Q);//1.初始化佇列。 
void DestroyQueue(Linkqueue &Q);//2.銷燬佇列。 
void ClearQueue(Linkqueue &Q);//3.清空佇列。 
int QueueEmpty(Linkqueue Q);//4. 佇列判空。 
int QueueLength(Linkqueue Q);//5.求佇列長度。 
Qelemtype GetHead(Linkqueue Q);//6.獲取隊頭元素。 
Qelemtype EnQueue(Linkqueue &Q,Qelemtype e);//7.插入一個元素。 
Qelemtype DeQueue(Linkqueue &Q);//8.刪除一個元素。 
Qelemtype QueueTraverse(Linkqueue Q,Queueptr p);//9輸出所有元素。 

int main()
{
	Queue.front=NULL;
    Queue.rear=NULL;
	int in=1;
	int which;
	Qelemtype yuansu;
	cout<<endl;
	cout<<"☆☆☆歡迎使用鏈佇列小程式☆☆☆"<<endl;
	cout<<"author---Henan University.software engineering.李思佳"<<endl<<endl;		
	while(in==1)
	{	
	cout<<"1.初始化佇列"<<endl;
	cout<<"2.銷燬佇列"<<endl;
	cout<<"3.清空佇列"<<endl;
	cout<<"4.佇列判空"<<endl;
	cout<<"5.求佇列長度"<<endl;
	cout<<"6.獲取隊頭元素"<<endl;
	cout<<"7.插入一個元素"<<endl;
	cout<<"8.刪除一個元素"<<endl;
	cout<<"9.輸出所有元素"<<endl;
	cout<<"☆☆☆退出,輸入一個負數!☆☆☆"<<endl<<endl;
	cout<<"請輸入您的選擇:";
	cin>>which;
	switch(which)
	{
		case 1://1.初始化佇列
			system("cls");
			InitQueue(Queue);
			if(!Queue.front)
			{
				cout<<"儲存分配失敗,請重新操作!"<<endl;
			}
			else
			{
				cout<<"您已成功初始化一個佇列!"<<endl;
			}			
			cout<<endl;
			break;
			
		case 2://2.銷燬佇列。
			system("cls");
			if(!Queue.front)
			{
				cout<<"您還未初始化一個佇列,請先初始化!"<<endl;
			}
			else
			{
				DestroyQueue(Queue);
				if(!Queue.front)
				{
					cout<<"您已成功銷燬佇列!"<<endl; 
				}
				else
				{
					cout<<"銷燬佇列失敗,請重新操作!"<<endl;
				}
			}
			cout<<endl;
			break;
			
		case 3://3.清空佇列。 
			system("cls");
			if(!Queue.front)
			{
				cout<<"您還未初始化一個佇列,請先初始化!"<<endl;
			}
			else
			{
				if(Queue.front==Queue.rear)
				{
					cout<<"佇列為空,沒有元素可以清空!"<<endl;
				}
				else
				{
					ClearQueue(Queue);
					cout<<"已經成功清空佇列!"<<endl;
				}
			}
			cout<<endl;
			break;
			
		case 4://4. 佇列判空。
			system("cls");
			if(!Queue.front)
			{
				cout<<"您還未初始化一個佇列,請先初始化!"<<endl;
			}
			else
			{
				if(QueueEmpty(Queue)==000)
				{
					cout<<"佇列為空!"<<endl;
				}
				if(QueueEmpty(Queue)==111)
				{
					cout<<"佇列不為空!"<<endl;
				}
			}
			cout<<endl;
			break;
		case 5://5.求佇列長度。
			system("cls");
			if(!Queue.front)
			{
				cout<<"您還未初始化一個佇列,請先初始化!"<<endl;
			}
			else
			{
				cout<<"佇列的長度為:"<<QueueLength(Queue)<<endl;
			}
			cout<<endl;
			break;
			
		case 6://6.獲取隊頭元素。
			system("cls");
			if(!Queue.front)
			{
				cout<<"您還未初始化一個佇列,請先初始化!"<<endl;
			}
			else
			{
				if(Queue.front==Queue.rear)
			    {
				    cout<<"佇列為空,沒有隊頭元素!"<<endl;
			    }
			    else
			    {
			    	cout<<"隊頭元素為:"<<GetHead(Queue)<<endl;
			    }
			} 
			cout<<endl;
			break;
			
		case 7://7.插入一個元素。
			system("cls");
			if(!Queue.front)
			{
				cout<<"您還未初始化一個佇列,請先初始化!"<<endl;
			}
			else
			{
				cout<<"請輸入您要插入的元素:";
				cin>>yuansu;
				Qelemtype aa=EnQueue(Queue,yuansu);
				if(aa==-999)
				{
					cout<<"記憶體分配失敗,元素插入不成功,請重新操作!"<<endl;
				}
				if(aa==999)
				{
					cout<<"元素"<<yuansu<<"入隊成功!"<<endl; 
				}
			}
			cout<<endl;
			break;
			
		case 8://8.刪除一個元素。 
			system("cls");
			if(!Queue.front)
			{
				cout<<"您還未初始化一個佇列,請先初始化!"<<endl;
			}
			else
			{
				if(Queue.front==Queue.rear)
				{
					cout<<"佇列為空,沒有元素可以出隊!"<<endl;
				}
				else
				{
					cout<<"元素"<<DeQueue(Queue)<<"出隊成功!"<<endl;
				}				
			}
			cout<<endl;
			break;
			
		case 9://9.輸出所有元素。 
			system("cls");
			if(!Queue.front)
			{
				cout<<"您還未初始化一個佇列,請先初始化!"<<endl;
			}
			else
			{
				if(Queue.front==Queue.rear)
				{
					cout<<"佇列為空,沒有元素可以輸出!"<<endl;
				}
				else
				{
					Queueptr q=Queue.front;					
					cout<<"佇列中的元素為:";
					while(q!=Queue.rear)
					{	
					    q=q->next;				
						cout<<QueueTraverse(Queue,q)<<" ";					
					}					
				}												
			} 
			cout<<endl<<endl;
			break;
		default:
			system("cls");
			if(which<0)
			{
				cout<<"☆☆☆您已退出程式,歡迎下次使用!☆☆☆"<<endl;
				in=-999;
			}
			else
			{
				cout<<"您輸入的選擇不正確,請重新輸入哦!"<<endl;
			}
			cout<<endl;
			break;
	}
	}	
}


//1.初始化佇列。 
void InitQueue(Linkqueue &Q)
{
	Q.front=Q.rear=(Queueptr)malloc(sizeof(Qnode));
	Q.front->next=NULL;
}

//2.銷燬佇列。
void DestroyQueue(Linkqueue &Q)
{
	while(Q.front)
	{
		Q.rear=Q.front->next;
		free(Q.front);
		Q.front=Q.rear;
	}
	Q.front=Q.rear=NULL;
}


//3.清空佇列。 
void ClearQueue(Linkqueue &Q)
{
	Queueptr p,q;
	p=q=Q.front->next;
	while(p)
	{
		Q.front->next=p->next;
		p=p->next;
		free(q);
		q=p;
	}
	Q.front=Q.rear;
}



//4. 佇列判空。
int QueueEmpty(Linkqueue Q)
{
	if(Q.front==Q.rear)
	{
		return 000;//為空。 
	}
	else
	{
		return 111;//不為空。 
	}
}


//5.求佇列長度。
int QueueLength(Linkqueue Q)
{
	int jishu=0;
	Queueptr p=Q.front;
	while(p!=Q.rear)
	{
		jishu++;
		p=p->next;
	}
	return jishu;
}


//6.獲取隊頭元素。
Qelemtype GetHead(Linkqueue Q)
{
	return Q.front->next->data;
}

//7.插入一個元素。
Qelemtype EnQueue(Linkqueue &Q,Qelemtype e)
{
	Queueptr p=(Queueptr)malloc(sizeof(Qnode));
	if(!p){
		return -999;		
	}
	p->data=e;
	p->next=NULL;
	Q.rear->next=p;
	Q.rear=p;
	return 999;
}

//8.刪除一個元素。
Qelemtype DeQueue(Linkqueue &Q)
{
	Queueptr p=Q.front->next;
	Q.front->next=p->next;
	Qelemtype e;
	e=p->data;
	if(p==Q.rear)
	{
		Q.front=Q.rear;
	}
	free(p);
	return e;
}

//9.輸出所有元素。
Qelemtype QueueTraverse(Linkqueue Q,Queueptr p)
{
	return p->data;
}

 

相關文章