美文网首页
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