【数据结构】链式队列的基本操作

  本篇主要实现了链式队列的基本操作,包括入队、出队、判空、队列大小以及清空和销毁。

头文件

queue.h

# ifndef __QUEUE_H__
# define __QUEUE_H__

# include <stdio.h>
# include <stdlib.h>
# include <assert.h>

enum OPTION
{
	QUIT, // 退出
	PUSH, // 入队
	POP, // 出队
	IS_EMPTY, // 判空
	SIZE, // 大小
	DESTORY, // 销毁
	SHOW, // 显示队列中的元素
	SHOW_FRONT, // 显示队首元素
};

typedef int DataType;

typedef struct QNode
{
	DataType data;
	struct QNode * pNext;
}QNode, * pQNode;

typedef struct Queue
{
	pQNode pFront;
	pQNode pRear;
	int size;
}Queue, * pQueue;

void QueueInit(pQueue pQ); // 队列的初始化
void QueuePrint(pQueue pQ); // 打印队列元素
void QueuePush(pQueue pQ, DataType data); // 入队
void QueuePop(pQueue pQ); // 出队
DataType QueueFront(pQueue pQ); // 取队首元素
void QueueIsEmpty(pQueue pQ); // 队列判空
void QueueSize(pQueue pQ); // 队列大小
void QueueDestory(pQueue pQ); // 销毁队列

# endif // __QUEUE_H__

操作说明

  首先依次入队1、2、3、4、5,


  然后出队一次,


  查看队列是否为空,以及队列大小,


难点剖析

1.入队


2.出队


源代码

1.queue.c

#define _CRT_SECURE_NO_WARNINGS 1

/*
* Copyright (c) 2018, code farmer from sust
* All rights reserved.
*
* 文件名称:queue.c
* 功能:链式队列内部实现细节
*
* 当前版本:V1.0
* 作者:sustzc
* 完成日期:2018年6月6日22:30:25
*/

# include "queue.h"

/*
*	函数名称:QueueInit
*
*	函数功能:队列的初始化
*
*	入口参数:pQ
*
*	出口参数:void
*
*	返回类型:void
*/

void QueueInit(pQueue pQ)
{
	assert(NULL != pQ);

	pQ->pFront = pQ->pRear = NULL;
	pQ->size = 0;

	return;
}

/*
*	函数名称:QueuePrint
*
*	函数功能:打印队列元素
*
*	入口参数:pQ
*
*	出口参数:void
*
*	返回类型:void
*/

void QueuePrint(pQueue pQ)
{
	pQNode pCurNode = NULL;

	assert(NULL != pQ);

	pCurNode = pQ->pFront;

	while (NULL != pCurNode)
	{
		printf("%2d -> ", pCurNode->data);
		pCurNode = pCurNode->pNext;
	}
	
	printf("NULL\n");

	return;
}

/*
*	函数名称:QueuePush
*
*	函数功能:入队
*
*	入口参数:pQ, data
*
*	出口参数:void
*
*	返回类型:void
*/

void QueuePush(pQueue pQ, DataType data)
{
	pQNode pNewNode = NULL;

	assert(NULL != pQ);

	pNewNode = (pQNode)malloc(sizeof(QNode));

	if (NULL == pNewNode)
	{
		printf("内存分配失败!\n");
		exit(-1);
	}
	else
	{
		;
	}

	pQ->size++;

	if (NULL == pQ->pFront)
	{
		pQ->pFront = pQ->pRear = pNewNode;
		pNewNode->data = data;
		pQ->pRear->pNext = NULL;
	}
	else
	{
		pNewNode->data = data;
		pNewNode->pNext = NULL;
		pQ->pRear->pNext = pNewNode;
		pQ->pRear = pNewNode;
	}

	return;
}

/*
*	函数名称:QueuePop
*
*	函数功能:出队
*
*	入口参数:pQ
*
*	出口参数:void
*
*	返回类型:void
*/

void QueuePop(pQueue pQ)
{
	pQNode pDelNode = NULL;

	assert(NULL != pQ);
	
	if (pQ->pFront == pQ->pRear)
	{
		printf("队列为空!\n");
		exit(-1);
	}
	else
	{
		;
	}

	pQ->size--;

	pDelNode = pQ->pFront;
	pQ->pFront = pDelNode->pNext;
	free(pDelNode);

	if (NULL == pQ->pFront)
	{
		//pQ->pRear = NULL;
		pQ->pRear = pQ->pFront;
	}
	else
	{
		;	
	}

	return;
}

