数据结构:链队列的基本操作

简介:使用C语言实现链队列的基本操作,包括初始化、非空判断、入队列、出队列操作。此外,测试了程序的正确性。

头文件LinkQueue.h:包含数据类型定义、函数声明

#ifndef LINK_QUEUE_H
#define LINK_QUEUE_H

#include "stdio.h"
#include "stdlib.h"

typedef int ElemType;

typedef enum{
	FALSE,
	TRUE
}BOOL;

typedef struct LinkNode{
	ElemType data;
	struct LinkNode *next;
}LinkNode;

typedef struct{
	LinkNode *front,*rear;
}LinkQueue;

void InitQueue(LinkQueue *Q);
BOOL IsEmpty(LinkQueue Q);
void EnQueue(LinkQueue *Q, ElemType e);
BOOL DeQueue(LinkQueue *Q, ElemType *e);

#endif

源文件LinkQueue.c:包含队列基本操作的C语言实现

#include "LinkQueue.h"

/********************************************************************************
 @brief  初始化链队列
 @param  Q:队列的地址 
 @retval void
 @note   void
*********************************************************************************/
void InitQueue(LinkQueue *Q)
{
	Q->front = (LinkNode *)malloc(sizeof(LinkNode));

	Q->rear = Q->front;

	Q->front->next = NULL;
}

/********************************************************************************
 @brief  判断链队列空
 @param  Q:队列 
 @retval TRUE :链队列空
         FALSE:链队列非空
 @note   void
*********************************************************************************/
BOOL IsEmpty(LinkQueue Q)
{
	return (BOOL)(Q.front == Q.rear || Q.front == NULL);
}

/********************************************************************************
 @brief  链队列入队
 @param  Q:队列的地址
         e:入队元素数值
 @retval void
 @note   void
*********************************************************************************/
void EnQueue(LinkQueue *Q, ElemType e)
{
	LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode)); //生成新结点

	s->data = e;

	s->next = NULL; //新节点作为最后一个结点,指针域为NULL

	Q->rear->next = s; //新结点插入到rear之后

	Q->rear = s; //修改表尾指针
}

/********************************************************************************
 @brief  链队列出队
 @param  Q:队列的地址
         e:出队元素数值
 @retval TRUE :操作成功
 @note   FALSE:操作失败
*********************************************************************************/
BOOL DeQueue(LinkQueue *Q, ElemType *e)
{
	LinkNode *p = Q->front->next;

	if (Q->front == Q->rear){ //判断队列非空
		return FALSE;
	}

	*e = p->data; //用e返回队头元素

	Q->front->next = p->next; //修改头节点的next指针

	if (p == Q->rear){ //此次是最后一个结点出队,设置队列为空
		Q->rear = Q->front; 
	}

	free(p); //释放结点空间

	return TRUE;
}

主函数Main.c:包含测试程序

/***************************************头文件***********************************/
#include "stdio.h"
#include "stdlib.h"
#include "LinkQueue.h"
/**********************************宏定义及类型定义******************************/
#define ENTRY_QUEUE_NUM  5
#define DELETE_QUEUE_NUM 3
/************************************定义全局变量********************************/

/*************************************函数声明***********************************/

/********************************************************************************
 @brief  打印链队列中的所有元素
 @param  Q:队列的地址
 @retval void
 @note   void
*********************************************************************************/
void PrintLinkQueueAllElem(LinkQueue Q)
{
	int num = 1;

	LinkNode *s = Q.front->next;

	if (IsEmpty(Q))
	{
		printf("链队列为空\n");

		return;
	}

	while (s)
	{
		printf("第%d个结点元素值为%d\n", num, s->data);

		num++;

		s = s->next;
	}
}

/********************************************************************************
 @brief  测试链队列基本操作
 @param  void
 @retval void
 @note   void
*********************************************************************************/
void TestLinkQueue(void)
{
	int i;
	ElemType e;
	LinkQueue Q;

	InitQueue(&Q); //初始化队列

	printf("正在进行入队列操作...\n");

	for (i = 0; i < ENTRY_QUEUE_NUM; i++)
	{
		EnQueue(&Q, i+1);
	}

	printf("\n打印队列中的所有元素...\n");

	PrintLinkQueueAllElem(Q);

	printf("\n正在进行出队列操作...\n");

	for (i = 0; i < DELETE_QUEUE_NUM; i++)
	{
		if (DeQueue(&Q, &e)){
			printf("出队列成功,出队元素值为%d\n", e);
		}
		else{
			printf("出栈失败,队列为空\n");
		}
	}

	printf("\n打印队列中的所有元素...\n");

	PrintLinkQueueAllElem(Q);
}

/********************************************************************************
 @brief  主函数
 @param  void 
 @retval void
 @note   void
*********************************************************************************/
int main(void)
{
	TestLinkQueue();

	system("pause");

	return 0;
}

程序运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值