数据结构线性表 - 链式队列练习Demo
链式队列实现的时候比循环队列稍微复杂一些,在定义链式队列的抽象数据类型的时候呢,需要定义三个结构体,第一个结构体用于存放结点的数据元素,相当于data域,第二个结构体是定义链式队列的结点信息的,包括数据域,还有next指针域,第三个结构体是用于定义链式队列特有的队头和队尾指针。所以链式队列的定义相对于其他的数据结构的链式表示来说有一点特殊。
根据自己的理解,写的链式队列,经过测试,没啥大问题,可以直接使用。
上代码:
#include<iostream>
using namespace std;
typedef struct Elem{
char p;
}Elem;
typedef struct QNode{
Elem elem;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct LinkQueue{
QueuePtr front,rear;
}LinkQueue;
void InitQueue(LinkQueue &Q)
{
Q.front = Q.rear = new QNode;
if (!Q.front)exit(-1);
Q.front->next = NULL;
cout << "链队初始化完成!";
}
bool IsEmpty(LinkQueue &Q)
{
if (Q.front == Q.rear)
{
return true;
}
return false;
}
void EnQueue(LinkQueue &Q)
{
char k = NULL;
cout << "请输入入队元素,按#结束!";
while (k != '#')
{
cin >> k;
if (k == '#')
{
return;
}
QNode *s = new QNode;
s->elem.p = k;
s->next = NULL;
Q.rear->next = s;
Q.rear = s;
}
cout << "元素入队成功!";
}
void DeQueue(LinkQueue &Q)
{
if (IsEmpty(Q))
{
cout << "队列为空,无法出队元素!";
return;
}
else
{
QueuePtr s;
s = Q.front->next;
Q.front->next = s->next;
if (Q.rear == s)
Q.front = Q.rear;
delete s;
}
cout << "出队成功!";
}
void DestoryQueue(LinkQueue &Q) //销毁链队
{
QueuePtr p;
while (Q.front)
{
p = Q.front->next;
delete Q.front;
Q.front = p;
}
}
void PrintQueue(LinkQueue &Q)
{
QueuePtr p;
p= Q.front;
if (p->next == NULL)
{
cout << "链队没有元素!";
return;
}
if (Q.rear == Q.front)
{
cout << "链队为空!";
return;
}
while (p->next != NULL)
{
p = p->next;
cout << p->elem.p;
}
}
void Contents() //菜单清单
{
cout << "***********************************************\n";
cout << "* 链 队 练 习 *\n";
cout << "* *\n";
cout << "* 1.初始化链队 *\n";
cout << "* 2.入队元素(多个) *\n";
cout << "* 3.出队元素(一个) *\n";
cout << "* 4.查看队列元素 *\n";
cout << "* 5.退出程序 *\n";
cout << "* *\n";
cout << "* 说明:在开始队列的操作的时候先初始化队列 *\n";
cout << "***********************************************\n";
}
void main()
{
LinkQueue Q;
int a;
while (1)
{
system("cls");
Contents();
cout << "请选择功能:";
cin >> a;
switch (a)
{
case 1: InitQueue(Q); system("PAUSE"); break;
case 2: EnQueue(Q); system("PAUSE"); break;
case 3: DeQueue(Q); system("PAUSE"); break;
case 4: PrintQueue(Q); system("PAUSE"); break;
case 5: exit(-1);
default: printf("输入错误!请重新输入"); system("PAUSE"); break;
}
}
}
链式队列的一般条件:
队空判定:Q.rear == Q.front
入队:
s->elem = e;
s->next = NULL;
Q.rear->next = s;
Q.rear = s;
出队:
p=Q.front->next;
Q.front->next =p->next;
delete p;
以上是队列的主要功能,还有取队头元素,求队列长度等功能没写,因为这几个功能很简单,哈哈。
如果又不会的可以私信我。一起学习,加油!