实验5、链队列的基本操作 (1)实验目的 通过该实验,使学生理解链队列的构造特点并灵活应用,掌握链队基本操作的编程实现,认识栈是在一端进行插入,在另一端进行删除集中操作的线性结构,掌握队列的“先入先出”操作特点,知道判断队列空和满的条件,进一步熟悉C语言中指针操作。 (2)实验内容 用链式存储结构,实现教材定义的队列的基本操作。 (3)参考界面 菜单中包括以下功能: 1.初始化队列,2.销毁队列,3.清空队列,4. 队列判空,5.求队列长度,6.获取队头元素,7.插入一个 元素,8.删除一个元素,9输出所有元素。 要求:自定义的函数中不允许出现提示语和输出语句。 (4)验收/测试用例 通过菜单调用各个操作,测试点:
|
#include <iostream>
using namespace std;
struct Node{
int data;
Node* next;
};
struct Queue{
Node* front;
Node* rear;
};
// 初始化队列
void InitQueue(Queue& q){
q.front = nullptr;
q.rear = nullptr;
}
// 销毁队列
void DestroyQueue(Queue& q){
Node* current = q.front;
while(current != nullptr){
Node* temp = current;
current = current->next;
delete temp;
}
q.front = nullptr;
q.rear = nullptr;
}
// 清空队列
void ClearQueue(Queue& q){
Node* current = q.front;
while(current != nullptr){
Node* temp = current;
current = current->next;
delete temp;
}
q.front = nullptr;
q.rear = nullptr;
}
// 队列判空
bool IsEmpty(Queue q){
return q.front == nullptr;
}
// 求队列长度
int GetLength(Queue q){
Node* current = q.front;
int length = 0;
while(current != nullptr){
length++;
current = current->next;
}
return length;
}
// 获取队头元素
bool GetFront(Queue q, int& element){
if(q.front != nullptr){
element = q.front->data;
return true;
}
return false;
}
// 插入一个元素到队尾
void Enqueue(Queue& q, int element){
Node* newNode = new Node;
newNode->data = element;
newNode->next = nullptr;
if(q.rear == nullptr){
q.front = newNode;
q.rear = newNode;
}
else{
q.rear->next = newNode;
q.rear = newNode;
}
}
// 删除队头元素
bool Dequeue(Queue& q){
if(q.front != nullptr){
Node* temp = q.front;
q.front = q.front->next;
if(q.front == nullptr){ // 队列为空
q.rear = nullptr;
}
delete temp;
return true;
}
return false;
}
// 输出所有元素
void PrintQueue(Queue q){
Node* current = q.front;
while(current != nullptr){
cout << current->data << " ";
current = current->next;
}
cout << endl;
}
int main(){
Queue q;
int choice;
int element;
cout << "菜单中包括以下功能:" << endl;
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 << "0. 退出" << endl;
cout << "请选择操作:";
do { cin >> choice;
switch (choice) {
case 1:
InitQueue(q);
cout << "队列已初始化" << endl;
break;
case 2:
DestroyQueue(q);
cout << "队列已销毁" << endl;
break;
case 3:
ClearQueue(q);
cout << "队列已清空" << endl;
break;
case 4:
if(IsEmpty(q)){
cout << "队列为空" << endl;
}
else{
cout << "队列非空" << endl;
}
break;
case 5:
cout << "队列长度为:" << GetLength(q) << endl;
break;
case 6:
if(GetFront(q, element)){
cout << "队头元素为:" << element << endl;
if(IsEmpty(q)){
cout << "队列非空" << endl;
}
}
else{
cout << "队列为空,无队头元素" << endl;
}
break;
case 7:
cout << "请输入要插入的元素:";
cin >> element;
Enqueue(q, element);
cout << "元素已插入"<<endl;
break;
case 8:
Dequeue(q);
break;
case 9:
PrintQueue(q);
break;
default:
if(choice==0){
cout<<"程序已结束";
break;
}
}
}while(choice!=0);
}