//不设头指针只有尾指针的链表存储的循环队列
//蓝瘦
#ifndef PCH_H
#define PCH_H
#include<cstdlib>
#include<stdio.h>
#include<malloc.h>
#include<iostream>
constexpr auto MAXSIZE = 100;
constexpr auto OK = 1;
constexpr auto ERROR = 0;
typedef int Status;
typedef struct QNode
{
int data;
struct QNode *next;
}QNode,* QueuePtr;
typedef struct
{//链队需要分别指示队头和队尾的指针才能被唯一确定
QueuePtr rear;
}LinkQueue;
// TODO: 添加要在此处预编译的标头
Status InitQueue(LinkQueue &Q);
Status ClearQueue(LinkQueue &Q);//置空队列
Status EmptyQueue(LinkQueue Q);
Status EnQueue(LinkQueue &Q,int e);
Status DeQueue(LinkQueue &Q, int &e);
int GetHead(LinkQueue Q);
#endif //PCH_H
---------------------------------------------------------
// pch.cpp: 与预编译标头对应的源文件;编译成功所必需的
#include "pch.h"
// 一般情况下,忽略此文件,但如果你使用的是预编译标头,请保留它。
Status InitQueue(LinkQueue &Q)
{
Q.rear= (QNode *)malloc(sizeof(QNode));//给头结点分配地址
if (!Q.rear) return ERROR;
Q.rear->next = Q.rear;//循环链队kara
return OK;
}
Status ClearQueue(LinkQueue & Q)
{//应该不用把头结点置空?毕竟是决定链表的标志
if (EmptyQueue(Q)) return OK;
QNode *q, *r;
q = Q.rear->next->next;
while (q!=Q.rear)
{
r = q;
q = q->next;
free(r);
r = NULL;
};
r = q;
q = q->next;
free(r);
r = NULL;
Q.rear = q;
Q.rear->next = Q.rear;
return OK;
}
Status EmptyQueue(LinkQueue Q)
{
if (Q.rear->next == Q.rear) return OK;
return ERROR;
}
Status EnQueue(LinkQueue & Q, int e)
{//入队
QNode *q= (QueuePtr)malloc(sizeof(QNode));
q->data= e;
q->next = Q.rear->next;
Q.rear->next = q;
Q.rear = q;
return OK;
}
Status DeQueue(LinkQueue & Q, int & e)
{//出队
if (EmptyQueue(Q))return ERROR;
QNode *r;
e = Q.rear->next->next->data;
r = Q.rear->next->next;
Q.rear->next->next = r->next;
delete r;
return OK;
}
int GetHead(LinkQueue Q)
{
return Q.rear->next->next->data;
}
--------------------------------------------------------
// ConsoleApplication6.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include <iostream>
int main()
{
LinkQueue Q;
InitQueue(Q);
int e;
std::cout << "put in data,push 0 to over:";
std::cin >> e;
while (e!= 0)
{
EnQueue(Q, e);
std::cin >> e;
}
std::cout << "出队2个元素!";
DeQueue(Q, e); std::cout << e<<",";
DeQueue(Q, e); std::cout << e;
std::cout << "执行队列清空:";
if (ClearQueue(Q))std::cout << "清空完毕!返回值:"<< EmptyQueue(Q);
else std::cout << "清空失败!";
}
带头结点的循环链队
最新推荐文章于 2025-05-27 14:14:42 发布