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;
}