实验11-11-链表匹配

  • Post author:
  • Post category:其他



题目描述:

已知两个由正整数组成的无序序列A、B,每个序列的元素个数未知,但至少有一个元素。你的任务是判断序列B是否是序列A的连续子序列。假设B是“1 9 2 4 18”,A是“33 64 1 9 2 4 18 7”,B是A的连续子序列;假设B是“1 9 2 4 18”,A是“33 1 9 64 2 4 18 7”,B不是A的连续子序列。

要求:

建立两个单链表A、B用于存储两个正整数序列,然后按照题目的要求,判断链表B是否是链表A的连续子序列。正整数的输入用-1作为结束标志,注意-1不算这个正整数序列中的元素(不要统计-1)。在程序结束前要释放链表A、B中的所有节点


输入:

依次输入两个乱序的正整数序列A、B,序列中元素个数未知,但每个序列至少有一个元素,并以输入“-1”结束,每个序列占一行。


输出:

如果序列B是序列A的连续子序列,则输出“ListB is the sub sequence of ListA.”,否则输出“ListB is not the sub sequence of ListA.”。

数据最多的测试用例节点数在100这个数量级,所有整数可以用int型存储。


请注意输入输出格式。


样例输入:

Sample 1:
5 4 3 2 1 -1
3 2 1 -1

Sample 2:
1 2 3 4 5 6 7 8 9 -1
1 2 3 4 5 6 7 8 0 -1


样例输出:

Sample 1:
ListB is the sub sequence of ListA.

Sample 2:
ListB is not the sub sequence of ListA.



代码块:

#include<stdio.h>
#include<stdlib.h>
typedef struct node{
	int data;
	struct node* next;
}Node,*Link;
void insertend(Link head,int arr[],int n);
int ifsub(Link head1,Link head2);//判断 
int main()
{
	Link head1=malloc(sizeof(Node));
	head1->next=NULL;
	Link head2=malloc(sizeof(Node));
	head2->next=NULL;
	int a[1000],b[1000];
	int i=0,j=0,p;
	scanf("%d",&a[i]);
	while(a[i]!=-1){
		i++;
		scanf("%d",&a[i]);
	}
	scanf("%d",&b[j]);
	while(b[j]!=-1){
		j++;
		scanf("%d",&b[j]);
	}
	insertend(head1,a,i);
	insertend(head2,b,j);
	p=ifsub(head1,head2);
	if(p)
	printf("ListB is the sub sequence of ListA");
	else
	printf("ListB is not the sub sequence of ListA");
	return 0;
}
void insertend(Link head,int arr[],int n)
{
	int i=0;
	Link p=head->next;
	Link q=head;
	for(i=0;i<n;i++){
		p=malloc(sizeof(Node));
		p->data=arr[i];
		p->next=NULL;
		q->next=p;
		q=p;
	}
}
int ifsub(Link head1,Link head2)
{
	Link p1=head1->next;
	Link p2=head2->next;
	Link pre=p1;
	while(p1!=NULL&&p2!=NULL){
		if(p1->data==p2->data)
		{
			p1=p1->next;
			p2=p2->next;
		}
		else
		{
			pre=pre->next;
			p1=pre;
			p2=head2->next;
		}
	}
	if(p2==NULL)
	return 1;
	else
	return 0;
}



版权声明:本文为m0_73967238原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。