链表应用------PAT_A1032_sharing

1.题目:

To store English words, one method(方法) is to use linked lists and store a word letter(字母) by letter. To save some space, we may let the words share the same sublist(子列表) if they share the same suffix(后缀). For example, “loading” and “being” are stored as showed in Figure 1.
在这里插入图片描述
Figure 1
You are supposed to find the starting position of the common suffix (e.g. the position of “i” in Figure 1).(详见PAT_A1032 shring

字面意思:一个字母一个字母存单词的时候,为了节省空间,如果两个单词的后缀一样的话可以共用。比如“loading”和“being”这两个单词就共用“ing”这个后缀。你被要求做的就是求出共用后缀首字母的地址。

题意:给出两条链表首地址及N个节点的地址、数据、下一个节点地址,求两条链表首个共用节点地址。如果没有共用节点就输出-1.

2.思路:

step1:由于地址范围很小,可以直接用静态链表,但是根据题意,要在结构体中再定义一个变量,表示字母(结点)在第一个单词(第一条链表)里出现,是为1,不是为-1.

step2:先遍历第一条链表,将所有结点标志位都赋值为1,接下来遍历第二条链表,如果发现某结点标志位为1,则返回该结点地址(5位数的正整数),遍历完毕没有发现1,返回-1。

3.代码实现

#include<cstdio>

#define 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 ad1=0, ad2=0, n=0;
	scanf( "%d%d%d",&ad1, &ad2,&n );//开始地址及结点个数
	
	int st, next;//当前地址(即数组的下标)、下个结点地址
	char data;//数据域,即A-Z、a-z字母
	for( int i=0; i<n; i++ ){//输入数据
		scanf( "%d %c %d",&st, &data, &next );//%c可以识别空格,所以里面要加空格
		node[st].data = data;//注意st是数组node[]括号里的,是作为数组下标的
		node[st].next = next;
		//也就是说这里数组下标不再是0-100010中任意一个数了,
		//而是我们给定的5位的正整数00000-99999
		//scanf( "%d", &st );也可这样写,前面next、data变量可不设
        //scanf( " %c %d", &node[st].data, &node[st].next );
        //注意此处%c前有空格,输入时是连续输入的
	}
	
	int p;
	//遍历链表1,并设置标志位
	for( p = ad1; p != -1; p = node[p].next ){
		node[p].flag = true;
	}
	//遍历链表2,找出标志位已经设置的地址
	for( p = ad2; p != -1; p = node[p].next ){
		if( node[p].flag==true)
			break;
	}
	if( p != -1 )//这里的地址是人为设定的5位的正整数,不是系统里的地址
		printf("%05d",p);//注意输出格式,输出5位高位补0
	if( p == -1 )
		printf("-1\n");
	return 0;
}

参考书目:
《算法笔记》【胡凡,曾磊主编】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值