链表的特点优势,以及实际应用的情形(luogu.p1996)
特点:由于链表的储存空间在实际物理上是不连续的所以,链表操作的删除和插入会及其方便,用地址操作即可实现
链表分为单向,循环,双向,
且链表的实现分为动态和静态
相关算法
反转,连接,插入删除,复杂链表的复制
以下介绍实现的思路以及相关代码
首先 链表的基本元素是node 包含一个数据单元和一个地址单元,而双向链表里面有两个地址单元链表就是利用地址单元进行储存的不连续,这里面实现使用的是c语言的结构体
struct node {
int data;
node *next;
node *pr;//双向链表的定义用到的
};
然后 一般来说链表的名字也就是HEAD 是固定的不参与链表的算法,每次查询或者用到链表就将head的地址应用就可以,所以一般将head设置为全局变量
链表元素的实现
node * temp =new node; temp->data=x;temp->next=NULL;
让后将其进行链接可以从头部或者尾部进行连接,前面说过head元素一般不参与算法的运行所以会定义一个now去参与运算
以下是连接代码
//头部连接默认head已经初始化
temp->next=head->next;
head->next=temp;
//尾部连接
now=head;
now->next=temp;
now=temp;
//双向链表的连接尾部
now=head;
now->next=temp;
temp->pr=now;
now=temp;
以上就形成了动态链表
动态链表是教科书式的规范链表
实际竞赛中采用的一般是静态链表
静态链表的实现多采用结构体数组去实现,以下代码是实现静态双向列表
//这个链表的定义基于luogu p1996
#include<bits/stdc++.h>
using namespace std;
const int N = 105;
struct node
{
node id;
node *next,*pr;
}nodes[N];
int main ()
{
int n,m;cin>>n>>m;
nodes[0]->id=1;
for(int i=1;i<n;i++)
{
node[i]->id=i;node[i]->pr=i-1;node[i]->next=i+1;
}
node[0]->pr=n;node[n]->next=0;
int now = 1;
while((n--)!=1)
{
for(int i=1;i<m;i++)
{
now = nodes[now]->next;
}
cout<<nodes[now].id;
int next = nodes[now]->next
int pre = nodes[now]->pr;
nodes[pre]->next=nodes[now]->next;
nodes[next]->pr=pre;
now = next;
}
cout<<nodes[now]->id;
return 0;
}
链表相关的算法后续更新。