企业链表可以大幅度减少程序员对链表偏移指针的计算,大幅度减少代码量的书写
上图表示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