题目描述
已知两个由正整数组成的无序序列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中的所有节点。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct link //定义链表节点
{
int data;
struct link* next;
}Link;
typedef struct list //定义链表结构
{
Link* head;//头指针
int len;//长度
}List;
void Initlist(List* list);//初始化链表
int sub_link(List* A, List* B);//检查是否匹配链表
int main()
{
List* A = (List*)malloc(sizeof(List));
List* B = (List*)malloc(sizeof(List));
Initlist(A);
Initlist(B);
if (sub_link(A, B))
printf("ListB is the sub sequence of ListA.\n");
else printf("ListB is not the sub sequence of ListA.\n");
Link* p = A->head, *ptr;
for (ptr = p->next; ptr != NULL; ptr = ptr->next)//释放空间
{
free(p);
p = ptr;
}
free(A);
p = B->head;
for (ptr = p->next; ptr != NULL; ptr = ptr->next)//释放空间
{
free(p);
p = ptr;
}
free(B);
return 0;
}
void Initlist(List* list)//初始化链表
{
int num;
Link* ptr = (Link*)malloc(sizeof(Link));//链表首节点
scanf("%d", &num);
getchar();
ptr->data = num;
ptr->next = NULL;
list->head = ptr;
list->len = 1;
scanf("%d", &num);
getchar();
while (num != -1)
{
ptr->next = (Link*)malloc(sizeof(Link));
ptr = ptr->next;
ptr->data = num;
ptr->next = NULL;
scanf("%d", &num);
getchar();
list->len++;
}
}
int sub_link(List* A, List* B)//检查是否匹配链表
{
int i, j;
Link* pA1, * pA2, *pB;
pA1 = A->head;
if (A->len >= B->len)
{
for (i = 0; i <= A->len - B->len; i++)
{
pA2 = pA1;
pB = B->head;
for (j = 0; j < B->len; j++)
{
if (pB->data != pA2->data)
{
break;
}
else
{
pB = pB->next;
pA2 = pA2->next;
}
}
if (pB == NULL)
return 1;
else pA1 = pA1->next;;
}
return 0;
}
else return 0;
}