LinkListQueue.c
1 /********************************************************************* 2 *: 3 *: Filename: LinkListQueue.h 4 *: 5 *: Author: dspeeding 6 *: Copyright (c) 2012, dspeeding 7 *: 8 *: Created at: 2012.06.12 9 *: Last modified: 2012.06.12 10 *: 11 *: Introduction: 链表队列(数据结构)的c实现 12 *: 13 *: 14 *:*********************************************************************/ 15 #ifndef _LINKLISTQUEUE_H_ 16 #define _LINKLISTQUEUE_H_ 17 18 #include "ElemType.h" 19 20 #define LINKLISTQUEUE_RET_OK 0 21 #define LINKLISTQUEUE_RET_ERROR -1 22 23 typedef void (*Visit)(PCElemType); 24 25 /*定义结点结构体*/ 26 typedef struct TDefLinkListNode 27 { 28 ElemType data; /*数据域*/ 29 struct TDefLinkListNode *next; /*链表指针*/ 30 }LinkListNode; 31 32 typedef LinkListNode* PLinkListNode; 33 typedef const LinkListNode CLinkListNode; 34 typedef const LinkListNode* PCLinkListNode; 35 36 37 /*定义队列结构体*/ 38 typedef struct TDefLinkListQueue 39 { 40 PLinkListNode front; /*队列首指针*/ 41 PLinkListNode rear; /*队列尾指针*/ 42 }LinkListQueue; 43 44 typedef LinkListQueue* PLinkListQueue; 45 typedef const LinkListQueue CLinkListQueue; 46 typedef const LinkListQueue* PCLinkListQueue; 47 48 /**************************************** 49 Purpose : 初始化链表队列 50 Input : pQueue --队列指针 51 Return : None 52 *****************************************/ 53 void InitLinkListQueue(PLinkListQueue pQueue); 54 55 56 /**************************************** 57 Purpose : 向链表队列中增加一个元素 58 Input : pQueue -- 队列指针 59 pData -- 数据指针 60 Return : 0 -- 成功 61 -1 -- 失败 62 *****************************************/ 63 int AddLinkListQueue(PLinkListQueue pQueue, PCElemType pData); 64 65 66 /**************************************** 67 Purpose : 从链表队列中删除一个元素 68 Input : pQueue -- 队列指针 69 pData -- 数据 70 Return : 0 -- 成功 71 -1 -- 失败 72 *****************************************/ 73 int DelLinkListQueue(PLinkListQueue pQueue, PElemType pData); 74 75 76 /**************************************** 77 Purpose : 从链表队列中删除一个元素 78 Input : pQueue -- 队列指针 79 pData -- 数据指针 80 Return : 0 -- 成功 81 -1 -- 失败 82 *****************************************/ 83 int OutLinkListQueue(PLinkListQueue pQueue, PElemType pData); 84 85 86 /**************************************** 87 Purpose : 从链表队列中读取队首元素 88 Input : pQueue -- 队列指针 89 pData -- 数据指针 90 Return : 0 -- 成功 91 -1 -- 失败 92 *****************************************/ 93 int PeekLinkListQueue(PLinkListQueue pQueue, PElemType pData); 94 95 96 /**************************************** 97 Purpose : 判断链表队列是否为空 98 Input : pQueue -- 队列指针 99 Return : 0 -- 为空 100 其他 -- 非空 101 *****************************************/ 102 int IsEmptyLinkListQueue(PLinkListQueue pQueue); 103 104 105 /**************************************** 106 Purpose : 清空链表队列中所有元素 107 Input : pQueue -- 队列指针 108 Return : 0 -- 成功 109 -1 -- 失败 110 *****************************************/ 111 int ClearLinkListQueue(PLinkListQueue pQueue); 112 113 /************************************************************************* 114 Purpose : 从栈顶开始遍历整个栈 115 Input : pQueue -- 队列指针 116 visit -- 遍历函数 117 Return : None 118 Modify : 119 Remark : 120 *************************************************************************/ 121 void TraverseLinkListQueue(PLinkListQueue pQueue, Visit visit); 122 123 #endif
LinkListQueue.c
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include "LinkListQueue.h" 5 6 /************************************************************************* 7 Function: InitLinkListQueue() 8 Purpose : 初始化链表队列 9 Input : pQueue --队列指针 10 Return : None 11 Modify : 12 Remark : 13 *************************************************************************/ 14 void InitLinkListQueue(PLinkListQueue pQueue) 15 { 16 /*把队首和队尾指针置空*/ 17 pQueue->front = NULL; 18 pQueue->rear = NULL; 19 return ; 20 } 21 22 /************************************************************************* 23 Function: AddLinkListQueue() 24 Purpose : 向链表队列中增加一个元素 25 Input : pQueue -- 队列指针 26 mData -- 数据 27 Return : 0 -- 成功 28 -1 -- 失败 29 Modify : 30 Remark : 31 *************************************************************************/ 32 int AddLinkListQueue(PLinkListQueue pQueue, PCElemType pData) 33 { 34 /*生成一个新的结点*/ 35 PLinkListNode pNewNode; 36 pNewNode = malloc(sizeof(LinkListNode)); 37 if(pNewNode == NULL) 38 { 39 /*内存分配失败*/ 40 return LINKLISTQUEUE_RET_ERROR; 41 } 42 43 /*把mData的值赋值给新结点*/ 44 memcpy(&pNewNode->data, pData, sizeof(ElemType)); 45 pNewNode->next = NULL; 46 47 /*若链表队列为空,则新结点既是队首结点又是队尾结点*/ 48 if(pQueue->rear == NULL) 49 { 50 pQueue->rear = pNewNode; 51 pQueue->front = pNewNode; 52 } 53 else 54 { 55 /*若队列非空,则依次修改队尾结点的指针,使之指向新的队尾结点*/ 56 pQueue->rear->next = pNewNode; 57 pQueue->rear = pNewNode; 58 } 59 60 return LINKLISTQUEUE_RET_OK; 61 } 62 63 /************************************************************************* 64 Function: OutLinkListQueue() 65 Purpose : 从链表队列中删除一个元素 66 Input : pQueue -- 队列指针 67 pData -- 数据指针 68 Return : 0 -- 成功 69 -1 -- 失败 70 Modify : 71 Remark : 72 *************************************************************************/ 73 int OutLinkListQueue(PLinkListQueue pQueue, PElemType pData) 74 { 75 PLinkListNode pNode; 76 if(pQueue->front == NULL) 77 { 78 /*队列为空*/ 79 return LINKLISTQUEUE_RET_ERROR; 80 } 81 82 memcpy(pData, &pQueue->front->data, sizeof(ElemType)); 83 pNode = pQueue->front; 84 pQueue->front = pNode->next; 85 86 /*若删除后链表队列为空,则需同时使队尾指针为空*/ 87 if(pQueue->front == NULL) 88 { 89 pQueue->rear = NULL; 90 } 91 92 /*回收该结点内存*/ 93 free(pNode); 94 pNode = NULL; 95 96 return LINKLISTQUEUE_RET_OK; 97 } 98 99 /************************************************************************* 100 Function: PeekLinkListQueue(PLinkListQueue pQueue, PElemType pData) 101 Purpose : 从链表队列中读取队首元素 102 Input : pQueue -- 队列指针 103 pData -- 数据指针 104 Return : 0 -- 成功 105 -1 -- 失败 106 Modify : 107 Remark : 108 *************************************************************************/ 109 int PeekLinkListQueue(PLinkListQueue pQueue, PElemType pData) 110 { 111 if(pQueue->front == NULL) 112 { 113 /*队列为空*/ 114 return LINKLISTQUEUE_RET_ERROR; 115 } 116 memcpy(pData, &pQueue->front->data, sizeof(ElemType)); 117 118 return LINKLISTQUEUE_RET_OK; 119 } 120 121 /************************************************************************* 122 Function: IsEmptyLinkListQueue(PLinkListQueue pQueue) 123 Purpose : 判断链表队列是否为空 124 Input : pQueue -- 队列指针 125 Return : 0 -- 为空 126 其他 -- 非空 127 Modify : 128 Remark : 129 *************************************************************************/ 130 int IsEmptyLinkListQueue(PLinkListQueue pQueue) 131 { 132 if(pQueue->front == NULL) 133 { 134 /*队列为空*/ 135 return 0; 136 } 137 else 138 { 139 return -1; 140 } 141 } 142 143 /************************************************************************* 144 Function: ClearLinkListQueue(PLinkListQueue pQueue) 145 Purpose : 清空链表队列中所有元素 146 Input : pQueue -- 队列指针 147 Return : 0 -- 成功 148 -1 -- 失败 149 Modify : 150 Remark : 151 *************************************************************************/ 152 int ClearLinkListQueue(PLinkListQueue pQueue) 153 { 154 PLinkListNode pNode; 155 /*依次删除队列中的每一个结点,最后使队首指针为空*/ 156 pNode = pQueue->front; 157 while(pNode != NULL) 158 { 159 pQueue->front = pQueue->front->next; 160 free(pNode); 161 pNode = pQueue->front; 162 } 163 164 /*循环结束后队首指针已经为空 165 最后将队尾指针赋值为空*/ 166 pQueue->rear = NULL; 167 168 return LINKLISTQUEUE_RET_OK; 169 } 170 171 /************************************************************************* 172 Purpose : 从栈顶开始遍历整个栈 173 Input : pQueue -- 队列指针 174 visit -- 遍历函数 175 Return : None 176 Modify : 177 Remark : 178 *************************************************************************/ 179 void TraverseLinkListQueue(PLinkListQueue pQueue, Visit visit) 180 { 181 PLinkListNode pNode; 182 pNode = pQueue->front; 183 while(pNode != NULL) 184 { 185 visit(&(pNode->data)); 186 pNode = pNode->next; 187 } 188 }
ElemType.c及ElemType.h见上一节 循环队列 中的实现
testmian.c
1 /********************************************************************* 2 *: 3 *: Filename: testLinkListQueue.c 4 *: 5 *: Author: DongXiaolin 6 *: Copyright (c) 2012, DongXiaolin 7 *: 8 *: Created at: 2012.06.12 9 *: Last modified: 2012.06.12 10 *: 11 *: Introduction: 链表队列(数据结构)的demo 12 *: 13 *: 14 *:*********************************************************************/ 15 #include <stdio.h> 16 #include "LinkListQueue.h" 17 18 int main() 19 { 20 LinkListQueue mQueue; 21 Stu a[4] = {{1,"zhangsan"}, {2,"lisi"}, {3,"wangwu"}, {4,"zhaoliu"}}; 22 int i; 23 24 /*初始化队列*/ 25 InitLinkListQueue(&mQueue); 26 27 /*向队列中插入数据*/ 28 for(i=0;i<4;i++) 29 { 30 if(AddLinkListQueue(&mQueue, &a[i])) 31 { 32 printf("Insert fail[%d][%s]\n", a[i].nStuId, a[i].szStuName); 33 } 34 } 35 36 TraverseLinkListQueue(&mQueue, visit); 37 38 /*从队列中删除数据*/ 39 ElemType outData; 40 if(OutLinkListQueue(&mQueue, &outData)) 41 { 42 printf("Del Data fail\n"); 43 } 44 printf("\nDel Data[%d][%s]\n", outData.nStuId, outData.szStuName); 45 TraverseLinkListQueue(&mQueue, visit); 46 47 /*从队列中删除数据*/ 48 if(OutLinkListQueue(&mQueue, &outData)) 49 { 50 printf("Del Data fail\n"); 51 } 52 printf("\nDel Data[%d][%s]\n", outData.nStuId, outData.szStuName); 53 TraverseLinkListQueue(&mQueue, visit); 54 55 56 57 /*从队列中提取数据*/ 58 if(PeekLinkListQueue(&mQueue, &outData)) 59 { 60 printf("Peek Data fail\n"); 61 } 62 printf("\nPeek Data[%d][%s]\n", outData.nStuId, outData.szStuName); 63 TraverseLinkListQueue(&mQueue, visit); 64 65 /*从队列中删除数据*/ 66 if(OutLinkListQueue(&mQueue, &outData)) 67 { 68 printf("Del Data fail\n"); 69 } 70 printf("\nDel Data[%d][%s]\n", outData.nStuId, outData.szStuName); 71 TraverseLinkListQueue(&mQueue, visit); 72 while(IsEmptyLinkListQueue(&mQueue)) 73 { 74 if(OutLinkListQueue(&mQueue, &outData)) 75 { 76 printf("Del Data fail\n"); 77 } 78 printf("\nDo Del Data[%d][%s]\n", outData.nStuId, outData.szStuName); 79 } 80 81 /*清空队列*/ 82 ClearLinkListQueue(&mQueue); 83 84 return 0; 85 }
makefile 如下 通用Makefile