Description
给定连个单词,判断两个单词相同后缀的位置。
Input
第一行start1 start2 N,其中start1第一个单词地址,start2为第二个单词地址,N为一共N个节点。
Sample Input 1:
11111 22222 9
67890 i 00002
00010 a 12345
00003 g -1
12345 D 67890
00002 n 00003
22222 B 23456
11111 L 00001
23456 e 67890
00001 o 00010
Sample Output 1:
67890
Sample Input 2:
00001 00002 4
00001 a 10001
10001 s -1
00002 a 10002
10002 t -1
Sample Output 2:
-1
code
#include <cstdio>
const int maxn = 100010;
struct NODE{
char data;//数据域
int next;//指针域
bool flag;//节点是否在第一条链表中出现
}node[maxn];
int main(){
for(int i = 0;i <maxn;i++){
node[i].flag = false;
}
int s1,s2,n;//s1与s2分别代表两条链表的首地址
scanf("%d%d%d",&s1,&s2,&n);
int address,next;//节点地址与后继节点地址
char data;
for(int i = 0;i <n;i++){
scanf("%d %c %d",&address,&data,&next);//注意为什么要在%d%c%d中加入空格——因为scanf的%c格式可以读入空格
node[address].data = data;
node[address].next = next;
}
int p;
for(p = s1;p != -1;p = node[p].next){
node[p].flag = true;//枚举第一条链表的所有节点,令其出现次数为1
}
for(p = s2;p != -1;p = node[p].next){
//找到第一个已经在第一条链表中出现的节点
if(node[p].flag == true) break;
}
if(p != -1){//如果第二条链表还没有到达结尾,说明找到了共用节点
printf("%05d\n",p);
}
else{//否则输出-1
printf("-1\n");
}
return 0;
}
静态链表的思想
当结点的地址是比较小的整数时,建立静态链表较为方便->实现原理是hash,即建立一个结构体数组,并令数组的下标直接表示结点的地址,来达到直接访问数组中的元素就能访问结点的效果。