实验6验证链队列的基本操作(含效果与源码)

本博文源于上课的第六周,内容是:验证队列的基本操作(严书的3.16,3.17,3.18)这三个操作的实现,三个操作分别是初始化、入队、出队。内容比较中规中矩,对书上的内容较为普通的实现。

测试效果

在这里插入图片描述

完整源码

#include<iostream>
#define OK 1
#define ERROR 0
using namespace std;
typedef int QElemType;
typedef int Status;

typedef struct QNode{
    
    
    QElemType data;
    struct QNode* next;
}QNode,*QueuePtr;

typedef struct{
    
    
    QueuePtr front;
    QueuePtr rear;
}LinkQueue;
/*
3.16
①生成新节点作为头结点,队头和队尾指针指向此结点
②头结点的指针域置为空
*/
Status InitQueue(LinkQueue &Q){
    
    
    Q.front = Q.rear = new QNode; //生成新结点,队头和队尾指针分配内存空间
    Q.front->next = NULL;         //头结点指针域置为空
    return OK;
}
/*
3.17 链队1入队
①为入队元素分配结点空间,用指针p指向
②为新结点数据域置为e
③为新结点插入到队尾。
④修改队尾指针为p
*/
Status EnQueue(LinkQueue &Q,QElemType e){
    
    
    QueuePtr p = new QNode;  //为入队元素分配结点空间
    p->data = e;             //为新结点数据域置为e
    p->next = NULL;          //将新结点插入到队尾
    Q.rear->next = p;
    Q.rear = p;              //修改队尾指针
    return OK;
}

/*
3.18 链队出队
①判断队列是否为空,若空则返回ERROR
②临时保存队头元素的空间,以备释放
③修改队头指针,指向下一个结点.
④判断出队元素是否为最后一个元素,若是则将队尾指针重新赋值,指向头结点
⑤释放原队头元素的空间
*/

Status Dequeue(LinkQueue &Q,QElemType &e){
    
    
    if(Q.front == Q.rear) return ERROR; //若队列空,则返回ERROR
    QueuePtr p = Q.front->next;         //p指向队头元素
    e = p->data;                        //e保存队头元素的值
    Q.front->next = p->next;            //修改头指针
    if(Q.rear == p) Q.rear = Q.front;   //最后一个元素被删,队尾指针指向头结点
    delete p;                           //释放原队头元素的空间
    return OK;
}

int main(){
    
    
    LinkQueue Q;
    InitQueue(Q);                       //链队初始化操作
    if(Q.front->next == NULL){
    
    
        cout << "Init success!" << endl;    //链队初始化验证操作
    }
    EnQueue(Q,2);                    //链队入队操作  
    QElemType  e; 
    Dequeue(Q,e);                    //链队出队操作
    cout << "Dequeue element:" << e << endl;//打印测试效果
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_37149062/article/details/123932578