算法笔记 --第7章 提高篇(1) --数据结构专题(1)

这里写图片描述

读书笔记

链表的处理

在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,就要特殊处理



完结撒花d=====( ̄▽ ̄*)b

这里写图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41256413/article/details/81701363