codeup|PAT A1032 Sharing(静态链表)

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,即建立一个结构体数组,并令数组的下标直接表示结点的地址,来达到直接访问数组中的元素就能访问结点的效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值