今天新学了一个东西,叫做静态链表。当然也不排除一种可能性,之前学过但是还给亲爱的杜老丝了哈哈哈哈哈哈哈哈哈,不管怎样,今天和小夭一起来看看静态链表吧!
首先说说今天看到的神图~
链表在你眼里是这样的——
在你的机器里它其实是这样的——
是不是有一点瞎指的意思?有一丢丢担心,今天早晨删除链表元素的时候,光标一直闪烁,虽说已经删完了,却迟迟不能结束这步操作~有一丝丝害怕。
好在我是一个Debug小能手 写bug小嫩手,话不多说,进入正题。
为什么要引入静态链表
因为对于有些问题来说(比如说今天的问题)结点的地址是比较小的整数(五位以内)我们呢就没有必要去建立动态链表,反而用简单方便得多的静态链表来取而代之。
特点
- 实现原理是哈希(通过下标访问,这让我想起了刚刚学过的散列表,原来也不是忘光光哈!关于散列表,后面应该会有专题,这是个好东西,被杜老丝墙裂推荐哈哈哈哈)
- 不需要头结点
- next是一个int型整数(用来存放下一个结点的地址)
尽量不要把结构体类型名和结构体变量名取相同的名字(这应该是常识)
来看题——
①传送门
#include<cstdio>
#define maxn 100010
struct Node{
bool flag;//结点是否在第一个链表中出现过
char data;
int next;
}node[maxn];//这题用下标作为地址
int main(){
for(int i=0;i<maxn;i++){
node[i].flag = false;//故事的开始当然没有人在第一个链表中
}
int address1,address2,n;
scanf("%d%d%d",&address1,&address2,&n);
int add,next;
char letter;
for(int i=0;i<n;i++){
scanf("%d %c %d",&add,&letter,&next);
node[add].data=letter;
node[add].next = next;
}
int p;
for(p=address1;p!=-1;p=node[p].next) node[p].flag=true;//标记第一个链表中的结点
for(p=address2;p!=-1;p=node[p].next){//这个迭代方式很新奇
if(node[p].flag) break;//找到首个在第一个链表中出现过的结点
}
if(p==-1) printf("-1\n");
else printf("%05d",p);
return 0;
}
② 传送门
#include<bits/stdc++.h>
#define maxn 100010
using namespace std;
struct Node{
int value;
int next;
int flag;
int address;//不能再用下标作地址了,因为要重排
}node[maxn];
bool cmp(Node a,Node b){
if(a.flag==0||b.flag==0) return a.flag>b.flag;//如果有一个无效,就扔后面去
else return a.value<b.value;//如果都有效,就按规则排序
}
int main(){
for(int i=0;i<maxn;i++){
node[i].flag=0;//最开始都是无效的
}
int n,begin,address;
scanf("%d%d",&n,&begin);
for(int i=0;i<n;i++){
scanf("%d",&address);
scanf("%d%d",&node[address].value,&node[address].next);
node[address].address=address;
}
int count=0,p=begin;
while(p!=-1){//为什么要这样搞?因为题目中可能给出无效结点
node[p].flag=1;
count++;
p=node[p].next;
}
if(count==0) printf("0 -1");
else{
sort(node,node+maxn,cmp);//注意sort函数的用法
printf("%d %05d\n",count,node[0].address);//排序之后就是从0开始了
for(int i=0;i<count;i++){
if(i!=count-1) printf("%05d %d %05d\n",node[i].address,node[i].value,node[i+1].address);
//最后一个输出的为什么不是node[i].next?因为已重新排序
else printf("%05d %d -1",node[i].address,node[i].value);//最后一个-1不能用%05d的形式输出
}
}
return 0;
}