C语言实现队列
创始人
2025-05-31 08:17:10

目录

写在最前的话

一,队列的概念

二,队列结构的实现

三,队列与单链表的比较

四,队列接口的实现

1,基本接口

2,处理数据接口

3,其他接口


写在最前的话

数据结构的实现不是单一的或者统一的,思想是关键,代码实现的细节的差异因人而异,使用数据结构应当对代码进行了解,不是想怎么用就怎么用的。

关于数据结构的实现方式也是千差万别,例如队列的实现可以使用数组实现也可以使用链表实现,这里,我们使用的是链表的方式。

一,队列的概念

 

队列:

只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)的特性

入队列:进行插入操作的一端称为队尾

出队列:进行删除操作的一端称为队头

二,队列结构的实现

队列的结构成员有头指针front(指向单链表的头结点的指针),尾指针rear(指向单链表的尾结点的指针)和表示单链表长度的size

(至于为何如此设计,我们暂时不深究,先学习如何实现队列,而其中的意味我需要慢慢探究)

 

typedef int QueueDataType;typedef struct QueueListNode
{QueueDataType data;struct QueueListNode* next;
}QNode;typedef struct Queue
{QNode* front;QNode* rear;int size;
}Queue;

三,队列与单链表的比较

队列和单链表可以说是两回事,但是队列是依靠单链表实现的,通过头节点、尾节点控制单链表实现功能,但它绝不是单链表。

四,队列接口的实现

1,基本接口

初始化:void QueueInit(Queue* pQ);

使用者在创建一个队列的变量之后,将其指针传入初始化函数中,初始化函数将其成员全部置空

void QueueInit(Queue* pQ)
{assert(pQ != NULL);pQ->front = NULL;pQ->rear = NULL;pQ->size = 0;
}

销毁:void QueueDestroy(Queue* pQ);

遍历单链表,释放动态开辟的空间,将队列成员全部置空

void QueueDestroy(Queue* pQ)
{assert(pQ != NULL);QNode* cur = pQ->front;while (cur != NULL){QNode* next = cur->next;free(cur);cur = next;}pQ->front = pQ->rear = NULL;pQ->size = 0;
}


2,处理数据接口

插入数据:void QueuePush(Queue* pQ, QueueDataType x);

队列数据的插入就是单链表数据的插入

QNode* BuyNewNode(QueueDataType x)
{QNode* newnode = (QNode*)malloc(sizeof(QNode));newnode->data = x;newnode->next = NULL;return newnode;
}void QueuePush(Queue* pQ, QueueDataType x)
{assert(pQ != NULL);QNode* newnode = BuyNewNode(x);if (pQ->front == NULL){pQ->front = pQ->rear = newnode;}else{pQ->rear->next = newnode;pQ->rear = newnode;}pQ->size++;
}

删除数据:void QueuePop(Queue* pQ);

队列数据的删除就是单链表数据的删除,注意:当单链表只有一个节点时,将front置空后,需要将rear置空,不然rear就会成为野指针(当单链表只有一个节点时,头指针和尾指针指向同一个节点,该节点被释放后,两个指针都需置空)

void QueuePop(Queue* pQ)
{assert(pQ != NULL);assert(pQ->front != NULL);QNode* next = pQ->front->next;free(pQ->front);pQ->front = next;if (pQ->front == NULL){pQ->rear = NULL;}pQ->size--;
}

3,其他接口

判断队列是否为空:bool QueueEmpty(Queue* pQ);

通过节点数量size判断

bool QueueEmpty(Queue* pQ)
{assert(pQ != NULL);return pQ->size == 0 ? true : false;
}

队列内元素数量:int QueueSize(Queue* pQ);

通过节点数量size判断

int QueueSize(Queue* pQ)
{assert(pQ != NULL);return pQ->size;
}

队头元素:QueueDataType QueueFront(Queue* pQ);

头节点元素即为队头元素

QueueDataType QueueFront(Queue* pQ)
{assert(pQ != NULL);assert(QueueEmpty(pQ) != true);return pQ->front->data;
}

队尾元素:QueueDataType QueueBack(Queue* pQ);

尾节点元素即为队尾元素

QueueDataType QueueBack(Queue* pQ)
{assert(pQ != NULL);assert(QueueEmpty(pQ) != true);return pQ->rear->data;
}

相关内容

热门资讯

影院跨年、登高祈愿,北京宛平城... 新京报讯(记者姜慧梓)你准备好去哪儿跨年了吗?冬至当天,记者从北京市丰台区了解到,该区为市民游客定制...
每道家常菜都藏着感人的家庭故事... 好吃的食物不光是仅仅食物自身,它的背后负载着人身的情感、记忆以及一段段别类独特的生活经历。每一道家常...
看似健康的“手作”小零食,实际... 寒风一吹,总忍不住往嘴里塞点什么,红薯片、奶皮子、脱皮年糕……这些“天然”“手作”零食,正成为冬日里...
鹧鸪天·张老炝非遗炝锅烩面 鹧鸪天·张老炝非遗炝锅烩面(中华通韵) 作者:薛志鹏 三代传薪老炝香。张家烩面煮鲜汤。 一筋一骨炼真...
家常菜里藏着的家族故事,周日那... 提及美食故事,它绝非仅仅是烹饪步骤的叙述,更非味道的简单复述。一个出色的美食故事,其关键核心乃是情感...