0
点赞
收藏
分享

微信扫一扫

[循环链表]——单向循环链表

 头文件:

#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;
}
举报

相关推荐

0 条评论