链队列的基本操作

实验5、链队列的基本操作

(1)实验目的

通过该实验,使学生理解链队列的构造特点并灵活应用,掌握链队基本操作的编程实现,认识栈是在一端进行插入,在另一端进行删除集中操作的线性结构,掌握队列的“先入先出”操作特点,知道判断队列空和满的条件,进一步熟悉C语言中指针操作。

(2)实验内容

用链式存储结构,实现教材定义的队列的基本操作。

(3)参考界面

菜单中包括以下功能:

1.初始化队列,2.销毁队列,3.清空队列,4. 队列判空,5.求队列长度,6.获取队头元素,7.插入一个 元素,8.删除一个元素,9输出所有元素。

要求:自定义的函数中不允许出现提示语和输出语句。

(4)验收/测试用例

通过菜单调用各个操作,测试点:

  1. 没有初始化前进行其他操作,程序是否能控制住;
  2. 初始化一个队列;
  3. 判队列空,屏幕显示队列为空;
  4. 3个数入队, 3、5、7;
  5. 队头长度,屏幕输出3;
  6. 取队头元素,再判队列是否空,然后再判队列长度,(让学生知道取队头元素不改变队列中的内容,队头指针不发生改变);
  7. 出队,再判队列长度和显示队列中剩余的元素;(多次出队,队列为空之后再执行出队操作,是否提示队列为空);
  8. 入队一个元素2,再出队,再判断队列是否为空,(主要测试出队操作中特殊情况下的那两行代码是否写了);
  9. 销毁队,再做其他操作,判断程序是否能控制。

 

 

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

 

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

invincible_Tang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值