博智数据结构——单项循环链表

单项循环链表的尾节点不再指向NULL而是指向头节点。

下图为申请链表节点和链表

下图 循环链表的初始化,由于刚刚初始化没有插入数据,所以头节点的下一个指向指针是自己的地址。

#include "CircleLinkList.h"
#include <string.h>
#include <stdio.h>
typedef  struct PERSON
{
	CircleLinkNode node;
	char name[64];
	int age;
	int score;

}Person;
void Myprint(CircleLinkNode*data)
{
	Person * p = (Person*)data;
	printf("学生名字:%s,年纪:%d,分数:%d", p->name, p->age, p->score);
	printf("\n");
}
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&&p1->score==p2->score)
	{
		return CIRCLELINKLIST_TRUE;
	}
	return CIRCLELINKLIST_FALSE;
}
int main()
{
	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 = 11; 
	p2.score = 21;
	p3.score = 31;
	p4.score = 41;
	p5.score = 51;

	CircleLinkList *clist = Init_CircleLinkList();
	//数据入链表
	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, Myprint);
	Person pDEl;
	strcpy(pDEl.name, "aaa");
	pDEl.age = 10;
	pDEl.score = 11;

	//根据值删除
	printf("------------\n");
	RemoveByValue_CircleLinkList(clist, (CircleLinkNode*)&pDEl, Mycompare);
	Print_CircleLinkList(clist, Myprint);
	FreeSpace_CircleLinklist(clist);
	return 0;
}
#pragma once
#ifndef CIRCLELINKLIST
#define CIRCLELINKLIST
#define CIRCLELINKLIST_TRUE 1
#define CIRCLELINKLIST_FALSE 0
#define _CRT_SECURE_NO_WARNINGS
//链表小结点
typedef struct CIRCLELINKNODE 
{
	struct CIRCLELINKNODE *next;
}CircleLinkNode;

typedef struct CIRCLELIST
{
	CIRCLELINKNODE head;
	int size;
}CircleLinkList;
//编写针对链表结构体操作的API函数
//比较回调
typedef int(*COMPARENODE)(CircleLinkNode*, CircleLinkNode*);
//打印回调
typedef void(*PRINTNODE)(CircleLinkNode*);
//初始化
CircleLinkList*Init_CircleLinkList();
//插入
void insert_CircleLinkList(CircleLinkList*clist, int post, CircleLinkNode *data);
//获得第一个元素
CircleLinkNode*Front_CircleLinkList(CircleLinkList*clist);
//根据位置删除
void RemoveBypos_CircleLinkList(CircleLinkList*clist, int pos);
//根据值删除
void RemoveByValue_CircleLinkList(CircleLinkList*clist, CircleLinkNode*data, COMPARENODE compare);
//获得链表的长度
int Size_CircleLinkList(CircleLinkList*clist);
//查找
int Find_CircleLinkList(CircleLinkList*clist, CircleLinkNode*data, COMPARENODE compare);
//打印
void Print_CircleLinkList(CircleLinkList*clis, PRINTNODE print);
//释放内存
void FreeSpace_CircleLinklist(CircleLinkList*clis);
//判读是否为空
int IsEmpty_CircleLinkList(CircleLinkList*clist);
#endif
#include "CircleLinkList.h"
#include <stdlib.h>
#include <stdio.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++;
}
//获得第一个元素
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*Next = pCurrent->next;
	pCurrent->next = Next->next;
	//pCurrent->next = pCurrent->next->next;
	//pCurrent->next = pCurrent->next->next;
	clist->size--;
}
//根据值删除
void RemoveByValue_CircleLinkList(CircleLinkList*clist, CircleLinkNode*data, COMPARENODE compare)
{
	if (clist == NULL)
	{
		return;
	}
	if (data == NULL)
	{
		return;
	}
	//这个是循环链表
	
	CircleLinkNode*pPrev = &(clist->head);
	CircleLinkNode*pCurrent = (clist->head.next);
	for (int i = 0; i < clist->size;i++)
	{
		
		if (compare(pCurrent,data)==CIRCLELINKLIST_TRUE)
		{
			pPrev->next=pCurrent->next;
			break;
		}
		pPrev = pCurrent;
		pCurrent = pPrev->next;
	}
	 
	
	clist->size--;

}
//获得链表的长度
int Size_CircleLinkList(CircleLinkList*clist)
{
	return clist->size;
}
//查找
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;
			break;
		}
		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++)
	{
		if (pCurrent == &(clist->head))
		{
			pCurrent = pCurrent->next;
			printf("-----------\n");
		}
		print(pCurrent);
		pCurrent = pCurrent->next;
	}
	
	
}
//释放内存
void FreeSpace_CircleLinklist(CircleLinkList*clist)
{
	if (clist ==NULL)
	{
		return;
	}
	

	free(clist);
}
//判读是否为空
int IsEmpty_CircleLinkList(CircleLinkList*clist)
{

	if (clist->size==0)
	{
		return CIRCLELINKLIST_TRUE;
	}
	else 
	{
		return CIRCLELINKLIST_FALSE;
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_40317531/article/details/85985566