/*
*	函数名称:QueueFront
*
*	函数功能:取队首的元素
*
*	入口参数:pQ
*
*	出口参数:pQ->pFront->data
*
*	返回类型:DataType
*/

DataType QueueFront(pQueue pQ)
{
	assert(NULL != pQ);
	
	assert(NULL != pQ->pFront);

	return pQ->pFront->data;
}

/*
*	函数名称:QueueIsEmpty
*
*	函数功能:队列判空
*
*	入口参数:pQ
*
*	出口参数:void
*
*	返回类型:void
*/

void QueueIsEmpty(pQueue pQ)
{
	assert(NULL != pQ);

	if (0 == pQ->size)
	{
		printf("队列为空!\n");
	}
	else
	{
		printf("队列不为空!\n");
	}

	return;
}

/*
*	函数名称:QueueSize
*
*	函数功能:队列的大小
*
*	入口参数:pQ
*
*	出口参数:void
*
*	返回类型:void
*/

void QueueSize(pQueue pQ)
{
	assert(NULL != pQ);
	
	if (0 == pQ->size)
	{
		printf("队列为空!\n");
		exit(-1);
	}
	else
	{
		printf("队列的大小为: %d\n", pQ->size);
	}

	return;
}

/*
*	函数名称:QueueDestory
*
*	函数功能:队列的销毁
*
*	入口参数:pQ
*
*	出口参数:void
*
*	返回类型:void
*/

void QueueDestory(pQueue pQ)
{
	pQNode pCurNode = NULL;
	pQNode pNextNode = NULL;

	assert(NULL != pQ);

	for (pCurNode = pQ->pFront; NULL != pCurNode; pCurNode = pNextNode)
	{
		pNextNode = pCurNode->pNext;
		free(pCurNode);
	}

	pQ->pFront = pQ->pRear = NULL;
	pQ->size = 0;

	return;
}

2.test.c

#define _CRT_SECURE_NO_WARNINGS 1

/*
* Copyright (c) 2018, code farmer from sust
* All rights reserved.
*
* 文件名称:test.c
* 功能:测试链式队列的基本功能
*
* 当前版本:V1.0
* 作者:sustzc
* 完成日期:2018年6月6日22:31:57
*/

# include "queue.h"

/*
*	函数名称:MainMenu
*
*	函数功能:链式队列主菜单显示
*
*	入口参数:void
*
*	出口参数:choose
*
*	返回类型:int
*/

int MainMenu(void)
{
	int choose = 0;

	printf("***************************************\n");
	printf("*******    欢迎操作链式队列    ********\n");
	printf("*******  1. 入队      2. 出队  ********\n");
	printf("*******  3. 判空      4. 大小  ********\n");
	printf("*******  5. 销毁      6. 显示  ********\n");
	printf("*******  7. 队首      0. 退出  ********\n");
	printf("***************************************\n");
	printf("choose>");

	assert(1 == scanf("%d", &choose));

	return choose;
}

/*
*	函数名称:main
*
*	函数功能:测试主程序
*
*	入口参数:void
*
*	出口参数:0
*
*	返回类型:int
*/

int main(void)
{
	int choose = 0;
	Queue pQ;

	QueueInit(&pQ);

	do
	{
		choose = MainMenu();

        switch(choose)
		{
			case QUIT:
				printf("退出队列!\n");
				break;
			case PUSH:
				QueuePush(&pQ, 1);
				QueuePush(&pQ, 2);
				QueuePush(&pQ, 3);
				QueuePush(&pQ, 4);
				QueuePush(&pQ, 5);
				printf("入队成功!\n");
				break;
			case POP:
				QueuePop(&pQ);
				printf("出队成功!\n");
				break;
			case IS_EMPTY:
				QueueIsEmpty(&pQ);
				break;
			case SIZE:
				QueueSize(&pQ);
				break;
			case DESTORY:
				QueueDestory(&pQ);
				break;
			case SHOW:
				QueuePrint(&pQ);
				break;
			case SHOW_FRONT:
				printf("队首元素是: %d\n", QueueFront(&pQ));
				break;
			default:
				printf("输入有误,请重新输入!\n");
				break;
		}
	}while(choose);

	return 0;
}

猜你喜欢

转载自blog.csdn.net/sustzc/article/details/80659866