循环链表

循环链表

  • 循环链表的原理:最后一个节点的next指向头节点,而不是NULL
    在这里插入图片描述

实例代码

circle_list.h

#include <stdio.h>
#include <stdlib.h>


typedef struct CIRCLELISTNODE
{
		struct  CIRCLELISTNODE* next;
		
}ListNode;




typedef struct CIRCLELIST {
		ListNode* head;
		ListNode* tail;
		int size;	
}ListInfo;


typedef void(*PRINT)(ListNode*);
typedef int (*COMPARE)(ListNode*,ListNode*);



ListInfo* Init_List();

void Push_Back(ListInfo* list, ListNode* data);

void Insert_list(ListInfo* list,int pos,ListNode* data);

void RemoveByPos_list(ListInfo* list,int pos);

void RemoveByValue_list(ListInfo* list,ListNode* data,COMPARE compare);

int Find_list(ListInfo* list,ListNode* data,COMPARE compare);

void Print(ListInfo* list,PRINT print);

circle_list.c

#include "../include/list.h"


ListInfo* Init_List()
{
	ListInfo* clist = (ListInfo*)malloc(sizeof(ListInfo));
	clist->head =( ListNode*) malloc(sizeof(ListNode));
	clist->tail=( ListNode*) malloc(sizeof(ListNode));

	clist->head->next = clist->head;
	clist->tail->next = clist->head;

	clist->size =0;

	return clist;
}


void Push_Back(ListInfo* list, ListNode* data)
{
	if(list == NULL)return;
	if(data == NULL)return;

	ListNode* pCurrent = list->tail;

	data->next = pCurrent->next;
	list->tail->next = data;
	list->tail = data;

	list->size++;	
}


void Insert_list(ListInfo* list,int pos,ListNode* data)
{
	if(list == NULL)return;
	if(data == NULL)return;
	if(pos<0 || pos > list->size)
	{
		pos = list->size;
	}

	ListNode* pCurrent = list->head;
	for(int i=0; i<pos; i++)
	{
		pCurrent = pCurrent->next;
	}

	data->next = pCurrent->next;
	pCurrent->next = data;

	if(pos == list->size)//插入尾部,需要改变尾部指针
	{
		list->tail = data;
	}

	list->size++;
}




void RemoveByPos_list(ListInfo* list,int pos)
{
	if(list == NULL)return;	
	if(pos < 0 || pos>=list->size)return;

	ListNode* pCurrent = list->head;
	for(int i=0;i<pos;i++)
	{
		pCurrent = pCurrent->next;
	}

	ListNode* pNext = pCurrent->next;
	pCurrent->next = pNext->next;

	if(pos == list->size)
		list->tail = pCurrent;
	list->size--;

}


void RemoveByValue_list(ListInfo* list,ListNode* data,COMPARE compare)
{
	if(list == NULL) return;
	if(data == NULL) return;
	int flag=0;
	
	ListNode* pCurrent=list->head;

	for(int i=0; i<list->size; i++)
	{
		flag =i;
		if(compare(pCurrent->next,data))
		{
			pCurrent->next = pCurrent->next->next;
			break;
		}	
	
	    pCurrent =pCurrent->next;
	}
	if(flag == list->size -1)//删除的是最后一个,则需要改变tail值
		list->tail = pCurrent;

	list->size--;
}


int Find_list(ListInfo* list,ListNode* data,COMPARE compare)
{
	int flag=0;

	if(list == NULL) return -1;
	if(data == NULL) return -1;

	ListNode* pCurrent=list->head->next;

	for(int i=0; i<list->size; i++)
	{
		if(compare(pCurrent,data))
		{
			flag=i;
			break;
		}
		pCurrent = pCurrent->next;
	}	

return flag;
}






void Print(ListInfo* list,PRINT print)
{

	if(list==NULL) return;
	
	ListNode* pCurrent = list->head->next;
	for(int i=0; i<list->size; i++)
	{
		if(pCurrent == list->head)//循环到头节点了
		{
			pCurrent = pCurrent->next;
		}
		print(pCurrent);
		pCurrent = pCurrent->next;
	}


}

main.c

#include <stdio.h> 
#include <string.h>
#include <stdlib.h>
#include "../include/list.h"

typedef struct PERSON
{
	ListNode node;
	char name[64];
	int age;
	int score;
	
}Person;

void MyPrint(ListNode* data)
{
	Person* p =(Person*)data;
	printf("name: %s,age: %d,score: %d\n",p->name,p->age,p->score);
}


int MyCompare(ListNode* data1,ListNode* data2)
{
	Person* p1 =(Person*)data1;
	Person* p2 =(Person*)data2;

	if(p1->age==p2->age && p1->name==p2->name && p1->score == p2->score)
	{
		return 1;
	}

	else
	{
		return  0;
	}

}

int main(void)
{
	ListInfo* list = Init_List();

	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 =100;
	p2.score =200;
	p3.score =300;
	p4.score =400;
	p5.score =500;

	Insert_list(list, 100,(ListNode*)&p2);//在最后一位插入
	Insert_list(list, 100,(ListNode*)&p3);
	Insert_list(list,0,(ListNode*)&p1);//在第0位插入

	Push_Back(list,(ListNode*)&p4);//插入最后
	Push_Back(list,(ListNode*)&p5);
	Print(list,MyPrint);
	
	printf("----删除第一个和最后一个------\n");
	RemoveByPos_list(list,0);
	RemoveByPos_list(list,3);
	Print(list,MyPrint);
	
	printf("-----删除ddd-----\n");
	RemoveByValue_list(list,(ListNode*)&p4,MyCompare);
	Print(list,MyPrint);
	printf("----------\n");

	int pos=Find_list(list,(ListNode*)&p3,MyCompare);
	printf("ccc pos: %d\n",pos);

       
	return 0;
}

结果:
在这里插入图片描述

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值