
单向循环链表,实现
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; }
浙公网安备 33010602011771号