資料結構實驗5、鏈佇列的基本操作
作者說:
這個實驗就是關於佇列的鏈式儲存結構,只要牢牢把握一點:
佇列的特點是:先進先出,再利用指標、連結串列等相關知識,就可以完成實驗了。
提示:
佇列的相關演算法在資料結構課本(就那個紫皮兒的書)第三章 佇列那一節,有書的朋友們可以去看看,還有很多值得研究、品味的演算法。
一、執行效果截圖
二、實驗要求
(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;
}
相關文章
- 【資料結構】佇列(順序佇列、鏈佇列)的JAVA程式碼實現資料結構佇列Java
- 【php實現資料結構】鏈式佇列PHP資料結構佇列
- php實現基本資料結構之棧、佇列PHP資料結構佇列
- 實驗四 棧和佇列的基本操作佇列
- <資料結構>靜態佇列基本功能實現資料結構佇列
- C語言資料結構:鏈式佇列的建立及其出入隊操作C語言資料結構佇列
- js實現資料結構--佇列JS資料結構佇列
- 資料結構-佇列資料結構佇列
- 【資料結構-----佇列】資料結構佇列
- 資料結構 - 佇列資料結構佇列
- 8-佇列的鏈式儲存結構的操作佇列
- Java版-資料結構-佇列(陣列佇列)Java資料結構佇列陣列
- 資料結構之php實現佇列資料結構PHP佇列
- 資料結構之「佇列」資料結構佇列
- 資料結構-佇列-樹資料結構佇列
- 資料結構-佇列、棧資料結構佇列
- 佇列的鏈式儲存結構的實現佇列
- Java版-資料結構-佇列(迴圈佇列)Java資料結構佇列
- 資料結構-js實現棧和佇列資料結構JS佇列
- 資料結構-迴圈佇列(Python實現)資料結構佇列Python
- Laravel 佇列基本操作Laravel佇列
- 資料結構-棧與佇列資料結構佇列
- js資料結構--佇列(queue)JS資料結構佇列
- 資料結構—棧和佇列資料結構佇列
- JavaScript資料結構03 - 佇列JavaScript資料結構佇列
- JavaScript資料結構之-佇列JavaScript資料結構佇列
- JavaScript資料結構03 – 佇列JavaScript資料結構佇列
- JavaScript資料結構之佇列JavaScript資料結構佇列
- 資料結構筆記——佇列資料結構筆記佇列
- C++資料結構-佇列C++資料結構佇列
- 資料結構之佇列(Queue)資料結構佇列
- 資料結構(棧和佇列)資料結構佇列
- 實戰PHP資料結構基礎之佇列PHP資料結構佇列
- 資料結構與演算法——佇列(環形佇列)資料結構演算法佇列
- 資料結構學習之佇列資料結構佇列
- 重學資料結構(三、佇列)資料結構佇列
- PTA 雙端佇列 資料結構佇列資料結構
- 重學資料結構之佇列資料結構佇列