写的这篇和上一篇差不多,队列,早就已经写好了,就是没时间把代码敲过来,今天晚上睡觉前有点时间就写写吧,下面上代码
1.定义ElemType,方便更改类型(本程序采用ElemType 为int类型)
/***
*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 */
2.定义动态链式队列和基本操作
/***
*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 /* DYNALNKQUEUE_H */
3.动态链式队列基本操作的实现
/***
*DynaLnkQueue.cpp - 动态链式队列,即队列的动态链式存储实现
*
*
*题目:实验3-2 队列的动态链式存储实现
*
*班级:
*
*姓名:
*
*学号:
*
****/
#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 true;
}
return false;
}
/*------------------------------------------------------------
操作目的: 得到队列的长度
初始条件: 队列Q已存在
操作结果: 返回Q中数据元素的个数
函数参数:
LinkQueue Q 队列Q
返回值:
int 数据元素的个数
------------------------------------------------------------*/
int QueueLength(LinkQueue Q)
{
int i = 0;
QueuePtr p = Q.front;
while(p != Q.rear)
{
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 -> next -> 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;
p = Q -> front ->next;
Q -> front -> next =NULL;
while(p != Q -> rear)
{
q = p;
p = p -> next;
free(q);
}
Q -> rear = Q -> front; //当结尾Q -> rear 为指向首节点时会出错,,,原因?
}
/*------------------------------------------------------------
操作目的: 在队列末尾插入元素e
初始条件: 队列Q已存在
操作结果: 插入元素e作为队列新的尾结点
函数参数:
LinkQueue *Q 队列Q
ElemType e 待插入的数据元素
返回值:
bool 操作是否成功
------------------------------------------------------------*/
bool EnQueue(LinkQueue *Q, ElemType e)
{
QueuePtr p = (QNode *)malloc(sizeof(QNode));
if(!p)
return false;
p -> data = e;
p -> next = Q -> rear;
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;
Q -> front -> next = p -> next;
*e = p -> data;
if(Q -> rear == p)
Q -> rear = Q -> front;
free(p);
return true;
}
4.主函数(程序入口点,可以自定义,想怎么玩就怎么玩,玩坏了自己负责O(∩_∩)O哈哈~)
下面是我瞎玩的,已被玩坏,千!万!不!要!用!
#include <stdio.h>
#include "DynaLnkQueue.h"
int main()
{
// TODO: Place your test code here
LinkQueue a;
int b;
printf("链式队列初始化: %d\n\n",InitQueue(&a));
printf("链式队列是否为空: %d\n\n",QueueEmpty(a));
EnQueue(&a,12);
for(int i = 3; i < 22;i++)
{
b = EnQueue(&a,i);
}
printf("链式队列插入20个数据: %d\n\n",b);
printf("链式队列是否为空: %d\n\n",QueueEmpty(a));
printf("链式队列长度: %d\n\n",QueueLength(a));
GetHead(a,&b);
printf("链式队列获得首元素: %d\n\n",b);
printf("链式队列删除队头元素: %d\n\n",DeQueue(&a,&b));
GetHead(a,&b);
printf("链式队列获得首元素: %d\n\n",b);
ClearQueue(&a);
printf("链式队列清空后长度: %d\n\n",QueueLength(a));
return 0;
}