题目
思路
PAT乙级的考点对数据结构涉及很少,例题里一共出现了两次链表,但其实两次都可以用散列来实现。
本题用散列的思路参考了柳神。
- 用了散列,hash【address】来储存地址对应的值。
- 分类时再定义三个数组,来储存address。
- 输出时,比较取巧。先输出当前address 当前data 下一个address 最后再输出一个-1指向空节点。
不过还是建议学一学链表,这题用链表也不难。
AC代码
散列实现:
#include<bits/stdc++.h>
using namespace std;
struct node{
int data;
int next;
};
int main(){
int add,n,k;
cin>>add>>n>>k;
node list[100010];
int p;
for(int i=0;i<n;i++){
cin>>p;
scanf("%d%d", &list[p].data, &list[p].next);
}
p=add;
vector<int> v[3];
while(p!=-1){
int data=list[p].data;
if(data<0){
v[0].push_back(p);
}
else if(data >= 0 && data<= k){
v[1].push_back(p);
}
else v[2].push_back(p);
p=list[p].next;
}
int flag=0;
for(int i=0;i<3;i++){
for(int j=0;j<v[i].size();j++){
if(!flag){
cout<<setw(5)<<setfill('0')<<v[i][j]<<' ';
cout<<list[v[i][j]].data<<' ';
flag=1;
}
else {
cout<<setw(5)<<setfill('0')<<v[i][j]<<endl;
cout<<setw(5)<<setfill('0')<<v[i][j]<<' ';
cout<<list[v[i][j]].data<<' ';
}
}
}
cout<<"-1";
return 0;
}