数据结构(c语言实现)——队列

先行队列(循环队列)

//队列
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define max 51
//队列表最大
#define initSize 100 


 struct People
{
	char name[max];
	char ID[max];
};
typedef struct 
{
	People people[initSize];
	unsigned int front , rear;	//队头、队尾
	int flag;//空队列标记 flag = 0为空,flag = 1为满
}Queue;

void initQueue(Queue& que);//队列初始化
bool QueueEmpty(Queue que);//判断是否为空队列
bool QueueFull(Queue que);//判断队列是否已满
bool enQueue(Queue& que, People peo);//入队
bool deQueue(Queue& que , People& peo);//出队
People getHead(Queue que);//读取对头元素
void printPeo(People peo);//输出people


void main()
{
	Queue que;
	initQueue(que);

	People peo[4] = { {"李参政" , "0418"} , { "参政" ,"0418"} , {"政" ,"0418"} ,{"李" ,"0418"} };
	for (int i = 0; i < 4; i++)
	{
		enQueue(que, peo[i]);
	}
	for (int i = 0; i < 4; i++)
	{
		People peo;
		deQueue(que, peo);
		printf("%d --------\n" , 3-i);
		printPeo(peo);
	}

}

void initQueue(Queue& que)//队列初始化
{
	que.flag = 0;//标记为未满
	que.front = que.rear = 0;//对头队尾都指向对头,队列为空
}
bool QueueEmpty(Queue que)//判断是否为空队列
{
	if ( que.front = que.rear && que.flag == 0)
		return true;
	return false;
}
bool QueueFull(Queue que)//判断队列是否已满
{
	if (que.flag == 1)
		return true;
	return false;
}
bool enQueue(Queue& que, People peo)//入队
{
	if (QueueFull(que))//队列已满
		return false;
	que.people[que.front % initSize] = peo;
	++que.front;
	if (que.front - que.rear == initSize - 1)
		que.flag = 1;
	else
		que.flag = 0;
	return true;
}
bool deQueue(Queue& que, People& peo)//出队
{
	peo = que.people[que.rear % initSize];
	++que.rear;
	if (que.front - que.rear == initSize - 1)
		que.flag = 1;
	else
		que.flag = 0;
	return true;
}
People getHead(Queue que)//读取对头元素
{
	People peo = que.people[que.front % initSize];
	return peo;
}
void printPeo(People peo)//输出people
{
	printf("name = %s\n", peo.name);
	printf("ID = %s\n", peo.ID);
	printf("-------------------------------\n");
}

队列的链式存储

//队列的链式存储
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define max 51



 struct People
{
	char name[max];
	char ID[max];
};
typedef struct QNode
{
	People people;
	struct QNode* next;
	struct QNode* previous;
}QNode;
typedef struct
{
	struct QNode* front, * rear;
}linkQueue;
void initQueue(linkQueue& que);//队列初始化
bool QueueEmpty(linkQueue que);//判断是否为空队列
bool enQueue(linkQueue& que, People peo);//入队
bool deQueue(linkQueue& que , People& peo);//出队
People getHead(linkQueue que);//读取对头元素
bool destroy(linkQueue& que);//销毁空队列
void printPeo(People peo);//输出people


int main()
{
	linkQueue que;
	initQueue(que);

	People peo[4] = { {"李参政" , "0418"} , { "参政" ,"0418"} , {"政" ,"0418"} ,{"李" ,"0418"} };
	for (int i = 0; i < 4; i++)
	{
		enQueue(que, peo[i]);
	}
	for (int i = 0; i < 4; i++)
	{
		People peo;
		deQueue(que, peo);
		printf("%d --------\n" , 3-i);
		printPeo(peo);
	}
	destroy(que);
	return 0;
}

void initQueue(linkQueue& que)//队列初始化
{
	
	que.front = (QNode*)malloc(sizeof(QNode));//创建队头节点空间
	que.front->previous = NULL;
	que.rear = (QNode*)malloc(sizeof(QNode));//创建队尾节点空间
	que.rear->next = NULL;

	/*将对头节点的后向指针向队尾节点
	将队尾节点的前向指针指向对头结点
	*/
	que.front->next = que.rear;
	que.rear->previous = que.front;
}
bool QueueEmpty(linkQueue que)//判断是否为空队列
{
	//判断对头、队尾节点是否相互指向对方
	if (que.front->next == que.rear && que.rear->previous == que.front)
		return true;
	return false;
}
bool enQueue(linkQueue& que, People peo)//入队
{
	QNode* newpeo = (QNode*)malloc(sizeof(QNode));//创建新的节点
	newpeo->people = peo;//修改新节点数据域
	newpeo->next = que.front->next;//新节点后向指针指向队列头节点后向指针指向处
	que.front->next->previous = newpeo;//新节点后向指针指向队列头节点后向指针指向处的前向指针指向新节点

	newpeo->previous = que.front;//新节点前向指针指向队列头节点
	que.front->next = newpeo;//队列头节点后向指针指向新节点
	//printPeo(newpeo->people);
	return true;
}
bool deQueue(linkQueue& que, People& people)//出队
{
	if (QueueEmpty(que))//判断队列是否为空
		return false;

	QNode* peo = que.rear->previous;//将队尾节点前向指针指向的节点赋给peo
	peo->previous->next = peo->next;//队尾节点前向指针指向peo前向指针所指向的节点
	que.rear->previous = peo->previous;//队尾元素前向指针指向的节点的后向指针指向队尾节点
	people = peo->people;
	free(peo);//释放peo空间
	return true;

}
People getHead(linkQueue que)//读取对头元素
{
	People peo = que.front->next->people;
	return peo;
}
bool destroy(linkQueue& que)//销毁空队列
{
	if (!QueueEmpty(que))//队列非空
		return false;
	free(que.rear);
	free(que.front);
	return true;
}
void printPeo(People peo)//输出people
{
	printf("name = %s\n", peo.name);
	printf("ID = %s\n", peo.ID);
	printf("-------------------------------\n");

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅隐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值