企业链表设计

企业链表可以大幅度减少程序员对链表偏移指针的计算,大幅度减少代码量的书写
在这里插入图片描述
上图表示test01的指针可以访问test02的a,b,但无法访问c,企业链表的设计精髓就在这里,不需要去偏移指针,可以直接调用
在这里插入图片描述
企业链表的优点就是把每个模块的指针牵在一起。
如果一定要是linux通用链表那么也可以找node*只不过多啦数据域的偏移
在这里插入图片描述

如下代码

#include <stdlib.h>
#include <stdio.h>
//链表小节点
typedef struct LINKNODE
{
	struct LINKNODE* next;
}LinkNode;
//链表结点
typedef struct LINKLIST
{
	LinkNode head;
	int size;
}LinkList;
//遍历函数指针
typedef void(*PRINTNODE)(LinkNode *);
//比较函数指针
typedef int(*COMPAREITEMSTRUCT)(LinkNode*,LinkNode *);
//初始化链表
LinkList *Init_LinkList();
//插入
void Insert_LinkList(LinkList *list,int pos,LinkNode *data);
//删除
void Remove_LinkList(LinkList *list,int pos);
//查找
int Find_LinkList(LinkList *list,LinkNode *data,COMPAREITEMSTRUCT compare);
//返回链表大小
int Size_LinkList(LinkList *list);
//打印
void Print_LinkList(LinkList *list,PRINTNODE print);
//释放链表内存
void PressSpace_LinkList(LinkList *list);

实现代码

#include "LinkList.h"
//初始化链表
LinkList *Init_LinkList()
{
	LinkList *list=(LinkList *)malloc(sizeof(LinkList));
	list->head.next=NULL;
	list->size=0;
	return list;
}
//插入
void Insert_LinkList(LinkList *list,int pos,LinkNode *data)
{ 
	if(list==NULL)
	{
		return;
	}
	if(data==NULL)
	{
		return;
	}
	if(pos<0||pos>list->size)
	{
		pos=list->size;
	}
	//查找插入位置
	LinkNode *pCurrent=&(list->head);
	for(int i=0;i<pos;i++)
	{
		pCurrent=pCurrent->next;
	}
	//插入新节点
	data->next=pCurrent->next;
	pCurrent->next=data;
	list->size++;
}
//删除
void Remove_LinkList(LinkList *list,int pos)
{
	if(list==NULL)
	{
		return;
	}
	if(pos<0||pos>list->size)
	{
		return;
	}
	//辅助指针变量
	LinkNode *pCurrent=&(list->head);
	for(int i=0;i<pos;i++)
	{
		pCurrent=pCurrent->next;
	}
	//删除节点
	pCurrent->next=pCurrent->next->next;
	list->size--;
}
//查找
int Find_LinkList(LinkList *list,LinkNode *data,COMPAREITEMSTRUCT compare)
{
	if(list==NULL)
	{
		return 0;
	}
	if(data==NULL)
	{
		return 0;
	}
	int index=0;
	int flag=-1;
		//辅助指针变量
	LinkNode *pCurrent=(list->head.next);
	while(pCurrent!=NULL)
	{
		if(compare(pCurrent,data)==0)
		{
			flag=index;
			break;
		}
		pCurrent=pCurrent->next;
		index++;
	}
	return flag;
}
//返回链表大小
int Size_LinkList(LinkList *list)
{
	return list->size;
}
//打印
void Print_LinkList(LinkList *list,PRINTNODE print)
{
	if(list==NULL)
	{
		return;
	}
	//辅助指针
	LinkNode *pCurrent=list->head.next;
	while(pCurrent!=NULL)
	{
		print(pCurrent);
		pCurrent=pCurrent->next;
	}
}
//释放链表内存
void PressSpace_LinkList(LinkList *list)
{
	if(list==NULL)
	{
		return;
	}
	free(list);
}
有问题请联系QQ:2832352904
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值