闲来没事,写写代码
闲来没事,写写代码

导航

 

 

 

 

 

单向循环链表,实现

 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;
}

 

posted on 2022-03-16 13:52  闲来没事,写写代码  阅读(38)  评论(0)    收藏  举报