前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >队列的动态链式存储实现—C语言

队列的动态链式存储实现—C语言

作者头像
WindCoder
发布2018-09-20 15:01:08
1.2K0
发布2018-09-20 15:01:08
举报
文章被收录于专栏:WindCoderWindCoder

头文件

ElemType.h

代码语言:javascript
复制
/***
*ElemType.h - ElemType的定义
*
****/

#ifndef ELEMTYPE_H
#define ELEMTYPE_H

typedef int ElemType;

int  compare(ElemType x, ElemType y);
void visit(ElemType e);

#endif /* ELEMTYPE_H */

 DynaLnkQueue.h

代码语言:javascript
复制
/***
*DynaLnkQueue.h - 动态链式队列的定义
*
****/

#if !defined(DYNALNKQUEUE_H)
#define DYNALNKQUEUE_H

#include "ElemType.h"

/*------------------------------------------------------------
// 链式队列结构的定义
------------------------------------------------------------*/

typedef struct Node
{
	ElemType data;				// 元素数据
	struct Node *next;			// 链式队列中结点元素的指针
} QNode, *QueuePtr;

typedef struct
{
	QueuePtr front;				// 队列头指针
	QueuePtr rear;				// 队列尾指针
} LinkQueue;

/*------------------------------------------------------------
// 链式队列的基本操作
------------------------------------------------------------*/

bool InitQueue(LinkQueue *Q);
void DestroyQueue(LinkQueue *Q);
bool QueueEmpty(LinkQueue Q);
int  QueueLength(LinkQueue Q);
bool GetHead(LinkQueue Q, ElemType *e);
void QueueTraverse(LinkQueue Q, void (*fp)(ElemType));
void ClearQueue(LinkQueue *Q);
bool EnQueue(LinkQueue *Q, ElemType e);
bool DeQueue(LinkQueue *Q, ElemType *e);

#endif

主函数

Lab.cpp

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include "DynaLnkQueue.h"

int main()
{
	LinkQueue *Q;
	ElemType e=3;
	 InitQueue(&Q);
	DestroyQueue(&Q);
	QueueEmpty(&Q);
	QueueLength(&Q);
	GetHead(&Q,e);
	QueueTraverse(&Q, visit(e));
	ClearQueue(&Q);
	EnQueue(&Q,e);
	DeQueue(&Q,&e);
	system("pause");
	return true;
}

实现函数

ElemType.cpp

代码语言:javascript
复制
/***
*ElemType.cpp - ElemType的实现
*
****/

#include <stdio.h>
#include "ElemType.h"

int compare(ElemType x, ElemType y)
{
	return(x-y);
}

void visit(ElemType e)
{
	printf("%dn", e);
}

DynaLnkQueue.cpp

代码语言:javascript
复制
/***
*DynaLnkQueue.cpp - 动态链式队列,即队列的动态链式存储实现
*
*
*题目:实验4 队列的动态链式存储实现
*

*
****/

#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <assert.h>
#include "DynaLnkQueue.h"

/*------------------------------------------------------------
操作目的:	初始化队列
初始条件:	无
操作结果:	构造一个空的队列
函数参数:
		LinkQueue *Q	待初始化的队列
返回值:
		bool			操作是否成功
------------------------------------------------------------*/
bool InitQueue(LinkQueue *Q)//初始化带头结点的队列
{
	Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode));
	if (!Q->front)
	{
		return false;
	}
    Q->front->next = NULL;
	return true;

}

/*------------------------------------------------------------
操作目的:	销毁队列
初始条件:	队列Q已存在
操作结果:	销毁队列Q
函数参数:
		LinkQueue *Q	待销毁的队列
返回值:
		无
------------------------------------------------------------*/
void DestroyQueue(LinkQueue *Q)
{
	while(Q->front)
	{
		Q->rear = Q->front->next;
		free(Q->front);
		Q->front = Q->rear;
	}

}

