(8)数据结构——队列(链表)实现
2013-08-16 14:01
531 查看
LinkListQueue.c
LinkListQueue.c
ElemType.c及ElemType.h见上一节 循环队列 中的实现
testmian.c
makefile 如下 通用Makefile
/********************************************************************* *: *: Filename: LinkListQueue.h *: *: Author: dspeeding *: Copyright (c) 2012, dspeeding *: *: Created at: 2012.06.12 *: Last modified: 2012.06.12 *: *: Introduction: 链表队列(数据结构)的c实现 *: *: *:*********************************************************************/ #ifndef _LINKLISTQUEUE_H_ #define _LINKLISTQUEUE_H_ #include "ElemType.h" #define LINKLISTQUEUE_RET_OK 0 #define LINKLISTQUEUE_RET_ERROR -1 typedef void (*Visit)(PCElemType); /*定义结点结构体*/ typedef struct TDefLinkListNode { ElemType data; /*数据域*/ struct TDefLinkListNode *next; /*链表指针*/ }LinkListNode; typedef LinkListNode* PLinkListNode; typedef const LinkListNode CLinkListNode; typedef const LinkListNode* PCLinkListNode; /*定义队列结构体*/ typedef struct TDefLinkListQueue { PLinkListNode front; /*队列首指针*/ PLinkListNode rear; /*队列尾指针*/ }LinkListQueue; typedef LinkListQueue* PLinkListQueue; typedef const LinkListQueue CLinkListQueue; typedef const LinkListQueue* PCLinkListQueue; /**************************************** Purpose : 初始化链表队列 Input : pQueue --队列指针 Return : None *****************************************/ void InitLinkListQueue(PLinkListQueue pQueue); /**************************************** Purpose : 向链表队列中增加一个元素 Input : pQueue -- 队列指针 pData -- 数据指针 Return : 0 -- 成功 -1 -- 失败 *****************************************/ int AddLinkListQueue(PLinkListQueue pQueue, PCElemType pData); /**************************************** Purpose : 从链表队列中删除一个元素 Input : pQueue -- 队列指针 pData -- 数据 Return : 0 -- 成功 -1 -- 失败 *****************************************/ int DelLinkListQueue(PLinkListQueue pQueue, PElemType pData); /**************************************** Purpose : 从链表队列中删除一个元素 Input : pQueue -- 队列指针 pData -- 数据指针 Return : 0 -- 成功 -1 -- 失败 *****************************************/ int OutLinkListQueue(PLinkListQueue pQueue, PElemType pData); /**************************************** Purpose : 从链表队列中读取队首元素 Input : pQueue -- 队列指针 pData -- 数据指针 Return : 0 -- 成功 -1 -- 失败 *****************************************/ int PeekLinkListQueue(PLinkListQueue pQueue, PElemType pData); /**************************************** Purpose : 判断链表队列是否为空 Input : pQueue -- 队列指针 Return : 0 -- 为空 其他 -- 非空 *****************************************/ int IsEmptyLinkListQueue(PLinkListQueue pQueue); /**************************************** Purpose : 清空链表队列中所有元素 Input : pQueue -- 队列指针 Return : 0 -- 成功 -1 -- 失败 *****************************************/ int ClearLinkListQueue(PLinkListQueue pQueue); /************************************************************************* Purpose : 从栈顶开始遍历整个栈 Input : pQueue -- 队列指针 visit -- 遍历函数 Return : None Modify : Remark : *************************************************************************/ void TraverseLinkListQueue(PLinkListQueue pQueue, Visit visit); #endif
LinkListQueue.c
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "LinkListQueue.h" /************************************************************************* Function: InitLinkListQueue() Purpose : 初始化链表队列 Input : pQueue --队列指针 Return : None Modify : Remark : *************************************************************************/ void InitLinkListQueue(PLinkListQueue pQueue) { /*把队首和队尾指针置空*/ pQueue->front = NULL; pQueue->rear = NULL; return ; } /************************************************************************* Function: AddLinkListQueue() Purpose : 向链表队列中增加一个元素 Input : pQueue -- 队列指针 mData -- 数据 Return : 0 -- 成功 -1 -- 失败 Modify : Remark : *************************************************************************/ int AddLinkListQueue(PLinkListQueue pQueue, PCElemType pData) { /*生成一个新的结点*/ PLinkListNode pNewNode; pNewNode = malloc(sizeof(LinkListNode)); if(pNewNode == NULL) { /*内存分配失败*/ return LINKLISTQUEUE_RET_ERROR; } /*把mData的值赋值给新结点*/ memcpy(&pNewNode->data, pData, sizeof(ElemType)); pNewNode->next = NULL; /*若链表队列为空,则新结点既是队首结点又是队尾结点*/ if(pQueue->rear == NULL) { pQueue->rear = pNewNode; pQueue->front = pNewNode; } else { /*若队列非空,则依次修改队尾结点的指针,使之指向新的队尾结点*/ pQueue->rear->next = pNewNode; pQueue->rear = pNewNode; } return LINKLISTQUEUE_RET_OK; } /************************************************************************* Function: OutLinkListQueue() Purpose : 从链表队列中删除一个元素 Input : pQueue -- 队列指针 pData -- 数据指针 Return : 0 -- 成功 -1 -- 失败 Modify : Remark : *************************************************************************/ int OutLinkListQueue(PLinkListQueue pQueue, PElemType pData) { PLinkListNode pNode; if(pQueue->front == NULL) { /*队列为空*/ return LINKLISTQUEUE_RET_ERROR; } memcpy(pData, &pQueue->front->data, sizeof(ElemType)); pNode = pQueue->front; pQueue->front = pNode->next; /*若删除后链表队列为空,则需同时使队尾指针为空*/ if(pQueue->front == NULL) { pQueue->rear = NULL; } /*回收该结点内存*/ free(pNode); pNode = NULL; return LINKLISTQUEUE_RET_OK; } /************************************************************************* Function: PeekLinkListQueue(PLinkListQueue pQueue, PElemType pData) Purpose : 从链表队列中读取队首元素 Input : pQueue -- 队列指针 pData -- 数据指针 Return : 0 -- 成功 -1 -- 失败 Modify : Remark : *************************************************************************/ int PeekLinkListQueue(PLinkListQueue pQueue, PElemType pData) { if(pQueue->front == NULL) { /*队列为空*/ return LINKLISTQUEUE_RET_ERROR; } memcpy(pData, &pQueue->front->data, sizeof(ElemType)); return LINKLISTQUEUE_RET_OK; } /************************************************************************* Function: IsEmptyLinkListQueue(PLinkListQueue pQueue) Purpose : 判断链表队列是否为空 Input : pQueue -- 队列指针 Return : 0 -- 为空 其他 -- 非空 Modify : Remark : *************************************************************************/ int IsEmptyLinkListQueue(PLinkListQueue pQueue) { if(pQueue->front == NULL) { /*队列为空*/ return 0; } else { return -1; } } /************************************************************************* Function: ClearLinkListQueue(PLinkListQueue pQueue) Purpose : 清空链表队列中所有元素 Input : pQueue -- 队列指针 Return : 0 -- 成功 -1 -- 失败 Modify : Remark : *************************************************************************/ int ClearLinkListQueue(PLinkListQueue pQueue) { PLinkListNode pNode; /*依次删除队列中的每一个结点,最后使队首指针为空*/ pNode = pQueue->front; while(pNode != NULL) { pQueue->front = pQueue->front->next; free(pNode); pNode = pQueue->front; } /*循环结束后队首指针已经为空 最后将队尾指针赋值为空*/ pQueue->rear = NULL; return LINKLISTQUEUE_RET_OK; } /************************************************************************* Purpose : 从栈顶开始遍历整个栈 Input : pQueue -- 队列指针 visit -- 遍历函数 Return : None Modify : Remark : *************************************************************************/ void TraverseLinkListQueue(PLinkListQueue pQueue, Visit visit) { PLinkListNode pNode; pNode = pQueue->front; while(pNode != NULL) { visit(&(pNode->data)); pNode = pNode->next; } }
ElemType.c及ElemType.h见上一节 循环队列 中的实现
testmian.c
/********************************************************************* *: *: Filename: testLinkListQueue.c *: *: Author: DongXiaolin *: Copyright (c) 2012, DongXiaolin *: *: Created at: 2012.06.12 *: Last modified: 2012.06.12 *: *: Introduction: 链表队列(数据结构)的demo *: *: *:*********************************************************************/ #include <stdio.h> #include "LinkListQueue.h" int main() { LinkListQueue mQueue; Stu a[4] = {{1,"zhangsan"}, {2,"lisi"}, {3,"wangwu"}, {4,"zhaoliu"}}; int i; /*初始化队列*/ InitLinkListQueue(&mQueue); /*向队列中插入数据*/ for(i=0;i<4;i++) { if(AddLinkListQueue(&mQueue, &a[i])) { printf("Insert fail[%d][%s]\n", a[i].nStuId, a[i].szStuName); } } TraverseLinkListQueue(&mQueue, visit); /*从队列中删除数据*/ ElemType outData; if(OutLinkListQueue(&mQueue, &outData)) { printf("Del Data fail\n"); } printf("\nDel Data[%d][%s]\n", outData.nStuId, outData.szStuName); TraverseLinkListQueue(&mQueue, visit); /*从队列中删除数据*/ if(OutLinkListQueue(&mQueue, &outData)) { printf("Del Data fail\n"); } printf("\nDel Data[%d][%s]\n", outData.nStuId, outData.szStuName); TraverseLinkListQueue(&mQueue, visit); /*从队列中提取数据*/ if(PeekLinkListQueue(&mQueue, &outData)) { printf("Peek Data fail\n"); } printf("\nPeek Data[%d][%s]\n", outData.nStuId, outData.szStuName); TraverseLinkListQueue(&mQueue, visit); /*从队列中删除数据*/ if(OutLinkListQueue(&mQueue, &outData)) { printf("Del Data fail\n"); } printf("\nDel Data[%d][%s]\n", outData.nStuId, outData.szStuName); TraverseLinkListQueue(&mQueue, visit); while(IsEmptyLinkListQueue(&mQueue)) { if(OutLinkListQueue(&mQueue, &outData)) { printf("Del Data fail\n"); } printf("\nDo Del Data[%d][%s]\n", outData.nStuId, outData.szStuName); } /*清空队列*/ ClearLinkListQueue(&mQueue); return 0; }
makefile 如下 通用Makefile
相关文章推荐
- 数据结构之队列的链表实现
- 学会一种数据结构二:队列的数组实现和链表实现
- Java数据结构与算法—及实现 线性表 顺序表、链表、栈、队列详解
- 【数据结构】顺序队列(链表实现)
- (4) 数据结构与算法 ---- 线性表 及Java实现 顺序表、链表、栈、队列
- 数据结构之链表、栈和队列 java代码实现
- 数据结构与实现——数组、矩阵、链表、队列、栈、对象、二叉树和红黑树
- 高性能流媒体服务器-nebula之数据结构(8)--双链表实现的内存中立队列
- 数据结构——使用双端链表实现队列(java实现)
- 数据结构之链表、栈和队列 java代码实现
- 经典数据结构之队列的链表实现方法
- 数据结构之用数组和链表实现队列
- 数据结构与算法(4)---Java语言实现:队列的单链表定义
- 数据结构:实验六(单循环链表实现链式队列)
- 算法与数据结构基础7:C++双链表的简单实现
- 数据结构之队列的基本操作入队出队初始化删除-c++代码实现及运行实例结果
- bo3-4.c 用单链表的基本操作实现链队列(存储结构由c3-2.h定义)的基本操作(9个)
- 数据结构基础(3)---C语言实现单链表
- Java单链表顺序和链式实现(数据结构五)
- 数据结构课程设计-----用C#实现双向链表