[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:欢迎讨论以及批评指正


  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值