单向循环链表,实现
1 //LinkList.h 2 3 4 5 //单项循环链表 6 7 8 9 #ifndef CIRCLELINKLIST_H 10 #define CIRCLELINKLIST_H 11 12 #include<stdlib.h> 13 #include<string.h> 14 15 16 17 //链表节点 18 typedef struct CIRCLELINKNODE { 19 struct CIRCLELINKNODE* next; 20 21 }CircleLinkNode; 22 23 //链表结构体 24 typedef struct CIRCLELINKLIST { 25 CircleLinkNode head; 26 int size; 27 }CircleLinkList; 28 29 30 31 //链表API 32 33 #define CIRCLELINKLIST_TRUE 1 //链表为空 34 #define CIRCLELINKLIST_FALSE 0 //链表非空 35 36 //比较回调函数指针o 37 typedef int(*COMPARENODE)(CircleLinkNode*,CircleLinkNode*); 38 //打印回调函数指针 39 typedef void (*PRINTNODE)(CircleLinkNode*); 40 41 //初始化函数 42 CircleLinkList* Init_CircleLinkList(); 43 //插入函数 44 void Insert_CircleLinkList(CircleLinkList *clist, int pos, CircleLinkNode* data); 45 //获取第一个元素 46 CircleLinkNode* Front_CircleLinkList(CircleLinkList* clist); 47 //根据位置删除 48 void RemoveByPos_CircleLinkList(CircleLinkList* clist, int pos); 49 //根据值删除 50 void RemoveByValue_CircleLinkList(CircleLinkList* clist,CircleLinkNode *data,COMPARENODE compare ); 51 //获得链表长度 52 int Size_CircleLinkList(CircleLinkList* clist); 53 //判断是否为空 54 int Is_CircleLinkList(CircleLinkList *clis); 55 //查找 56 int Find_CircleLinkList(CircleLinkList* clist, CircleLinkNode* data, COMPARENODE compare); 57 58 //打印节点 59 void Print_CircleLinkList(CircleLinkList* clist,PRINTNODE print ); 60 //释放内存 61 void FreeSpace_CircleLinkList(CircleLinkList* clist); 62 63 #endif
//LinkList.c #include"CircleLinkList.h" //初始化函数 CircleLinkList* Init_CircleLinkList() { CircleLinkList* clist = (CircleLinkList*)malloc(sizeof(CircleLinkList)); clist->head.next = &(clist->head); clist->size = 0; return clist; } //插入函数 void Insert_CircleLinkList(CircleLinkList* clist, int pos, CircleLinkNode* data) { if (clist == NULL) { return; } if (data == NULL) { return; } if (pos < 0 || pos > clist->size) { pos = clist->size; } //根据位置中查找结点 //辅助指针变量 CircleLinkNode* pCurrent = &(clist->head); for (int i = 0; i < pos;i++) { pCurrent = pCurrent->next; } //新数据插入 data->next = pCurrent->next; pCurrent->next = data; clist->size++; return; } //获取第一个元素 CircleLinkNode* Front_CircleLinkList(CircleLinkList* clist) { return clist->head.next; } //根据位置删除 void RemoveByPos_CircleLinkList(CircleLinkList* clist, int pos){ if (clist == NULL) { return; } if (pos < 0 || pos >= clist->size) { return; } //查找pos结点 //辅助指针变量 CircleLinkNode* pCurrent = &(clist->head); for (int i = 0; i < pos; i++) { pCurrent = pCurrent->next; } //缓存当前节点的下一个结点 CircleLinkNode* pNext = pCurrent->next; pCurrent->next = pNext->next; clist->size--;//节点计数器减1 return; } //根据值删除 void RemoveByValue_CircleLinkList(CircleLinkList* clist, CircleLinkNode* data, COMPARENODE compare) { if (clist == NULL) { return; } if (data == NULL) { return; } CircleLinkNode* pPrev = &(clist->head); CircleLinkNode* pCurrent = pPrev->next; int i = 0; for (i = 0; i < clist->size; i++) { if (compare(pCurrent, data) == CIRCLELINKLIST_TRUE) { pPrev->next = pCurrent->next; break; } pPrev = pCurrent; pCurrent = pPrev->next; } return ; } //获得链表长度 int Size_CircleLinkList(CircleLinkList* clist) { return clist->size; } //判断是否为空 int Is_CircleLinkList(CircleLinkList* clis) { if (clis->size == 0) { return CIRCLELINKLIST_TRUE; } return CIRCLELINKLIST_FALSE ; } //查找 int Find_CircleLinkList(CircleLinkList* clist, CircleLinkNode* data, COMPARENODE compare) { if (clist == NULL) { return -1; } if (data == NULL) { return -1; } CircleLinkNode* pCurrent = clist->head.next; int flag = -1; for (int i = 0; i < clist->size; i++) { if (compare(pCurrent, data) == CIRCLELINKLIST_TRUE) { flag = i; pCurrent = pCurrent->next; } } return flag; } //打印节点 void Print_CircleLinkList(CircleLinkList* clist, PRINTNODE print) { if (clist == NULL) { return; } CircleLinkNode* pCurrent = clist->head.next; for (int i = 0; i < clist->size; i++) { print(pCurrent); pCurrent = pCurrent->next; } return; } //释放内存 void FreeSpace_CircleLinkList(CircleLinkList* clist) { if (clist == NULL) { return; } free(clist); return; }
//main.c #define _CRT_SECURE_NO_WARNINGS #include<stdlib.h> #include<stdio.h> #include<string.h> #include"CircleLinkList.h" typedef struct PERSION { CircleLinkNode node; char name[64]; int Age; int score; }Persion; //打印Persion函数 void Print_Persion(CircleLinkNode* data) { Persion* p = (Persion*)data; printf("name:%s Age:%d score:%d\n",p->name,p->Age,p->score); return; } int main(void) { //创建循环链表 CircleLinkList* clist = Init_CircleLinkList(); Persion p1, p2, p3, p4, p5; strcpy(p1.name, "p1"); strcpy(p2.name, "p2"); strcpy(p3.name, "p3"); strcpy(p4.name, "p4"); strcpy(p5.name, "p5"); p1.Age = 1; p2.Age = 2; p3.Age = 3; p4.Age = 4; p5.Age = 5; p1.score = 10; p2.score = 20; p3.score = 30; p4.score = 40; p5.score = 50; //数据入链表 Insert_CircleLinkList(clist, 0, (CircleLinkNode*)&p1); Insert_CircleLinkList(clist, 0, (CircleLinkNode*)&p2); Insert_CircleLinkList(clist, 0, (CircleLinkNode*)&p3); Insert_CircleLinkList(clist, 0, (CircleLinkNode*)&p4); Insert_CircleLinkList(clist, 0, (CircleLinkNode*)&p5); //打印 Print_CircleLinkList(clist,Print_Persion ); //释放内存 FreeSpace_CircleLinkList(clist); system("pause"); return 0; }