本篇主要实现了链式队列的基本操作,包括入队、出队、判空、队列大小以及清空和销毁。
头文件
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;
}