数据结构(单链表,双链表)
Posted 芜湖之肌肉金轮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构(单链表,双链表)相关的知识,希望对你有一定的参考价值。
单链表——数组模拟
单链表如果是用结构体去实现的话,需要一个指针域,和一个值域(最简单的单链表)一个指向下一个值的位置所在,一个储存当前的值
受此启发,我们也可以用数组对其进行模拟,用关联起来——我们可能回想这么做是否还有存在的必要,因为像c++的STL里面都是已经写好的,或者struct写不是更好?emmm确实如此,但是拿c++举例,c++的new其实是很慢的,所以用数组会更快(手写STL也是同理)
那么根据刚才的分析我们已经知道了我们需要什么了:
1.值域:e【n】。
2.指针域:next【n】。
next里面储存下一个结点的下标。
好了,我们可以开始进行一个简单的链表的书写了。
void init()
{
head=-1;//初始化头结点
idx=0;//记录我们用到了哪个下标
}
先初始化头结点,并用idx储存用到的下标
1.插入—头插法(插在头结点后面)
让新结点指向head(head所存的就是第一个结点的下标(也就是地址)),让head指向新节点。
void add_head(int x)
{
e[idx]=x;
ne[idx]=head;
head=idx++;
}
1.插入—插到第k个插入的点的后面
由于我们的idx是记录用到的下标的值,但是我们的idx是从0开始的,所以第k个插入的数对应的就是k-1。
void add(int k,int x)
{
e[idx]=x;
ne[idx]=ne[k-1];
ne[k-1]=idx++;
}
那么插入是这么插入的,怎么删除呢?
1.删除
同理删除第k个结点其实是删除k-1。因为我们的idx是从0开始的
void remove(int k){
ne[k-1]=ne[ne[k-1]];
}
好了以上就是单链表的增加和删除,那么增删会了,怎么查呢?(会查就会改了哈哈哈)
很简单:
for(int i=head,i!=-1;i=ne[i])
{
e[i]...
...
...
...
}
双链表——数组模拟
双链表其实就是在单链表上又增加了一层指针域,也就是前向的指针。
void init()
{
r[0]=1;
l[1]=0;
idx=2;
}
1插入——头插法
void add_head(int x)
{
l[idx]=0;//新节点->pre=head
r[idx]=r[0];//新节点->next=head->next
r[0]=idx;//head->next=新节点
l[r[idx]]=idx;//新节点->next->pre=新节点
e[idx++]=x;//add x
}
2插入——尾插法
void add_tail(int x)
{
r[idx]=1;//新节点->next=tail
l[idx]=l[1];//新节点->pre=tail->pre
r[l[1]]=idx;//新节点->pre->next=新节点
l[1]=idx;//tail->pre=新节点
e[idx++]=x;//add x
}
删除
void delete_(int k)
{
r[l[k]]=r[k];//k->pre->next=k->next
l[r[k]]=l[k];//k->next->pre=k->pre
}
在第k个点后插入也是和头插法和尾插法同理。
来源acwing。
以上是关于数据结构(单链表,双链表)的主要内容,如果未能解决你的问题,请参考以下文章
C/C++语言数据结构快速入门(代码解析+内容解析)链表(单链表,双链表,循环链表,静态链表)
循环链表(循环单链表循环双链表)的相关操作的代码实现(C语言)