读书笔记
链表的处理
在pat里,链表的题目通常会这样给出数据:
Address Data Next
其中Address和Next是五位数个正整数,就如下图所示,这个时候这么处理链表呢?,算法笔记这本书给出了范本。
how to
使用静态链表处理。在数组里模拟内存。如下
struct node{
int address;
typename data; //data 可能是int,也可能是char
int next;
bool flag; //该节点是垃圾数据,还是链表里的数据
}node[100010];
初始化链表
for(int i=0;i<100010;i++)
node[i].flag =0; //初始都是垃圾数据.
把数据存入数组(内存)
int address;
int N;
scanf("%d",&N); //读入输入的node数量
for(int i=0;i<N;i++){
scanf("%d",&address);
scanf("%d%d",&node[address].data,&node[address].next);
node[address].address = address;
}
题目会给出链表的首节点,通过这个枚举链表,如果链表通过某个地址,就把地址对应的数组的flag =true,代表这是链表数据,而不是垃圾数据
int p = begin,count=0; //begin是链表首地址,count记录链表长度
while(p!=-1){
node[p].flag = true;
count++;
p=node[p].next;
}
怎么排序静态链表呢
可以通过前面的flag来判断是垃圾数据还是链表数据,这样,把垃圾数据放在后面即可。
bool cmp(node a,node b){
if(a.flag == false || b.flag == false)
return a.flag> b.flag;
else
return a.data < b.data;
}
std::sort(node,node+100010,cmp);
链表的一些坑:
①:没有节点,是个空链表,要特殊处理。
②给出的Address是五位数,所以输出的时候,要printf(“%05d”,address)。
但是如果到了链表末,address是-1,就要特殊处理