循环链表设计(缺少结点按照值删除)

在这里插入图片描述
代码实现形式
在这里插入图片描述
首先我暂时没有做根据值删除,因为我的回调函数比较出现问题,之后在更新

#include <stdlib.h>
#include <stdio.h>
//链表小节点
typedef struct CIRCLELINKNODE
{
	struct CIRCLELINKNODE* next;
}CircleLinkNode;
//链表结点
typedef struct CIRCLELINKLIST
{
	CircleLinkNode head;
	int size;
}CircleList;
//编写针对链表结构体操作的API函数
#define CIRCLELINKLINK_TRUE 1;
#define CIRCLELINKLINK_FALSE 0;
//遍历函数指针
typedef void(*PRINTNODE)(CircleLinkNode *);
//比较函数指针
typedef int(*COMPARENODE)(CircleLinkNode*, CircleLinkNode*);
//初始化链表
CircleList *Init_LinkList();
//插入
void Insert_CircleLinkList(CircleList *list,int pos,CircleLinkNode *data);
//获得第一个值
CircleLinkNode *Front_CircleLinkLint(CircleList *list);
//根据位置删除
void Remove_CircleLinkList(CircleList *list,int pos);
//根据值删除
//void Remove_CircleLinkList(CircleList *list,CircleLinkNode *data,COMPARENODE compare);
//判断链表是否为空
int IsEmpty_CircleLinkList(CircleList *list);
//根据值查找
//int Find_CircleLinkList(CircleList *list,CircleLinkNode *data,COMPARENODE compare);
//根据位置查找
int Findvalue_CircleLinkList(CircleList *list,int pos);
//返回链表大小
int Size_CircleLinkList(CircleList *list);
//打印
void Print_CircleLinkList(CircleList *list,PRINTNODE print);
//释放链表内存
void PressSpace_CircleLinkList(CircleList *list);

实现代码

#include "CircleLinkList.h"
//初始化链表
CircleList *Init_LinkList()
{
	CircleList *list=(CircleList *)malloc(sizeof(CircleList));
	list->size=0;
	//循环链表,这样可以减少代码量,定义最后一个结点直接指向第一个结点
	list->head.next=&(list->head);
	return list;
}
//插入
void Insert_CircleLinkList(CircleList *list,int pos,CircleLinkNode *data)
{
	CircleLinkNode *pCurent=&(list->head);
	if(list==NULL)
	{
		return;
	}
	if(data==NULL)
	{
		return;
	}
	if(pos<0||pos>list->size)
	{
		pos=list->size;
	}
	for(int i=0;i<pos;i++)
	{
		pCurent=pCurent->next;
	}
	//一定不要操作原指针
	
	data->next=pCurent->next;
	pCurent->next=data;
	list->size++;
}
//获得第一个元素
CircleLinkNode *Front_CircleLinkLint(CircleList *list)
{
	return list->head.next;
}
//删除
void Remove_CircleLinkList(CircleList *list,int pos)
{
	if(list==NULL)
	{
		return;
	}
	if(pos<0||pos>list->size)
	{
		return;
	}	
	CircleLinkNode *pCurent=&(list->head);
	for(int i=0;i<pos;i++)
	{
		pCurent=pCurent->next;
	}
	pCurent->next=pCurent->next->next;
	list->size--;
}
//根据值删除
//void Remove_CircleLinkList(CircleList *list,CircleLinkNode *data,COMPARENODE compare)
//{
//	if(list==NULL) 
//	{
//		return;
//	}
//	if(data==NULL)
//	{
//		return;
//	}
//	//从值查找,所以我把位置定在next
//	CircleLinkNode *pPrew=&list->head;
//	CircleLinkNode *pCurent=list->head.next;
//	for(int i=0;i<list->size;i++)
//	{
//		//pCurent=pCurent->next;
//		if(compare(pCurent,data)==CIRCLELINKLINK_TRUE)
//		{
//			pPrew->next=pCurent->next;
//			break;
//		}
//		pPrew=pCurent;
//		pCurent=pPrew->next;
//	}
//	
//	list->size--;
//}
//判断链表是否为空
int IsEmpty_CircleLinkList(CircleList *list)
{
	if(list->size==0)
	{
		//是空
		return CIRCLELINKLINK_TRUE;
	}
	else
	{//非空
		return CIRCLELINKLINK_FALSE;
	}
}
//根据值查找
//int Find_CircleLinkList(CircleList *list,CircleLinkNode *data,COMPARENODE compare)
//{
//	if(list==NULL)
//	{
//		return -1;
//	}
//	if(data==NULL)
//	{
//		return -1;
//	}
//	CircleLinkNode *pCurrent=list->head.next;
//	int flag=-1;
//	for(int i=0;i<list->size;i++)
//	{
//		if(compare(pCurrent,data)==CIRCLELINKLINK_TRUE)
//		{
//			flag=i;
//			break;
//		}
//		pCurrent=pCurrent->next;
//	}
//	return flag;
//}
//根据位置查找
int Findvalue_CircleLinkList(CircleList *list,int pos)
{
	return 0;
}
//返回链表大小
int Size_CircleLinkList(CircleList *list)
{
	return list->size;
}
//打印
void Print_CircleLinkList(CircleList *list,PRINTNODE print)
{
	if(list==NULL)
	{
		return;
	}
	CircleLinkNode *pCurrent=list->head.next;
	//打印俩次,循环链表
	for(int i=0;i<list->size*3;i++)
	{
		if(pCurrent==&list->head)
		{
			printf("---------------------\n");
			pCurrent=pCurrent->next;
		}
		print(pCurrent);
		pCurrent=pCurrent->next;
	}
}
//释放链表内存
void PressSpace_CircleLinkList(CircleList *list)
{
	if(list==NULL)
	{
		return;
	}
	free(list);
}

我是采用企业链表格式写的,可以节约代码量

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值