头文件:
1 #ifndef _CIRCLELIST_H_ 2 #define _CIRCLELIST_H_ 3 typedef void CircleList; 4 5 // 6 7 typedef struct _tag_CircleListNode 8 { 9 struct _tag_CircleListNode* next; 10 }CircleListNode; 11 12 //创建一个循环链表 13 CircleList* CircleList_Create(); 14 //删除一个循环链表 15 void CircleList_Destroy(CircleList* list); 16 //清空一个循环链表 17 void CircleList_Clear(CircleList* list); 18 //返回链表的长度 19 int CircleList_Length(CircleList* list); 20 //在POS位置插入一个节点 21 int CircleList_Insert(CircleList* list, CircleListNode* node, int pos); 22 //获取POS位置节点的信息 23 CircleListNode* CircleList_Get(CircleList* list, int pos); 24 //删除POS位置的节点 25 CircleListNode* CircleList_Delete(CircleList* list, int pos); 26 27 ////与游标相关的函数 28 //删除游标所指的位置节点 29 CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node); 30 //重置游标位置 31 CircleListNode* CircleList_Reset(CircleList* list); 32 //当前游标位置 33 CircleListNode* CircleList_Current(CircleList* list); 34 //游标的NEXT域 35 CircleListNode* CircleList_Next(CircleList* list); 36 37 #endif
CPP文件:
1 #include "circleList.h" 2 #include <iostream> 3 4 using namespace std; 5 6 //这个为头链表头 7 typedef struct _tag_CircleList 8 { 9 CircleListNode header; 10 CircleListNode* slider; 11 int length; 12 }tagCircleList; 13 14 //创建一个循环链表 15 CircleList* CircleList_Create() 16 { 17 tagCircleList* ret = (tagCircleList*)malloc(sizeof(tagCircleList)); //分配内存 18 if (ret == NULL) 19 { 20 return NULL; 21 } 22 23 //初始化 24 ret->header.next = NULL; 25 ret->length = 0; 26 ret->slider = NULL; 27 28 return ret; 29 } 30 31 //删除一个循环链表 32 void CircleList_Destroy(CircleList* list) 33 { 34 if (list = NULL) 35 { 36 return; 37 } 38 //释放内存 39 free(list); 40 return; 41 } 42 43 //清空一个循环链表 44 void CircleList_Clear(CircleList* list) 45 { 46 tagCircleList* sList = NULL; 47 sList = (tagCircleList*)list; 48 if (sList == NULL) 49 { 50 return ; 51 } 52 //重置为初始化状态 53 sList->header.next = NULL; 54 sList->length = 0; 55 sList->slider = NULL; 56 return; 57 } 58 59 //返回链表的长度 60 int CircleList_Length(CircleList* list) 61 { 62 tagCircleList* sList = NULL; 63 sList = (tagCircleList*)list; 64 int ret = -1; 65 //异常处理 66 if (list == NULL) 67 { 68 return ret; 69 } 70 71 return sList->length; 72 } 73 74 //在POS位置插入一个节点 75 int CircleList_Insert(CircleList* list, CircleListNode* node, int pos) 76 { 77 tagCircleList* sList = NULL; 78 sList = (tagCircleList*)list; 79 int ret = -1; 80 //异常处理 81 if(list == NULL || node == NULL || pos<0) 82 { 83 return ret; 84 } 85 //临时变量Current 86 CircleListNode* Current = (CircleListNode*)sList; 87 88 for(int i = 0; (i < pos) && (Current->next != NULL); i++) 89 { 90 Current = Current->next; 91 } 92 93 node->next = Current->next; 94 Current->next = node; 95 96 //当长度为0时 游标指向node 97 if (sList->length == 0) 98 { 99 sList->slider = node; 100 } 101 102 sList->length++; 103 //如果current 依旧指向链表头 证明没跳走 是从0开始插入的 需要头插法 104 if (Current == (CircleListNode*)sList) 105 { 106 //定义一个辅助last 变量来获取尾部节点的信息 107 CircleListNode* last = (CircleListNode*)CircleList_Get(sList, sList->length - 1); 108 //将尾部节点的NEXT域存为当前节点(头节点) 109 last->next = Current->next; 110 } 111 return 0; 112 } 113 114 //获取POS位置节点的信息 115 CircleListNode* CircleList_Get(CircleList* list, int pos) 116 { 117 118 tagCircleList* sList = (tagCircleList*)list; 119 CircleListNode* ret = NULL; 120 int i = 0; 121 if (list == NULL || pos < 0) 122 { 123 return NULL; 124 } 125 CircleListNode* Current = (CircleListNode*)sList; 126 for(i = 0; i < pos; i++) 127 { 128 Current = Current->next; 129 } 130 131 ret = Current->next; 132 return ret; 133 } 134 135 //删除POS位置的节点 136 CircleListNode* CircleList_Delete(CircleList* list, int pos) 137 { 138 tagCircleList* sList = (tagCircleList*)list; 139 CircleListNode* ret = NULL; 140 141 if ((sList != NULL) && (pos >=0) && (sList->length > 0)) 142 { 143 //将Current指向表头 144 CircleListNode* Current = (CircleListNode*)(&(sList->header)); 145 //辅助节点last 进行头节点的删除使用 存取最后一个元素 146 CircleListNode* last = NULL; 147 148 for(int i = 0; i < pos; i++) 149 { 150 Current = Current->next; 151 } 152 //删除头结点 153 if ( Current == (CircleListNode*)sList) 154 { 155 last = (CircleListNode*)CircleList_Get(sList, sList->length - 1); 156 } 157 //要删除的元素 158 ret = Current->next; 159 Current->next = ret->next; 160 sList->length--; 161 162 //判断链表非空 163 if( last != NULL) 164 { 165 //sList->header.next = ret->next; 166 Current->next = ret->next; 167 last->next = ret->next; 168 } 169 //若删除的元素为游标所指的元素 170 if(sList->slider = ret) 171 { 172 sList->slider = ret->next; 173 } 174 //若删除元素后 链表长度为0 做处理 175 if (sList->length == 0) 176 { 177 sList->header.next = NULL; 178 sList->slider = NULL; 179 } 180 } 181 return ret; 182 } 183 184 ////与游标相关的函数 185 //删除游标所指的位置节点 186 CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node) 187 { 188 tagCircleList* sList = (tagCircleList*)list; 189 CircleListNode* ret = NULL; 190 int i = 0; 191 192 if (sList != NULL) 193 { 194 CircleListNode* Current = (CircleListNode*)sList; 195 //循环查找node 在链表中的位置 196 for (i = 0; i < sList->length; i++) 197 { 198 if (Current->next == node) 199 { 200 ret = Current->next; 201 break; 202 } 203 204 Current = Current->next; 205 } 206 //找到了 使用CircleList_Delete 删除 207 if(ret != NULL) 208 { 209 CircleList_Delete(list, i); 210 } 211 212 } 213 214 return ret; 215 } 216 217 //重置游标位置 218 CircleListNode* CircleList_Reset(CircleList* list) 219 { 220 tagCircleList* sList = (tagCircleList*)list; 221 CircleListNode* ret = NULL; 222 //如果不为空 223 if (sList != NULL) 224 { 225 sList->slider = sList->header.next; 226 ret = sList->slider; 227 } 228 229 return ret; 230 } 231 232 //当前游标位置 233 CircleListNode* CircleList_Current(CircleList* list) 234 { 235 tagCircleList* sList = (tagCircleList*)list; 236 CircleListNode* ret = NULL; 237 //如果不为空 238 if (sList != NULL) 239 { 240 ret = sList->slider; 241 } 242 243 return ret; 244 } 245 246 //把游标位置返回,游标下移 247 CircleListNode* CircleList_Next(CircleList* list) 248 { 249 tagCircleList* sList = (tagCircleList*)list; 250 CircleListNode* ret = NULL; 251 //如果不为空 252 if((sList != NULL) && (sList->slider != NULL)) 253 { 254 ret = sList->slider; 255 sList->slider = ret->next; 256 } 257 258 return ret; 259 }
测试函数:
#include "circleList.h" #include <iostream> using namespace std; typedef struct _Temp_Test { CircleListNode node; int temp; char temp2; }TempTast; int main() { CircleList* circlelist = NULL; circlelist = CircleList_Create(); //异常处理 if (circlelist == NULL) { cout << "Create Err " << endl; return -1; } TempTast t1, t2, t3, t4, t5; t1.temp = 1; t2.temp = 2; t3.temp = 3; t4.temp = 4; t5.temp = 5; //插入元素 CircleList_Insert(circlelist, (CircleListNode*)(&t1), 0); CircleList_Insert(circlelist, (CircleListNode*)(&t2), 0); CircleList_Insert(circlelist, (CircleListNode*)(&t3), 0); CircleList_Insert(circlelist, (CircleListNode*)(&t4), 0); CircleList_Insert(circlelist, (CircleListNode*)(&t5), 0); //测试功能 cout << "Length: " << CircleList_Length(circlelist) << endl; //遍历两次 cout << "遍历两次:" << endl; for(int i = 0; i < 2*CircleList_Length(circlelist); i++) { cout <<"Node:" << ((TempTast*)CircleList_Get(circlelist, i))->temp << endl; } cout << endl; //删除第一个节点 cout <<"Node:" << ((TempTast*)CircleList_Delete(circlelist, 0))->temp << endl; //清空 CircleList_Clear(circlelist); cout << "After Clear Length: " << CircleList_Length(circlelist) << endl; //插入元素 CircleList_Insert(circlelist, (CircleListNode*)(&t1), 0); CircleList_Insert(circlelist, (CircleListNode*)(&t2), 0); CircleList_Insert(circlelist, (CircleListNode*)(&t3), 0); CircleList_Insert(circlelist, (CircleListNode*)(&t4), 0); CircleList_Insert(circlelist, (CircleListNode*)(&t5), 0); //删除指定元素 cout << "Delete Node :" << ((TempTast*)CircleList_DeleteNode(circlelist, (CircleListNode*)(&t1)))->temp << endl; //显示游标当前位置 cout << "Silder Now :" << ((TempTast*)CircleList_Current(circlelist))->temp << endl; //移动后 CircleList_Next(circlelist); cout << "Silder After Next :" << ((TempTast*)CircleList_Current(circlelist))->temp << endl; //重置后 CircleList_Reset(circlelist); cout << "Silder After Reset :" << ((TempTast*)CircleList_Current(circlelist))->temp << endl; cout << endl; //销毁 CircleList_Destroy(circlelist); cout << "circle has been Destroied" << endl; system("pause"); return 0; }