![在这里插入图片描述](https://img-blog.csdnimg.cn/20210405192210190.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Zlbmd4dWV3ZWkxMjM=,size_16,color_FFFFFF,t_70)
#include "CircylarLinkedlists.h"
typedef struct PERSON
{
CircylarLinkNode node;
char name[64];
int age;
int score;
}Person;
void MyPrint(CircylarLinkNode*);
int MyCompare(CircylarLinkNode*, CircylarLinkNode*);
void test01();
void test02();
void test03();
int main(int argc, char **argv){
test03();
return 0;
}
void test01(){
CircylarLinkList* clist = Init_CircylarLinkList();
Person p1, p2, p3, p4, p5;
strcpy(p1.name, "aaa");
strcpy(p2.name, "bbb");
strcpy(p3.name, "ccc");
strcpy(p4.name, "ddd");
strcpy(p5.name, "eee");
p1.age = 10;
p2.age = 20;
p3.age = 30;
p4.age = 40;
p5.age = 50;
p1.score = 50;
p2.score = 60;
p3.score = 70;
p4.score = 80;
p5.score = 90;
Insert_CircylarLinkList(clist, 100, (CircylarLinkNode*)&p1);
Insert_CircylarLinkList(clist, 100, (CircylarLinkNode*)&p2);
Insert_CircylarLinkList(clist, 100, (CircylarLinkNode*)&p3);
Insert_CircylarLinkList(clist, 100, (CircylarLinkNode*)&p4);
Insert_CircylarLinkList(clist, 100, (CircylarLinkNode*)&p5);
Print_CircylarLinkList(clist, MyPrint);
FreeSpace_CircylarLinkList(clist);
}
void test02(){
CircylarLinkList* clist = Init_CircylarLinkList();
Person p1, p2, p3, p4, p5;
strcpy(p1.name, "aaa");
strcpy(p2.name, "bbb");
strcpy(p3.name, "ccc");
strcpy(p4.name, "ddd");
strcpy(p5.name, "eee");
p1.age = 10;
p2.age = 20;
p3.age = 30;
p4.age = 40;
p5.age = 50;
p1.score = 50;
p2.score = 60;
p3.score = 70;
p4.score = 80;
p5.score = 90;
Insert_CircylarLinkList(clist, 100, (CircylarLinkNode*)&p1);
Insert_CircylarLinkList(clist, 100, (CircylarLinkNode*)&p2);
Insert_CircylarLinkList(clist, 100, (CircylarLinkNode*)&p3);
Insert_CircylarLinkList(clist, 100, (CircylarLinkNode*)&p4);
Insert_CircylarLinkList(clist, 100, (CircylarLinkNode*)&p5);
Print_CircylarLinkList(clist, MyPrint);
Person pDel;
strcpy(pDel.name, "ccc");
pDel.age = 30;
pDel.score = 70;
RemoveByVal_CircylarLinkList(clist, (CircylarLinkNode*)&pDel, MyCompare);
Print_CircylarLinkList(clist, MyPrint);
FreeSpace_CircylarLinkList(clist);
}
void test03(){
CircylarLinkList* clist = Init_CircylarLinkList();
Person p1, p2, p3, p4, p5;
strcpy(p1.name, "aaa");
strcpy(p2.name, "bbb");
strcpy(p3.name, "ccc");
strcpy(p4.name, "ddd");
strcpy(p5.name, "eee");
p1.age = 10;
p2.age = 20;
p3.age = 30;
p4.age = 40;
p5.age = 50;
p1.score = 50;
p2.score = 60;
p3.score = 70;
p4.score = 80;
p5.score = 90;
Insert_CircylarLinkList(clist, 100, (CircylarLinkNode*)&p1);
Insert_CircylarLinkList(clist, 100, (CircylarLinkNode*)&p2);
Insert_CircylarLinkList(clist, 100, (CircylarLinkNode*)&p3);
Insert_CircylarLinkList(clist, 100, (CircylarLinkNode*)&p4);
Insert_CircylarLinkList(clist, 100, (CircylarLinkNode*)&p5);
Print_CircylarLinkList(clist, MyPrint);
RemoveByPos_CircylarLinkList(clist, 2);
Print_CircylarLinkList(clist, MyPrint);
FreeSpace_CircylarLinkList(clist);
}
void MyPrint(CircylarLinkNode* data){
Person* p = (Person*) data;
printf("name: %s \t age: %d \t score: %d\n", p->name, p->age, p->score);
}
int MyCompare(CircylarLinkNode* node1, CircylarLinkNode* node2){
Person* p1 = (Person*) node1;
Person* p2 = (Person*) node2;
if(strcmp(p1->name, p2->name) == 0 && p1->age == p2->age && p1->score == p2->score){
return CIRCYLARTLINKLIST_TRUE;
}
return CIRCYLARTLINKLIST_FALSE;
}
#include "CircylarLinkedlists.h"
CircylarLinkList* Init_CircylarLinkList(){
CircylarLinkList* clist = (CircylarLinkList*)malloc(sizeof(CircylarLinkList));
clist->head.next = &(clist->head);
clist->size = 0;
return clist;
}
void Insert_CircylarLinkList(CircylarLinkList* clist, int pos, CircylarLinkNode* data){
if(clist == NULL){
return;
}
if(data == NULL){
return;
}
if(pos < 0 || pos > clist->size){
pos = clist->size;
}
CircylarLinkNode* pCurrent = &(clist->head);
for(int i = 0; i < pos; i++){
pCurrent = pCurrent->next;
}
data->next = pCurrent->next;
pCurrent->next = data;
clist->size++;
}
CircylarLinkNode* Front_CircylarLinkList(CircylarLinkList* clist){
return clist->head.next;
}
void RemoveByPos_CircylarLinkList(CircylarLinkList* clist, int pos){
if(clist == NULL){
return;
}
if(pos < 0 || pos >= clist->size){
return;
}
CircylarLinkNode* pCurrent = &(clist->head);
for(int i = 0; i < pos; i++){
pCurrent = pCurrent->next;
}
pCurrent->next = pCurrent->next->next;
clist->size--;
}
void RemoveByVal_CircylarLinkList(CircylarLinkList* clist, CircylarLinkNode* data, COMPARENODE compare){
if(clist == NULL){
return;
}
if(data == NULL){
return;
}
CircylarLinkNode* pPrevious = &(clist->head);
CircylarLinkNode* pCurrent = clist->head.next;
for (int i = 0; i < clist->size; i++){
if (compare(pCurrent, data) == CIRCYLARTLINKLIST_TRUE)
{
pPrevious->next = pCurrent->next;
clist->size--;
break;
}
pPrevious = pCurrent;
pCurrent = pPrevious->next;
}
}
int Size_CircylarLinkList(CircylarLinkList* clist){
return clist->size;
}
int Find_CircylarLinkList(CircylarLinkList* clist, CircylarLinkNode* data, COMPARENODE compare){
if(clist == NULL){
return -1;
}
if(data == NULL){
return -1;
}
CircylarLinkNode* pCurrent = clist->head.next;
int i = 0;
int flag = -1;
for (; i < clist->size; i++)
{
if(compare(pCurrent,data) == 0){
flag = i;
break;
}
pCurrent = pCurrent->next;
}
return flag;
}
void Print_CircylarLinkList(CircylarLinkList* clist, PRINTNODE print){
if(clist == NULL){
return;
}
CircylarLinkNode* pCurrent = clist->head.next;
for(int i = 0; i < clist->size; i++){
print(pCurrent);
pCurrent = pCurrent->next;
}
printf("---------------------------------\n");
}
void FreeSpace_CircylarLinkList(CircylarLinkList* clist){
if(clist == NULL){
return;
}
free(clist);
}
int IsEmpty_CircylarLinkList(CircylarLinkList* clist){
if(clist->size == 0){
return CIRCYLARTLINKLIST_TRUE;
}
return CIRCYLARTLINKLIST_FALSE;
}
#ifndef CIRCYLAR_LINKED_LISTS_SINGLE_H
#define CIRCYLAR_LINKED_LISTS_SINGLE_H
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef struct CIRCYLARLINKNODE{
struct CIRCYLARLINKNODE* next;
}CircylarLinkNode;
typedef struct CIRCYLARLINKLIST{
CircylarLinkNode head;
int size;
}CircylarLinkList;
#define CIRCYLARTLINKLIST_TRUE 1
#define CIRCYLARTLINKLIST_FALSE 0
typedef int(*COMPARENODE)(CircylarLinkNode*, CircylarLinkNode*);
typedef void(*PRINTNODE)(CircylarLinkNode*);
CircylarLinkList* Init_CircylarLinkList();
void Insert_CircylarLinkList(CircylarLinkList* clist, int pos, CircylarLinkNode* data);
CircylarLinkNode* Front_CircylarLinkList(CircylarLinkList* clist);
void RemoveByPos_CircylarLinkList(CircylarLinkList* clist, int pos);
void RemoveByVal_CircylarLinkList(CircylarLinkList* clist, CircylarLinkNode* data, COMPARENODE compare);
int Size_CircylarLinkList(CircylarLinkList* clist);
int Find_CircylarLinkList(CircylarLinkList* clist, CircylarLinkNode* data, COMPARENODE compare);
void Print_CircylarLinkList(CircylarLinkList* clist, PRINTNODE print);
void FreeSpace_CircylarLinkList(CircylarLinkList* clist);
int IsEmpty_CircylarLinkList(CircylarLinkList* clist);
#endif
gcc -fPIC -shared CircylarLinkedlists.c -o libcircylarLinkedlists.so
gcc main.c -o main -L ./ -lcircylarLinkedlists -Wl,-rpath ./