[c语言]数据结构之用单链表实现队列

本文介绍了一种使用链表来实现队列数据结构的方法,详细解释了如何通过两个指针来跟踪队列的首尾元素,从而实现队列的基本操作如插入、删除等。文章包含了完整的代码实现,包括初始化、销毁、插入、删除、获取队首元素值、判断队列是否为空及获取队列元素数量等功能。

简介

本文将用链表的形式实现队列的基础接口功能:
1.初始化/销毁
2.增加/删除
还实现了返回队首元素的值,返回队列元素个数,以及判断队列是否为空

在这里插入图片描述
  上图是队列的简单描述,队列遵循的规律是只能从队尾进队,出队只能从队首出队,这就意味着删除和插入元素简单了许多。
  用两个指针分别指向队首元素以及队尾元素,这样就才能对相应的结点进行操作。
  下面是代码的实现
头文件Queue.h

#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<stdlib.h>
//用链表实现队列
//定义数据类型
typedef int QDataType;

//定义链表队列结点
typedef struct QNode{
	 QDataType val;
	 struct QNode *next;
} QNode;

//队列
typedef struct Queue{
	 int size; //队列元素个数
	 QNode *front;//指向队列第一个元素,如果队列为空,则等于NULL
	 QNode *rear;//指向队列最后一个元素,如果队列为空,则等于NULL
} Queue;

//初始化
void QueueInit(Queue *queue);

//销毁
void QueueDestroy(Queue *queue);

//插入,由于是队列,只能从队尾插结点
void QueuePush(Queue *queue, QDataType val);

//删除,只能从队首删
void QueuePop(Queue *queue);

//返回队首结点的值
QDataType QueueFront(const Queue *queue);

//判断队列是否为空,为空返回1,不空返回0
int QueueEmpty(const Queue *queue);

//返回队列结点的个数
int QueueSize(const Queue *queue);

//打印
void QueuePrint(const Queue *queue);

函数实现部分Queue.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "Queue.h"
#include<assert.h>
#include<stdio.h>
#include<stdlib.h>
//初始化
void QueueInit(Queue *queue)
{
	 queue->front = queue->rear = NULL;
	 queue->size = 0;
}

//销毁
void QueueDestroy(Queue *queue)
{
	 //队内如果有元素,就先释放
	 QNode *next;
	 for (QNode *cur = queue->front; cur != NULL; cur = next)
	 {
		  next = cur->next;
		  free(cur);
	 }
	 queue->front = queue->rear = NULL;
	 queue->size = 0;
}

//插入
void QueuePush(Queue *queue, QDataType val)
{
	 //先创建结点
	 QNode *node = (QNode *)malloc(sizeof(QNode));
	 assert(node != NULL);
	 node->val = val;
	 node->next = NULL;
	 queue->size++;
	 //再判断队列是否为空
	 if (queue->rear == NULL)
	 {
	 	 queue->front = queue->rear = node;
	 }
	 else
	 {
	 	 queue->rear->next = node;
	 	 queue->rear = node;
	 }
}
	
//删除
void QueuePop(Queue *queue)
{
	 assert(queue->rear != NULL);//确保队列不为空
	 queue->size--;
	 QNode *old_front = queue->front;
	 queue->front = queue->front->next;
	 free(old_front);
	 //如果删完队列空了的话,就要设置rear的指向NULL
	 if (queue->front == NULL)
	 {
	 	 queue->rear = NULL;
	 }
}
	
//返回队首结点的值
QDataType QueueFront(const Queue *queue)
{
	 assert(queue->size > 0);
	 return queue->front->val;
}

//判断队列是否为空,为空返回1,不空返回0
int QueueEmpty(const Queue *queue)
{
	 return queue->size == 0 ? 1 : 0;
}

//返回队列结点的个数
int QueueSize(const Queue *queue)
{
	 return queue->size;
}

void QueuePrint(const Queue *queue)
{
	 for (QNode *cur = queue->front; cur != NULL; cur = cur->next)
	 {
	 	 printf("%d-->", cur->val);
	 }
	 printf("\n");
}

测试部分test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "Queue.h"
#include<stdio.h>
#include<stdlib.h>
void test()
{
	 Queue queue;
	 QueueInit(&queue);
	 QueuePush(&queue, 1);
	 QueuePush(&queue, 2);
	 QueuePush(&queue, 3);
	 QueuePush(&queue, 4);
	 QueuePush(&queue, 7);
	 QueuePrint(&queue);
	
	 QueuePop(&queue);
	 QueuePrint(&queue);
	
	 printf("%d", QueueFront(&queue));//输出队首元素
	 printf("\n");
	 printf("%d", QueueEmpty(&queue));//判断是否为空,为空输出1,不空输出0
	 printf("\n");
	 printf("%d", QueueSize(&queue));//输出队列元素个数
	 printf("\n");
	 QueueDestroy(&queue);
}
int main()
{
	 test();
	 system("pause");
	 return 0;
}

ps:欢迎讨论以及批评指正


队列是一种线性数据结构,遵循先进先出(FIFO)的原则。队列有两个基本操作:入队(enqueue)和出队(dequeue)。队列的入队操作将新元素添加到队列的末尾,而出队操作则从队列的头部删除元素。此外,队列还有一个取对首元素的操作(peek),该操作返回队列的头部元素,但不删除它。 下面是一个简单的队列实现,包括入队、出队、peek和判断队列是否为空的操作。 ```python class Queue: def __init__(self): self.queue = [] def enqueue(self, item): self.queue.append(item) def dequeue(self): if not self.is_empty(): return self.queue.pop(0) def peek(self): if not self.is_empty(): return self.queue[0] def is_empty(self): return len(self.queue) == 0 ``` 在上面的实现中,我们使用Python的列表来实现队列。我们在__init__方法中初始化队列为空列表。enqueue方法将元素添加到队列的末尾,使用列表的append方法实现。dequeue方法从队列的头部删除元素,使用列表的pop方法实现。peek方法返回队列的头部元素,但不删除它,使用列表的索引操作实现。is_empty方法用来判断队列是否为空,如果队列的长度为0,则为空。 我们可以使用以下代码测试我们的队列实现: ```python q = Queue() q.enqueue(1) q.enqueue(2) q.enqueue(3) print(q.peek()) # 输出1 print(q.dequeue()) # 输出1 print(q.dequeue()) # 输出2 print(q.is_empty()) # 输出False print(q.dequeue()) # 输出3 print(q.is_empty()) # 输出True print(q.dequeue()) # 输出None,因为队列已经为空 ``` 输出结果如下: ``` 1 1 2 False 3 True None ``` 我们可以看到,我们的队列实现成功地完成了入队、出队、peek和判断队列是否为空的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值