
头文件:
#ifndef CIRCLELINKLIST
#define CIRCLELINKLIST
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//链表小节点
typedef struct CIRCLELINKNODE {
struct CIRCLELINKNODE* next;
}CircleLinkNode;
//链表结构体
typedef struct CIRCLELINKLIST {
CircleLinkNode head;
int size;
}CircleLinkList;
//定义真假宏
#define CIRCLELINKLIST_TRUE 1
#define CIRCLELINKLIST_FALSE 0
//比较回调函数
typedef int(*COMPARENODE)(CircleLinkNode*, CircleLinkNode*);
//打印回调函数
typedef void(*PRINTNODE)(CircleLinkNode*);
//针对链表结构体操作的API函数
//链表初始化函数
CircleLinkList* initCircleLinkList();
//插入函数
void insertByPos(CircleLinkList* clist, int pos, CircleLinkNode* data);
//获得第一个元素
CircleLinkNode* getFront(CircleLinkList* clist);
//根据位置删除
void removeByPos(CircleLinkList* clist, int pos);
//根据值删除
void removeByValue(CircleLinkList* clist, CircleLinkNode* data, COMPARENODE compare);
//获取链表长度
int getSize(CircleLinkList* clist);
//判断是否为空
int isEmpty(CircleLinkList* clist);
//根据值查找
int findByValue(CircleLinkList* clist, CircleLinkNode* data, COMPARENODE compare);
//打印节点
void printList(CircleLinkList* clist, PRINTNODE print);
//释放内存
void freeSpace(CircleLinkList* clist);
#endif
API实现:
#include "CircleLinkList.h"
//针对链表结构体操作的API函数
//链表初始化函数
CircleLinkList* initCircleLinkList() {
CircleLinkList* clist = (CircleLinkList*)malloc(sizeof(CircleLinkList*));
//链表数据初始化
clist->head.next = &(clist->head);
clist->size = 0;
return clist;
}
//插入函数
void insertByPos(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++;
}
//获得第一个元素
CircleLinkNode* getFront(CircleLinkList* clist) {
return clist->head.next;
}
//根据位置删除
void removeByPos(CircleLinkList* clist, int pos) {
if (clist == NULL) {
return;
}
if (pos < 0 || pos > clist->size) {
return;
}
CircleLinkNode* pCurrent = clist->head.next;
for (int i = 0; i < pos; i++) {
pCurrent = pCurrent->next;
}
//缓存当前节点的下一个节点
CircleLinkNode* pNext = pCurrent->next;
pCurrent->next = pNext->next;
clist->size--;
}
//根据值删除
void removeByValue(CircleLinkList* clist, CircleLinkNode* data, COMPARENODE compare) {
if (clist == NULL || data == NULL) {
return;
}
CircleLinkNode* pCurrent = clist->head.next;
for (int i = 0; i < clist->size; i++) {
if (compare(pCurrent, data) == CIRCLELINKLIST_TRUE) {
removeByPos(clist, i);
break;
}
pCurrent = pCurrent->next;
}
}
//获取链表长度
int getSize(CircleLinkList* clist) {
return clist->size;
}
//判断链表是否为空
int isEmpty(CircleLinkList* clist) {
if (clist == NULL) {
return CIRCLELINKLIST_TRUE;
}
return CIRCLELINKLIST_FALSE; //返回0表示,非空
}
//根据值查找
int findByValue(CircleLinkList* clist, CircleLinkNode* data, COMPARENODE compare) {
if (clist == NULL || data == NULL) {
return;
}
CircleLinkNode* pCurrent = clist->head.next;
int flag = -1;
for (int i = 0; i < clist->size; i++) {
if (compare(pCurrent, data) == CIRCLELINKLIST_TRUE) {
flag = i;
break;
}
pCurrent = pCurrent->next;
}
return flag;
}
//打印节点
void printList(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;
}
}
//释放内存
void freeSpace(CircleLinkList* clist) {
if (clist == NULL) {
return;
}
free(clist);
}
测试代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "CircleLinkList.h"
//测试结构体
typedef struct PERSON {
CircleLinkNode node; //连接各个数据
char name[64];
int age;
}Person;
void myPrint(CircleLinkNode * data) {
Person* person = (Person*)data;
printf("name:%s, age:%d\n", person->name, person->age);
}
//1代表相同,0代表不同
int myCompare(CircleLinkNode* data1, CircleLinkNode* data2) {
Person* p1 = (Person*)data1;
Person* p2 = (Person*)data2;
if (strcmp(p1->name, p2->name) == 0 && p1->age == p2->age) {
return CIRCLELINKLIST_TRUE;
}
return CIRCLELINKLIST_FALSE;
}
void test01() {
CircleLinkList* clist = initCircleLinkList();
//创建测试数据
Person p1, p2, p3, p4, p5, p6;
strcpy(p1.name, "aaa");
strcpy(p2.name, "bbb");
strcpy(p3.name, "ccc");
strcpy(p4.name, "ddd");
strcpy(p5.name, "eee");
strcpy(p6.name, "fff");
p1.age = 30;
p2.age = 40;
p3.age = 50;
p4.age = 60;
p5.age = 70;
p6.age = 80;
//插入数据到链表结构
insertByPos(clist, 0, (CircleLinkNode*)(&p1));
insertByPos(clist, 0, (CircleLinkNode*)(&p2));
insertByPos(clist, 0, (CircleLinkNode*)(&p3));
insertByPos(clist, 0, (CircleLinkNode*)(&p4));
insertByPos(clist, 0, (CircleLinkNode*)(&p5));
insertByPos(clist, 0, (CircleLinkNode*)(&p6));
//打印数据
printList(clist, myPrint);
printf("===============================\n");
//删除数据
removeByPos(clist, 2);
printList(clist, myPrint);
printf("===============================\n");
//查找数据
Person findP;
strcpy(findP.name, "ccc");
findP.age = 50;
int flag = findByValue(clist, &findP, myCompare);
if (flag == CIRCLELINKLIST_TRUE) {
printf("数据 %s 找到了\n", findP.name);
} else {
printf("数据 %s 未找到了\n", findP.name);
}
}
int main(void) {
test01();
system("pause");
return 0;
}