【算法】队列的C语言实现
来源:互联网 发布:网络舆论的社会影响 编辑:程序博客网 时间:2024/06/18 15:12
/****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 *//****ElemType.cpp - ElemType的实现* ****/ #include <stdio.h>#include "ElemType.h" int compare(ElemType x, ElemType y){ return(x-y);} void visit(ElemType e){ printf("%d\n", e);}/****DynaLnkQueue.cpp - 动态链式队列,即队列的动态链式存储实现*****/ #include <stdlib.h>#include <malloc.h>#include <memory.h>#include <assert.h>#include "DynaLnkQueue.h"#define NULL 0 /*------------------------------------------------------------操作目的: 初始化队列初始条件: 无操作结果: 构造一个空的队列函数参数: LinkQueue *Q 待初始化的队列返回值: bool 操作是否成功------------------------------------------------------------*/bool InitQueue(LinkQueue *Q){ Q ->front = Q ->rear = (QueuePtr)malloc(sizeof(QNode)); if(Q ->front == NULL) return false; Q ->front ->next = NULL; return true;} /*------------------------------------------------------------操作目的: 销毁队列初始条件: 队列Q已存在操作结果: 销毁队列Q函数参数: LinkQueue *Q 待销毁的队列返回值: 无------------------------------------------------------------*/void DestroyQueue(LinkQueue *Q){ assert(Q != NULL); 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){ assert(Q.front != NULL && Q.rear != NULL); if(Q.front == Q.rear) return true; else return false;}/*------------------------------------------------------------操作目的: 得到队列的长度初始条件: 队列Q已存在操作结果: 返回Q中数据元素的个数函数参数: LinkQueue Q 队列Q返回值: int 数据元素的个数------------------------------------------------------------*/int QueueLength(LinkQueue Q){ assert(Q.front != NULL); QueuePtr p = Q.front; int Length = 0; while (p != Q.rear) { Length++; p = p->next; } return Length;}/*------------------------------------------------------------操作目的: 得到队列首元素初始条件: 队列Q已存在操作结果: 用e返回队列首元素函数参数: LinkQueue Q 队列Q ElemType *e 队列首元素的值返回值: bool 操作是否成功------------------------------------------------------------*/bool GetHead(LinkQueue Q, ElemType *e){ assert(Q.front != NULL); if(QueueEmpty(Q)) return false; else { *e = Q.front ->next ->data; return true; } }/*------------------------------------------------------------操作目的: 遍历队列初始条件: 队列Q已存在操作结果: 依次对Q的每个元素调用函数fp函数参数: LinkQueue Q 队列Q void (*fp)() 访问每个数据元素的函数指针返回值: 无------------------------------------------------------------*/void QueueTraverse(LinkQueue Q, void (*fp)(ElemType)){ assert(Q.front != NULL); QueuePtr p = Q.front ->next; while(p) { (*fp)(p ->data); p = p ->next; }} /*------------------------------------------------------------操作目的: 清空队列初始条件: 队列Q已存在操作结果: 将队列清空函数参数: LinkQueue *Q 队列Q返回值: 无------------------------------------------------------------*/void ClearQueue(LinkQueue *Q){ assert(Q ->front != NULL); QueuePtr p = Q ->front ->next; while(p) { Q ->front ->next = p ->next; free(p); p = Q ->front ->next; } } /*------------------------------------------------------------操作目的: 在队列末尾插入元素e初始条件: 队列Q已存在操作结果: 插入元素e作为队列新的尾结点函数参数: LinkQueue *Q 队列Q ElemType e 待插入的数据元素返回值: bool 操作是否成功------------------------------------------------------------*/bool EnQueue(LinkQueue *Q, ElemType e){ QueuePtr temp = (QueuePtr )malloc(sizeof(QNode)); if(!temp) return false; temp ->data = e; temp ->next = NULL; Q->rear ->next = temp; Q ->rear = temp; return true;} /*------------------------------------------------------------操作目的: 删除链式队列的头结点初始条件: 队列Q已存在操作结果: 删除链式队列的头结点函数参数: LinkQueue *Q 队列Q ElemType *e 待插入的数据元素返回值: bool 操作是否成功------------------------------------------------------------*/bool DeQueue(LinkQueue *Q, ElemType *e){ if(Q ->front == Q->rear) return false; QueuePtr temp = Q->front ->next; *e = temp ->data; Q ->front ->next= temp ->next; if(Q ->rear == temp) Q ->rear = Q ->front; free(temp); return true;}/****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 */#include <stdio.h>#include <stdlib.h>#include "DynaLnkQueue.h" int main(){ // TODO: Place your test code here /*LinkQueue W; InitQueue(&W); EnQueue(&W,1); EnQueue(&W,2); QueueTraverse(W,visit);*/ system("PAUSE"); return 0;}
0 0
- 【算法】队列的C语言实现
- 算法与数据结构-队列的基本操作C语言实现
- 队列的C语言实现
- C语言队列的实现
- c语言队列的实现
- 队列的c语言实现
- 队列的C语言实现
- 队列的C语言实现
- 队列的实现C语言
- 队列的C语言实现
- 队列的C语言实现
- 队列的C语言实现
- 队列 C语言实现
- 队列C语言实现
- C语言实现队列
- 队列 c语言实现
- C语言实现队列
- C语言实现队列
- linux下数据同步、回写机制分析
- 杭电1695 GCD(莫比乌斯反演)
- iOS开发拓展篇—UIDynamic(简单介绍)
- BNUOJ 44582 MLX的疯狂睡眠
- 程序生涯思考
- 【算法】队列的C语言实现
- MySQL Workbench中文教程
- Linux与JVM的内存关系分析
- js不能获取屏幕高度
- 在wpf工程中使用osg技术
- JAVA HASHMAP 如何用
- iOS开发拓展篇—静态库
- linux下内存的统计和内存泄露类问题的定位
- GP与OOP