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

头文件

ElemType.h

/***

*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

/***

*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

#include

#include

#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

/***

*ElemType.cpp - ElemType的实现

*

****/

#include

#include "ElemType.h"

int compare(ElemType x, ElemType y)

{

return(x-y);

}

void visit(ElemType e)

{

printf("%dn", e);

}

DynaLnkQueue.cpp

/***

*DynaLnkQueue.cpp - 动态链式队列,即队列的动态链式存储实现

*

*

*题目:实验4 队列的动态链式存储实现

*

*

****/

#include

#include

#include

#include

#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;

}

本文同步分享在 博客“蜜汁炒酸奶”(other)。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值