C++实现企业链表

        企业链表是企业中经常使用的一种链表,因此被称为企业链表。我们首先来看看他的结构与传统链表有啥不同:

        对于一个类或结构体 ,其中包含我们需要存储的数据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;
}

如有错误的地方欢迎指正交流 !

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值