循环链表企业链表

一、特点
让链表的最后一个结点的next指针指向头结点。初始化小节点时直接让next指针指向链表的头结点。
二、代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//小结点
typedef struct LISTNODE
{
	LISTNODE *next;
}ListNode;
//链表结点
typedef struct CIRCULARLIST
{
	ListNode head;
	int size;
}CircularList;

//数据
typedef struct PERSON
{
	ListNode node;
	char name[20];
	int age;
}person;
//输出函数指针
typedef void(*PRINT)(ListNode*);
void MyPrint(ListNode* data)
{
	person* p = (person*)data;
	printf("name: %s , age: %d \n",p->name,p->age);
}
//比较函数指针
typedef int(*COMPARED)(ListNode*,ListNode*);
int mycompared(ListNode* data1 ,ListNode* data2)
{
	person* p1 = (person*)data1;
	person* p2 = (person*)data2;
	if(p1->age == p2->age && strcmp(p1->name,p2->name) == 0)
	{
		return 0;
	}
	else 
		return -1;
}
//循环链表初始化
CircularList* Init_CircularList()
{
	CircularList* list = (CircularList*)malloc(sizeof(CircularList));
	list->head.next = &(list->head);   //让头结点的next指向自己
	list->size = 0;
	return list;
}
//循环链表的插入
void insert_circularList(CircularList* list , int pos ,ListNode* data)
{
	//判断
	if(list==NULL)
	{
		return;
	}
	if(pos<0||pos>list->size)
	{
		pos = list->size; //优化处理
	}
	//插入
	data->next = &(list->head);
	ListNode* pcur1 = &(list->head);
	for(int i = 0 ; i < pos ; i++)
	{
		pcur1 = pcur1->next;
	}
	data->next = pcur1->next;
	pcur1->next = data;
	list->size++;
}
//循环链表的值删除
void valuedelete(CircularList* list,ListNode* data,COMPARED mycompared)
{
	//判断
	if(list == NULL)
	{
		return;
	}
	if(data == NULL)
	{
		return;
	}
	//删除
	ListNode* pcur1 = &(list->head);
	ListNode* pcur2 = NULL;
	int flag = -1;
	for(int i=0; i<list->size; i++)
	{
		pcur2 = pcur1->next;
		flag = mycompared(pcur2,data);
        if(flag == 0)
		{
			break;
		}
		else
			pcur1=pcur1->next;
	}
	if(flag == -1)
	{
		printf("该数据不存在\n");
	}
	else
	{
	    pcur1->next = pcur2->next;
	    list->size--;
	}
}
//循环链表的位置删除
void posdelete(CircularList* list , int pos)
{
	//判断
	if(list == NULL)
	{
		return;
	}
	if(pos<0||pos>list->size)
	{
		printf("pos有误,请重新输入");
		return;
	}
	//删除
	ListNode* pcur = &(list->head);
	for(int i = 1;i<pos;i++)
	{
		pcur = pcur->next;
	}
	pcur->next = pcur->next->next;
	list->size--;
}
//循环链表的打印
void print_circularList(CircularList* list , PRINT MyPrintf)
{
	//判断
	if(list == NULL)
	{
		return;
	}
	//打印
	ListNode* pcur = list->head.next;
	for(int i = 0 ; i < (list->size)*2 ; i++)    //循环的次数  (list->size)*2
	{
		MyPrintf(pcur);
		pcur = pcur->next;
		if(pcur == &(list->head))
		{
			pcur = pcur->next;
		}
	}
}
//循环链表的长度
int size_circular(CircularList* list)
{
	printf("size: %d\n",list->size);
	return 0;
}
//两个循环链表的合并
void twolist(CircularList* list1 ,CircularList* list2)
{
	//判断
	if(list1 == NULL || list2 == NULL)
	{
		return;
	}
	//合并
	ListNode* list1_lastNode = list1->head.next;  //list1的最后一个结点
	for(int i = 1 ; i<list1->size ; i++)
	{
		list1_lastNode = list1_lastNode->next;
	}

	ListNode* list2_lastNode = list2->head.next;  //list2的最后一个结点
	for(int i = 1 ; i<list2->size ; i++)
	{
		list2_lastNode = list2_lastNode->next;
	}

	list1_lastNode->next = list2->head.next;    //将list1的最后一个结点指向list2第一个结点
	list2_lastNode->next = &(list1->head);      //将list2最后一个结点指向list1的头结点
	list1->size = list1->size + list2->size;   //长度
}
//循环链表的清空
void emptyList(CircularList* list)
{
	//判断
	if(list ==NULL)
	{
       return;
	}
	list->size = 0;
}
//循环链表的内存释放
void FreeSpace(CircularList* list)
{
	if(list == NULL)
	{
		return;
	}
	free(list);
}
int main()
{
	//创建循环链表
	CircularList* list = Init_CircularList();
	CircularList* list2 = Init_CircularList();
	//创建数据
	person p1, p2, p3;
	strcpy_s(p1.name,"aaa");
	strcpy_s(p2.name,"bbb");
	strcpy_s(p3.name,"ccc");
	p1.age = 21;
	p2.age = 22;
	p3.age = 23;
	 
	person p4, p5, p6;
	strcpy_s(p4.name,"ddd");
	strcpy_s(p5.name,"eee");
	strcpy_s(p6.name,"fff");
	p4.age = 21;
	p5.age = 22;
	p6.age = 23;

	//插入
	insert_circularList(list,1,(ListNode*)&p1);
	insert_circularList(list,1,(ListNode*)&p2);
	insert_circularList(list,1,(ListNode*)&p3);

	insert_circularList(list2,1,(ListNode*)&p4);
	insert_circularList(list2,1,(ListNode*)&p5);
	insert_circularList(list2,1,(ListNode*)&p6);
	//打印
	print_circularList(list,MyPrint);
	//循环链表的长度
	size_circular(list);
	print_circularList(list2,MyPrint);
	size_circular(list);

	twolist(list,list2);
	print_circularList(list,MyPrint);
	size_circular(list);
	//位置删除
	//posdelete(list,2);
	//print_circularList(list,MyPrint);

	//值删除
	//person p4;
	//strcpy_s(p4.name,"bbb");
	//p4.age = 22;
	//valuedelete(list,(ListNode*)&p4,mycompared);
	//print_circularList(list,MyPrint);
	//size_circular(list);

	//释放内存
	FreeSpace(list);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值