本博文源于上课的第六周,内容是:验证队列的基本操作(严书的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;
}