企业链表是企业中经常使用的一种链表,因此被称为企业链表。我们首先来看看他的结构与传统链表有啥不同:
对于一个类或结构体 ,其中包含我们需要存储的数据data与一个指针变量p_next,我们将p_next串起来便形成了企业链表,那它和普通链表有何区别呢?普通链表中p_next指向的是下一个p_next与data组成的类或结构体整体的地址,而企业链表p_next仅仅指向下一个p_next的地址。因此链表中并涉及任何data数据,企业链表实际存储的数据结构为:
理论说完了,那如何实现呢?
1、首先应定义节点与链表并对其初始化
//链表指针节点节点
class node_p
{
public:
node_p* next;
};
//链表
class list
{
public:
node_p head;
int size;
};
//初始化链表
list * list_init()
{
list* L=new list;
L->head.next=NULL;
L->size=0;
return L;
}
2、再确定链表的插入删除函数
/插入
void list_insert(list* L,int pos,node_p* data)
{
//查找位置
node_p* pcurrent=&(L->head);
for (int i = 0; i < pos; i++)
{
pcurrent=pcurrent->next;
}
//插入新的指针节点
data->next=pcurrent->next;
pcurrent->next=data;
L->size++;
}
//删除
void list_delete(list* L,int pos)
{
//查找位置
node_p* pcurrent=&(L->head);
for (int i = 0; i < pos-1; i++)
{
pcurrent=pcurrent->next;
}
//删除节点
pcurrent->next=pcurrent->next->next;
L->size--;
}
到这里除了node的定义中未放入data外,其余操作与普通链表一致。那么企业链表是如何放入数据的呢?
4、我们先自定义一个数据节点:
//自定义链表数据节点
class my_data
{
public:
node_p p_data;
int num;
};
当我们创建my_data的对象指针p1,将其强转成node_p的对象指针a1,a1->next=p1->p_data(具体原理见“C++指针偏移在类中的应用”)。因此p1可以通过a1被插入企业链表中,当需要使用p1->num时,只需要再将a1强转成my_data的对象指针即可正常访问。
5、下面提供根据自定义数据提供打印函数:
void my_print(node_p* data)
{
my_data* p=(my_data*)data;
cout<<p->num<<"\t";
}
//打印链表
void list_print(list* L)
{
node_p* pcurrent=L->head.next;
while (pcurrent != NULL)
{
my_print(pcurrent);
pcurrent=pcurrent->next;
}
cout<<endl;
}
6、实验与结果
int main()
{
//创建链表
list* L=list_init();
//创建数据
my_data data[9];
for (int i = 0; i < 10; i++)
{
data[i].num=i+1;
}
//插入数据1~10
for (int i = 0; i < 10; i++)
{
list_insert(L,i,(node_p*)&data[i]); //把节点串起来
}
//打印数据
cout<<"链表中数据为:"<<endl;
list_print(L);
//删除pos=5的数据(跳过head)
list_delete(L,5);
cout<<"删除pos=5后:"<<endl;
list_print(L);
system("pause");
return 0;
}
如有错误的地方欢迎指正交流 !