静态链表

静态链表

学过C语言的人基本都知道链表就是通过指针来建立节点之间的关系,那种称之为动态链表,而对于有些简单的问题,我们可以用静态链表来替代

建立结构体数组,数组的下标直接表示节点地址,

1
2
3
4
5
struct 
{
typename data;
int next;
}node[size];

PAT1052

参考PAT1052,题目大意是给出一个静态链表,要求我们根据节点的值来对链表进行排序.

定义一个结构体,其中带有bool变量flag代表该节点是否出现,遍历一遍链表对出现过的节点置true,之后就对链表进行排序,没有出现过的排序过程就到后面,之后对链表遍历输出即可.要注意链表中无节点的情况进行特别判别.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

#include<algorithm>
using namespace std;

const int maxn=100005;
struct
{
int address,data,next;
bool flag;
}node[maxn];

bool cmp(Node a,Node b)
{
if(a.flag==false||b.flag==false)
return a.flag>b.flag; //只要a和b中有一个无效节点即放置到后面
else
return a.data<b.data; //否则按照值的大小从小到大排序
}

int main()
{
for(int i=0;i<maxn;i++)
node[i].flag=false; //初始化静态链表
int n,begin,address;
scanf("%d%d",&n,&begin);
for(int i=0;i<n;i++)
{
scanf("%d",&address);
scanf("%d%d",&node[address].data,&node[address].next);
node[address].address=address;
}
int cnt=0,p=begin;
while(p!=-1)
{
node[p].flag=true; //遍历有效节点,也可以写成for(int i=begin;i!=-1;i=node[i].next)
cnt++;
p=node[p].next;
}
if(cnt==0)
printf("0 -1"); //特别判别,链表中无节点的情况
else
{
sort(node,node+maxn,cmp); //筛选有效节点,并排序
printf("%d %05dn",cnt,node[0].address);
for(int i=0;i<cnt;i++)
{
if(i!=cnt-1)
printf("%05d %d %05dn",
node[i].address,node[i].data,node[i+1].address);
//注意是i+1的address,而不是i的next
else
printf("%05d %d -1",node[i].address,node[i].data);
}
}
return 0;
}

PAT1074

参考PAT1074,题目的大意是给出一个静态链表,要求我们以k个元素为一组翻转链表中的元素,如果最后的几个元素不到k则无需进行处理

直接定义一个data和next数组用来存储地址的数据和next值,然后对链表进行遍历一遍(在遍历过程中通过cnt来记录链表的元素个数),之后就将一组末尾的数赋值到头部,这个步骤就参考他们的代码,然后理解.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28


int main()
{
int first,n,k,num=0,cnt=0;
scanf("%d %d %d",&first,&n,&k);
int data[100005],next[100005],list[100005],ans[100005];
for(int i=0;i<n;i++)
{
int temp;
scanf("%d",&temp);
scanf("%d %d",&data[temp],&next[temp]);
}
while(first!=-1) //遍历整个链表
{
list[num++]=first;
first=next[first];
cnt++;
}
for(int i=0;i<cnt;i++)
ans[i]=list[i];
for(int i=0;i<cnt-cnt%k;i++) //链表的后面不达到k个元素的节点无需处理,故循环到cnt-cnt%k即可
ans[i]=list[i/k*k+k-1-i%k]; //i/k*k为一组最先开始的位置,然后k-1是因为从0开始减去整除的余数即为要反转的位置
for(int i=0;i<cnt-1;i++)
printf("%05d %d %05dn",ans[i],data[ans[i]],ans[i+1]);
printf("%05d %d -1",ans[cnt-1],data[ans[cnt-1]]);
return 0;
}

PAT1032

参考PAT1032,题目的大意就是给出两个链表,寻找第一个相同的节点,就先遍历第一个链表,将遍历到的节点的bool型flag置为true,第二个开始遍历,如果遍历到true的节点输出即可.如果没有相同的话则会一直遍历下去.如果找不到输出-1即可.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33


struct node
{
char key;
int next;
bool flag;
}node[100005];

int main()
{
int s1,s2,n;
scanf("%d %d %d",&s1,&s2,&n);
for(int i=0;i<n;i++)
{
char data;
int temp1,temp2;
scanf("%d %c %d",&temp1,&data,&temp2);
node[temp1]={data,temp2,false};
}
for(int i=s1;i!=-1;i=node[i].next)
node[i].flag=true;
for(int i=s2;i!=-1;i=node[i].next)
{
if(node[i].flag==true)
{
printf("%05d",i);
return 0;
}
}
printf("-1");
return 0;
}

PAT1097

参考PAT1097,题目的大意是然我们把链表中出现过(绝对值)的值单独形成一个新的链表.

定义结构体中设置一个num(一定要赋初试值)为了后面的排序使用.什么重复问题,开bool的散列表,然后如果没有出现过就放入第一个链表,出现过的话就放入第二个链表,其中给num赋较大值,通过排序处理之后输出两个链表即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

#include<algorithm>
#include<cmath>
using namespace std;

const int maxn=100010;
bool exist[maxn]={false};

struct
{
int address,value,next,num=2*maxn;
}node[maxn];

bool cmp1(Node a, Node b)
{
return a.num < b.num;
}

int main()
{
int first,n,cnt1=0,cnt2=0;
scanf("%d %d",&first,&n);
for(int i=0;i<n;i++)
{
int temp;
scanf("%d",&temp);
scanf("%d %d",&node[temp].value,&node[temp].next);
node[temp].address=temp;
}
for(int i=first;i!=-1;i=node[i].next)
{
if(exist[abs(node[i].value)]==false)
{
exist[abs(node[i].value)]=true;
node[i].num=cnt1;
cnt1++;
}
else
{
node[i].num=maxn+cnt2;
cnt2++;
}
}
sort(node,node+maxn,cmp1);
int cnt=cnt1+cnt2;
for(int i=0;i<cnt;i++)
{
if(i!=cnt1-1&&i!=cnt-1)
printf("%05d %d %05dn",node[i].address,node[i].value,node[i+1].address);
else
printf("%05d %d -1n",node[i].address,node[i].value);
}
return 0;
}