数据结构入门-C语言实现两种结构的队列

简述

概念定义

队列 : 是另一种限定性的线性表,它只允许在表的一端插入元素,而在另一端删除元素,所以队列具有先进先出的特性。
在队列中,允许插入的一端叫做队尾(rear),允许删除的一端则称为队头(front)。
附上相关动画演示
链接:https://pan.baidu.com/s/1QZcPnl1nKsJFwYNQCi81_w
提取码:3b61
复制这段内容后打开百度网盘手机App,操作更方便哦

抽象数据类型定义

ADT Queue
数据元素:可以是任意类型的数据,但必须属于同一个数据
对象。
关系:队列中数据元素之间是线性关系。

实现

链式队列

结构定义

typedef int ElemType;
typedef struct Node{
	ElemType data;
	struct Node *next;
}LinkQueueNode;
typedef struct {
	LinkQueueNode *head;
	LinkQueueNode *tail;
}LinkQueue;

初始化

void Init(LinkQueue *q)
{
	q->tail = q->head = (LinkQueueNode*)malloc(sizeof(LinkQueueNode));
	q->head->next = NULL;
}

插入

void Enter(LinkQueue *q, ElemType e)
{
	LinkQueueNode *t = (LinkQueueNode*)malloc(sizeof(LinkQueueNode));
	t->data = e;
	t->next = NULL;
	q->tail->next = t;
	q->tail = t;
}

取出

ElemType Out(LinkQueue *q)
{
	LinkQueueNode *t = q->head->next;
	ElemType e = t->data;
	q->head->next = t->next;
	if(q->head->next == NULL)
		q->tail = q->head;
	free(t);
	return e;
}

调用

在这里插入图片描述

循环队列

结构定义

#define MAXSIZE 4					##我这里采取的方式实际只能容纳3个元素,因为空闲最后一个元素使得判空和判满的条件不一样啦
typedef int ElemType;
typedef struct {
	ElemType elems[MAXSIZE];
	int head;
	int tail;
}SeqQueue;

初始化

void Init(SeqQueue *q)
{
	q->tail = q->head = 0;
}

插入

void Enter(SeqQueue *q, ElemType e)
{
	if((q->tail+1) % MAXSIZE == q->head)
	{
		printf("队列已满");
		return;
	}
	q->elems[q->tail] = e;	
	q->tail = (q->tail + 1) % MAXSIZE;
}

取出

ElemType Out(SeqQueue *q)
{
	ElemType e;
	if(q->head == q->tail)
	{
		printf("队列已空");
		return -1;
	}
	e = q->elems[q->head];
	q->head = (q->head + 1) % MAXSIZE;
	return e;
}

调用

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44112790/article/details/88721674
今日推荐