美文网首页
A1032 Sharing (25分)

A1032 Sharing (25分)

作者: km15 | 来源:发表于2020-03-01 16:32 被阅读0次

/*
题意:
1、给出两个首地址,N个字符,然后给出地址,字符,下一个地址
2、找出两个字符的公共后缀,输出地址,没有则输出-1

解题:
1、直接使用静态链表,不超过10的5次,定义一个flag
2、遍历第一条链表,将经过的所有节点的flag值赋为1
枚举第二条链表,如果第一个flag值为1,就说明有,则说明第一条链表中出现过的结果即为两条链表的第一个公用节点

learn&&wrong:
1、使用%05d格式输出地址,可以使不足5位补足高位为0
2、使用%c可以读入空格,因为在输入地址、数据及后继节点地址时,格式不能写成%d%c%d,必须在中间加空格
3、for遍历静态链表需要学习一下
4、这题的结构体里没有address,而其他题目有,主要是,他不需要输出下一个的address
*/

include <iostream>

include <cstdio>

using namespace std;

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);
    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{
    printf("-1\n");
}

return 0;

}

相关文章

网友评论

      本文标题:A1032 Sharing (25分)

      本文链接:https://www.haomeiwen.com/subject/qbbfkhtx.html