数据结构线性表 - 链式队列练习Demo

数据结构线性表 - 链式队列练习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;

以上是队列的主要功能,还有取队头元素,求队列长度等功能没写,因为这几个功能很简单,哈哈。
如果又不会的可以私信我。一起学习,加油!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值