单向循环链表简单实现
头文件:CircleLinkList.h
#ifndef CIRCLELINKLIST_H
#define CIRCLELINKLIST_H
#define CIRCLE_TRUE 1
#define CIRCLE_FALSE 0
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct CIRCLELINNODE {
struct CIRCLELINKNODE* next;
}CircleLinkNode;
typedef struct CICLELINKLIST {
CircleLinkNode head;
int size;
}CircleLinkList;
typedef int(*COMPARENODE_2)(CircleLinkNode*, CircleLinkNode*);
typedef void(*PRINTNODE)(CircleLinkNode*);
CircleLinkList* INIT_CIRCLELINKLIST();
void Insert_CircleLinkList(CircleLinkList* list, int pos, CircleLinkNode* data);
CircleLinkNode* Front_CircleLinkList(CircleLinkList* list);
void RemoveByPos_CircleLinkList(CircleLinkList* list, int pos);
void RemoveByVal_CircleLinkList(CircleLinkList* list, CircleLinkNode* data ,COMPARENODE_2) ;
int Size_CircleLinkList(CircleLinkList* list);
int Find_CircleLinkList(CircleLinkList* list, CircleLinkNode* data, COMPARENODE_2);
void Print_CircleLinkList(CircleLinkList* list,PRINTNODE print,int num);
void Print_CircleLinkList_Once(CircleLinkList* list, PRINTNODE print);
void FreeSpace_CircleLinkList(CircleLinkList* list);
#endif CIRCLELINKLIST_H
实现文件:CircleLinkList.c
#include"CircleLinkList.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
CircleLinkList* INIT_CIRCLELINKLIST() {
CircleLinkList* list = (CircleLinkList*)malloc(sizeof(CircleLinkList));
list->head.next = &(list->head);
list->size = 0;
return list;
}
void Insert_CircleLinkList(CircleLinkList* list, int pos, CircleLinkNode* data) {
if (list == NULL) {
return;
}
if (data == NULL) {
return;
}
if (pos<0 || pos>list->size) {
pos = list->size;
}
CircleLinkNode* pCurrent = &(list->head);
for (int i = 0; i < pos;i++) {
pCurrent = pCurrent->next;
}
data->next = pCurrent->next;
pCurrent->next = data;
list->size++;
}
CircleLinkNode* Front_CircleLinkList(CircleLinkList* list) {
return list->head.next;
}
void RemoveByPos_CircleLinkList(CircleLinkList* list, int pos) {
if (list == NULL) {
return;
}
if (pos<0 || pos>=list->size) {
return;
}
CircleLinkNode* pCurrent = &(list->head);
for (int i = 0; i < pos; i++) {
pCurrent = pCurrent->next;
}
CircleLinkNode* pNext = pCurrent->next;
pCurrent->next = pNext->next;
list->size--;
}
void RemoveByVal_CircleLinkList(CircleLinkList* list, CircleLinkNode* data, COMPARENODE_2 compare) {
if (list == NULL) {
return;
}
if (data == NULL) {
return;
}
CircleLinkNode* pPrev = &(list->head);
CircleLinkNode* pCurrent = list->head.next;
for (int i = 0; i < list->size; i++) {
if (compare(pCurrent, data) == CIRCLE_TRUE) {
pPrev->next = pCurrent->next;
list->size--;
break;
}
pPrev = pCurrent;
pCurrent = pPrev->next;
}
}
int Size_CircleLinkList(CircleLinkList* list){
return list->size;
}
int Find_CircleLinkList(CircleLinkList* list, CircleLinkNode* data, COMPARENODE_2 compare) {
if (list == NULL) {
return-1;
}
if (data == NULL) {
return-1;
}
CircleLinkNode* pCurrent = list->head.next;
int flag = -1;
for (int i = 0; i < list->size; i++) {
if (compare(pCurrent, data) == CIRCLE_TRUE) {
flag = i;
break;
}
pCurrent = pCurrent->next;
}
return flag;
}
void Print_CircleLinkList(CircleLinkList* list, PRINTNODE print,int num) {
if (list == NULL) {
return-1;
}
CircleLinkNode* pCurrent = list->head.next;
for (int i = 0; i < (list->size)*num; i++) {
if (pCurrent == &(list->head)) {
pCurrent = pCurrent->next;
}
print(pCurrent);
pCurrent = pCurrent->next;
}
}
void Print_CircleLinkList_Once(CircleLinkList* list, PRINTNODE print) {
if (list == NULL) {
return-1;
}
CircleLinkNode* pCurrent = list->head.next;
for (int i = 0; i < (list->size) ; i++) {
print(pCurrent);
pCurrent = pCurrent->next;
}
}
void FreeSpace_CircleLinkList(CircleLinkList* list) {
if (list == NULL) {
return-1;
}
list->size = 0;
free(list);
}
主文件:Main.c
typedef struct PERSON_3 {
CircleLinkNode node;
char name[64];
int age;
}Person_3;
void MyPrint3(CircleLinkNode* data) {
Person_3* p = (Person_3*)data;
printf("姓名:%-10s 年龄:%-10d\n", p->name, p->age);
}
int MyCompare2(CircleLinkNode* pCurrent, CircleLinkNode* data) {
Person_3* p1 = (Person_3*)pCurrent;
Person_3* p2 = (Person_3*)data;
if (strcmp(p1->name, p2->name) == 0 && p1->age == p2->age) {
return CIRCLE_TRUE;
}
return CIRCLE_FALSE;
}
void CircleLinkListTest() {
CircleLinkList* list = INIT_CIRCLELINKLIST();
Person_3 p1, p2, p3, p4, p5;
strcpy(p1.name, "Tom");
strcpy(p2.name, "Bob");
strcpy(p3.name, "Lili");
strcpy(p4.name, "Bryan");
strcpy(p5.name, "Hugo");
p1.age = 45;
p2.age = 16;
p3.age = 65;
p4.age = 19;
p5.age = 26;
Insert_CircleLinkList(list, 0, (CircleLinkNode*)&p1);
Insert_CircleLinkList(list, 0, (CircleLinkNode*)&p2);
Insert_CircleLinkList(list, 0, (CircleLinkNode*)&p3);
Insert_CircleLinkList(list, 0, (CircleLinkNode*)&p4);
Insert_CircleLinkList(list, 0, (CircleLinkNode*)&p5);
Print_CircleLinkList(list, MyPrint3, 2);
printf("----------------------------\n");
RemoveByPos_CircleLinkList(list, 2);
Person_3 p6;
strcpy(p6.name, "Hugo");
p6.age = 26;
RemoveByVal_CircleLinkList(list,(CircleLinkNode*)&p6,MyCompare2);
Print_CircleLinkList(list, MyPrint3, 1);
printf("----------------------------\n");
FreeSpace_CircleLinkList(list);
}
int main(){
CircleLinkListTest();
system("pause");
return 0;
}