本博文源于数据结构一轮复习基础,主要是对王卓老师的数据结构进行测试实现,如果有需要的读者可以收藏,谢谢。
1、队列链式存储结构定义
两个结构体,一个结构体data,next,另外一个结构体的类型rear和front。
typedef struct QNode{
QElemType data;
struct QNode *next;
}QNode,*QuenePtr;
//队头指针指向链表的头部
//队尾指针指向队列的尾部
typedef struct{
QuenePtr front;//队头指针
QuenePtr rear;//队尾指针
}LinkQueue;
2、初始化链式队列
步骤如下:
- 创建结点,并判断是否成功
- front与rear同时指向他,
- 头指针下一条指向NULL
- 返回OK
Status InitQueue(LinkQueue &Q){
Q.front = Q.rear = new QNode;
// Q.front = Q.rear = (QuenePtr) malloc(sizeof(QNode));
if(!Q.front) exit(OVERFLOW);
Q.front->next = NULL;
return OK;
}
3、入队
跟单链表一样,创建一个结点,data,next赋值好,然后让rear的next指向新创建的节点,新创建结点指向rear
Status EnQueue(LinkQueue &Q,QElemType e){
QNode *p = new QNode;
if(!p)exit(OVERFLOW);
p->next = NULL;
p->data = e;
Q.rear->next = p;
Q.rear = p;
return OK;
}
4、出队
出队的话主要是队头出队,因此改一下front的下一条地址就行,如果直接是尾巴元素,记得让front指向rear
Status DeQueue(LinkQueue &Q,QElemType &e){
if(IsEmpty(Q)) return ERROR;
QNode* p = Q.front->next;
e = p->data;
Q.front->next = p->next;
if(Q.rear==p) Q.rear = Q.front;//删除恰好是尾结点
free(p);
return OK;
}
5、队列是否为空
直接判断rear和front同时指向
Status IsEmpty(LinkQueue Q){
if(Q.front==Q.rear) return TRUE;
else return FALSE;
}
6、获取队列头元素
队头元素,先判定队列是否为空,然后获取front的值
Status GetHead(LinkQueue Q,QElemType &e){
if(IsEmpty(Q)) return ERROR;
e = Q.front->next->data;
}
7、销毁队列
销毁队列从头销毁,跟单链表一样,
Status DestroyQueue(LinkQueue &Q){
while(Q.front){
QNode* p = Q.front->next;
free(Q.front);
Q.front = p;
}
return OK;
}
测试效果
完整代码
#include<iostream>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define MAXQSIZE 10
using namespace std;
typedef int Status;
typedef int QElemType;
typedef struct QNode{
QElemType data;
struct QNode *next;
}QNode,*QuenePtr;
//队头指针指向链表的头部
//队尾指针指向队列的尾部
typedef struct{
QuenePtr front;//队头指针
QuenePtr rear;//队尾指针
}LinkQueue;
//链式队列初始化
Status InitQueue(LinkQueue &Q){
Q.front = Q.rear = new QNode;
// Q.front = Q.rear = (QuenePtr) malloc(sizeof(QNode));
if(!Q.front) exit(OVERFLOW);
Q.front->next = NULL;
return OK;
}
Status IsEmpty(LinkQueue Q){
if(Q.front==Q.rear) return TRUE;
else return FALSE;
}
//销毁链式队列
Status DestroyQueue(LinkQueue &Q){
while(Q.front){
QNode* p = Q.front->next;
free(Q.front);
Q.front = p;
}
return OK;
}
//链队列入队
Status EnQueue(LinkQueue &Q,QElemType e){
QNode *p = new QNode;
if(!p)exit(OVERFLOW);
p->next = NULL;
p->data = e;
Q.rear->next = p;
Q.rear = p;
return OK;
}
//队列出队
Status DeQueue(LinkQueue &Q,QElemType &e){
if(IsEmpty(Q)) return ERROR;
QNode* p = Q.front->next;
e = p->data;
Q.front->next = p->next;
if(Q.rear==p) Q.rear = Q.front;//删除恰好是尾结点
free(p);
return OK;
}
Status GetHead(LinkQueue Q,QElemType &e){
if(IsEmpty(Q)) return ERROR;
e = Q.front->next->data;
}
int main(){
LinkQueue Q;
InitQueue(Q);
cout << "after init,Is Queue empty? 1 represent yes:" << IsEmpty(Q) << endl;
for(int i=0;i<5;i++){
EnQueue(Q,i+1);
}
QElemType e;
GetHead(Q,e);
cout << "get queue head value: " << e << endl;
DeQueue(Q,e);
cout << "delete 1 queue value: " << e << endl;
DestroyQueue(Q);
bool flag = false;
if(!Q.front){
flag = true;
}
cout << "destroy Q,if Q.front is NULL:1 NULL 0 not NULL: " << flag << endl;
return 0;
}