企业链表即传统链表的改造,把每个链表的结点指针相连接在一起
LinkList.h头文件定义一些链表常用的API
#ifndef LINKLIST_H
#define LINKLIST_H
typedef struct LINKNODE
{
struct LINKNODE* next;
}LinkNode;
typedef struct LINKLIST
{
LinkNode head;
int size;
}LinkList;
//遍历的函数指针
typedef void(*PRINTNODE)(LinkNode*);
//比较的函数指针
typedef int(*COMPARENODE)(LinkNode*,LinkNode*);
//初始化链表
LinkList* Init_LinkList();
//指定位置插入
void Insert_LinkList(LinkList* list,int pos,LinkNode* data);
//删除指定位置的值
void Remove_LinkList(LinkList* list,int pos);
//获得链表的长度
int Size_LinkList(LinkList* list);
//查找
int Find_LinkList(LinkList* list,LinkNode* data,COMPARENODE compare);
//打印链表结点
void Print_LinkList(LinkList* list,PRINTNODE print);
//释放链表内存
void FreeSpace_LinkList(LinkList* list);
#endif
LinkList.cpp文件实现头文件中定义的函数
#include"LinkList.h"
#include<stdlib.h>
#include<stdio.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;
//如果位置pos越界
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 Size_LinkList(LinkList* list)
{
return list->size;
}
//查找
int Find_LinkList(LinkList* list,LinkNode* data,COMPARENODE compare)
{
if(list==NULL)
return -1;
if(data=NULL)
return -1;
//找结点,并创建辅助结点
LinkNode* pCurrent=list->head.next;
int index=0;
while(pCurrent!=NULL)
{
if(compare(pCurrent,data)==0)
{
break;
}
pCurrent=pCurrent->next;
index++;
}
return index;
}
//打印链表结点
void Print_LinkList(LinkList* list,PRINTNODE print)
{
if(list==NULL)
return;
//辅助指针
LinkNode* pCurrent=list->head.next;
while(pCurrent!=NULL)
{
pCurrent=pCurrent->next;
print(pCurrent);
}
}
//释放链表内存
void FreeSpace_LinkList(LinkList* list)
{
if(list==NULL)
return;
free(list);
}
测试
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include"LinkList.h"
typedef struct MYDATA
{
LinkNode node;
char name[64];
int age;
}MyData;
void MyPrint(LinkNode* data)
{
MyData* m=(MyData*)data;
printf("Name:%s Age:%d\n",m->name,m->age);
}
int main()
{
//创建链表
LinkList* list=Init_LinkList();
MyData m1,m2,m3,m4,m5;
strcpy(m1.name,"aaa");
strcpy(m2.name,"bbb");
strcpy(m3.name,"ccc");
strcpy(m4.name,"ddd");
strcpy(m5.name,"eee");
m1.age=10;
m2.age=20;
m3.age=30;
m4.age=40;
m5.age=50;
//插入节点
Insert_LinkList(list,0,(LinkNode*)&m1);
Insert_LinkList(list,0,(LinkNode*)&m2);
Insert_LinkList(list,0,(LinkNode*)&m3);
Insert_LinkList(list,0,(LinkNode*)&m4);
Insert_LinkList(list,0,(LinkNode*)&m5);
//打印
Print_LinkList(list,MyPrint);
//销毁
FreeSpace_LinkList(list);
return 0;
}
测试结果出现了一点bug 各位大神自行查找吧、、哈哈