/*------------------------------------------------------------
操作目的:	判断队列是否为空
初始条件:	队列Q已存在
操作结果:	若Q为空队列,则返回true,否则返回false
函数参数:
		LinkQueue Q		待判断的队列
返回值:
		bool			是否为空
------------------------------------------------------------*/
bool QueueEmpty(LinkQueue Q)
{
	if (Q.front!=Q.rear)
	{
		return false;
	}
	return true;
}

/*------------------------------------------------------------
操作目的:	得到队列的长度
初始条件:	队列Q已存在
操作结果:	返回Q中数据元素的个数
函数参数:
		LinkQueue Q		队列Q
返回值:
		int				数据元素的个数
------------------------------------------------------------*/
int QueueLength(LinkQueue Q)
{
	int i;
	QueuePtr p= Q.front;
	while(p)
	{
		p = p->next;
		i++;
	}
	return i;
}

/*------------------------------------------------------------
操作目的:	得到队列首元素
初始条件:	队列Q已存在
操作结果:	用e返回队列首元素
函数参数:
		LinkQueue Q		队列Q
		ElemType *e		队列首元素的值
返回值:
		bool			操作是否成功
------------------------------------------------------------*/
bool GetHead(LinkQueue Q, ElemType *e)
{
	if (Q.front == Q.rear)
	{
		return false;
	}
	*e = Q.front->data;
	return true;
}

/*------------------------------------------------------------
操作目的:	遍历队列
初始条件:	队列Q已存在
操作结果:	依次对Q的每个元素调用函数fp
函数参数:
		LinkQueue Q		队列Q
		void (*fp)()	访问每个数据元素的函数指针
返回值:
		无
------------------------------------------------------------*/
void QueueTraverse(LinkQueue Q, void (*fp)(ElemType))
{
    QueuePtr p = Q.front->next;
	while(p)
	{
         fp(p->data);
		 p = p->next;
	}
}

/*------------------------------------------------------------
操作目的:	清空队列
初始条件:	队列Q已存在
操作结果:	将队列清空
函数参数:
		LinkQueue *Q	队列Q
返回值:
		无
------------------------------------------------------------*/
void ClearQueue(LinkQueue *Q)
{
	   QueuePtr p=Q->front->next;
      while(p)
	  {
         p->data = NULL;
		 p= p->next;
	  }
}

/*------------------------------------------------------------
操作目的:	在队列末尾插入元素e
初始条件:	队列Q已存在
操作结果:	插入元素e作为队列新的尾结点
函数参数:
		LinkQueue *Q		队列Q
		ElemType e		待插入的数据元素
返回值:
		bool			操作是否成功
------------------------------------------------------------*/
bool EnQueue(LinkQueue *Q, ElemType e)
{
   QueuePtr p =(QueuePtr)malloc(sizeof(QNode));
   if (!p)
   {
	   return false;
   }
   p->data = e;
   p->next = NULL;
   Q->rear->next = p;
   Q->rear = p;
	return true;

}

/*------------------------------------------------------------
操作目的:	删除链式队列的头结点
初始条件:	队列Q已存在
操作结果:	删除链式队列的头结点
函数参数:
		LinkQueue *Q		队列Q
		ElemType *e		待插入的数据元素
返回值:
		bool			操作是否成功
------------------------------------------------------------*/
bool DeQueue(LinkQueue *Q, ElemType *e)
{
	QueuePtr p =Q->front->next;
	if (Q->front == Q->rear)
	{
		return false;
	}
	*e = p->data;
	Q->front->next = p->next;
	if (!p->next)
	{
		Q->rear = Q->front;
	}
	free(p);


	return true;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014-11-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 头文件
    • ElemType.h
      •  DynaLnkQueue.h
      • 主函数
        • Lab.cpp
        • 实现函数
          • ElemType.cpp
            • DynaLnkQueue.cpp
            相关产品与服务
            对象存储
            对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档