#include <iostream>
#include <stdlib.h>
#define OVERFLOW -2
//#define true 1
//#define false -1
using namespace std;
typedef int QElemType;
// 结点定义
typedef struct QNode {
QElemType data; // 数据域
struct QNode *next; // 指针域
}*QueuePtr;
// 链队列定义
typedef struct {
QueuePtr front; // 队列的头指针
QueuePtr rear; // 队列的尾指针
int length;
}Queue; // 链队列
//始化链队列为空队列
bool InitQueue(Queue &Q)
{
Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));//为空的标志就是头指针与尾指针相等
if (!Q.front)exit(OVERFLOW);
Q.front->next = NULL;
return true;
}
//新元素 e 入队列,成功返回 true,失败返回 false
bool EnQueue(Queue &Q, QElemType e)
{
QNode *p;//先定义一个指向新结点的指针
p = (QueuePtr)malloc(sizeof(QNode));
if (!p)exit(OVERFLOW);
p->data = e;
p->next = NULL;
Q.rear->next = p;//只能从队尾进
Q.rear = p;//改变尾指针
return true;
}
//出队列,即删除队首元素,并用 e 返回出元素值 ,成功返回 true,失败返回 false
bool DeQueue(Queue &Q, QElemType &e)
{
if (Q.front == Q.rear)
return false;
QNode *p;//指向被删除元素
p = Q.front->next;//因为只能从队列前面删除
e = p->data;
cout << "出队元素是" << e;
Q.front->next = p->next;
if (Q.rear == p)Q.rear = Q.front;//但当队列中最后一个元素被删后,队列尾指针也丢失了,需要将队尾指针指向头结点
free(p);
return e;
}
//读队首元素,用 e 返回队首元素,不出队 ,成功返回 true,失败返回 false
bool GetHead(Queue &Q, QElemType &e)
{
if (Q.front == Q.rear)
return false;//判断是否为空
QNode *p;//指向被删除元素
p = Q.front->next;//因为只能从队列前面删除
e = p->data;
cout << "队首元素是"<<e;
return true;
}
//遍历链队列,将队列数据元素依次输出
void Traverse(Queue Q)
{
while (Q.front!=Q.rear) {//之前一直写的条件是Q.front!=NULL;一直有问题
Q.front = Q.front->next;
cout << Q.front->data << " ";
}
}
//销毁链队列
void Destroy(Queue &Q)
{
while (Q.front)//从头指针出队列删除元素
{
Q.rear = Q.front->next;//先把Q.front指向的下一个指针地址保存到尾指针
free(Q.front);//从前面出队列
Q.front = Q.rear;//头指针改变位置
}
}
int main(void)
{
Queue Lque;
int c = 0;
QElemType e;
while (c != 7)
{
cout << endl << "1. 初始化链队";
cout << endl << "2. 入队";
cout << endl << "3. 出队";
cout << endl << "4. 读队首";
cout << endl << "5. 遍历队列";
cout << endl << "6. 销毁队列";
cout << endl << "7. 退出";
cout << endl << "选择功能(1~7):";
cin >> c;
switch (c)
{
case 1:
{
InitQueue(Lque);
break;
}
case 2:
{
cout << "请输入要入队的元素e";
cin >> e;
EnQueue(Lque, e);
break;
}
case 3:
{
DeQueue(Lque, e);
break;
}
case 4:
{
GetHead(Lque, e);
break;
}
case 5:
{
Traverse(Lque);
break;
}
case 6:
{
Destroy(Lque);
break;
}
case 7:
{
break;
}
}
}
}
队列基本操作C++
最新推荐文章于 2024-03-25 21:29:25 发布