1.企业链表本质上是一种Linux内核链表。
2.最本质的区别在于,传统的结点类型中直接同时包含了指针域和数据域,用来实现和其他结点之间的串联;而在企业链表中,结点本身只含有指针域,而数据部分的具体实现则在测试文件中实现即可!这样做的好处是,开发者可以自由的添加自己的数据类型,而不再受限于既定的类型。
#ifndef LINKLIST_H
#define LINKLIST_Htypedef struct LinkNode{
LinkNode* next;
};#endif
注意,上述定义中只包含了指向下一个结点的指针next,而不包含关于数据内容的声明
void* data。
之后,开发者只需要将自定义的类型再强转为LinkNode结点类型,即可实现结点的串联。
3.企业链表相当于只串联指针,精髓在于将自定义的类型转换为node*,只串联了自定义类型里面的node类型。
4.通俗的说,企业链表的功能就是将自定义的结构体类型转换为指针连接起来,当使用结构体的属性时,再转换回来
LinkList.h头文件
#ifndef LINKLIST_H
#define LINKLIST_H
//链表的小结点
typedef struct LinkNode{
LinkNode* next;
};
//链表
typedef struct LinkList{
LinkNode* head;
int size;
};
//定义打印类型
typedef void(*PRINTNODE)(LinkNode*);
//定义比较类型
typedef int(*COMPARENODE)(LinkNode*,LinkNode*);
//初始化链表
LinkList* Init_LinkList();
//插入
void Insert_LinkList(LinkList* list,int pos,LinkNode* data);
//注意,此处并不是空指针,而是LinkNode型的数据
//删除
void Remove_LinkList(LinkList* list,int pos);
//查找
int Find_LinkList(LinkList* list,LinkNode* data,COMPARENODE compare);
//查找函数返回的是位置
//返回链表大小
int Size_InitList(LinkList* list);
//打印
void Print_LinkList(LinkList* list,PRINTNODE print);
//释放链表内存
void FreeSpace_LinkList(LinkList* list);
#endif
LinkList.c实现文件
初始化链表
LinkList* Init_LinkList(){
LinkList* list=(LinkList*)malloc(sizeof(LinkList));
//开辟内存并强转位LinkList*类型
list->head->next=NULL;
list->size=0;
return list;
}
插入元素
void Insert_LinkList(LinkList* list,int pos,LinkNode* data){
//注意,此处并不是空指针,而是LinkNode型的数据
if(list==NULL)
return;
if(data==NULL)
return;
if(pos<0||pos> list->size)
pos=list->size;
//如果超越大小则直接插在尾部
//查找插入位置
LinkNode* pCurrent=(list->head);
//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)
pos=list->size;
LinkNode* pCurrent=list->head->next;
for(int i=0;i<pos;i++)
pCurrent=pCurrent->next;
pCurrent->next=pCurrent->next->next;
//直接指向下一个
list->size--;
}
查找元素
int Find_LinkList(LinkList* list,LinkNode* data,COMPARENODE compare){
if(list==NULL)
return -10;
if(data==NULL)
return -10;
LinkNode* pCurrent=list->head->next;
int index=0;
while(pCurrent!=NULL)
{
if(compare(pCurrent,data)==0)
{
break;
}
pCurrent=pCurrent->next;
index++;
}
return index;
}
返回链表大小
int Size_InitList(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 FreeSpace_LinkList(LinkList* list){
if(list==NULL)
return;
free(list);
}
然后是测试main函数,如下:
#include <iostream>
#include <string.h>
#include "LinkList.h"
using namespace std;
typedef struct Goal{
LinkNode node;
char name[64];
int num;
}Goal;
void myPrint(LinkNode* data)
{
Goal* g=(Goal*)data;
cout<<(g->name)<<" "<<(g->num)<<endl;
}
int main(int argc, char** argv) {
LinkList* list=Init_LinkList();
Goal g1,g2;
strcpy(g1.name,"JSL");
strcpy(g2.name,"HYH");
g1.num=7371;
g2.num=7166;
Insert_LinkList(list,0,(LinkNode*)&g1);
Insert_LinkList(list,1,(LinkNode*)&g2);
Print_LinkList(list,myPrint);
FreeSpace_LinkList(list);
return 0;
}