链表变形之静态链表

今天新学了一个东西,叫做静态链表。当然也不排除一种可能性,之前学过但是还给亲爱的杜老丝了哈哈哈哈哈哈哈哈哈,不管怎样,今天和小夭一起来看看静态链表吧!
首先说说今天看到的神图~
链表在你眼里是这样的——
在这里插入图片描述在你的机器里它其实是这样的——
在这里插入图片描述
是不是有一点瞎指的意思?有一丢丢担心,今天早晨删除链表元素的时候,光标一直闪烁,虽说已经删完了,却迟迟不能结束这步操作~有一丝丝害怕。
好在我是一个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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43905108/article/details/106622219
今日推荐