C语言 已知两个由正整数组成的无序序列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中的所有节点。
时间: 2023-05-31 12:01:43 浏览: 145
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点
typedef struct node {
int data;
struct node *next;
} Node;
// 创建链表
Node *createList() {
Node *head = NULL, *tail = NULL;
int num;
scanf("%d", &num);
while (num != -1) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = num;
newNode->next = NULL;
if (head == NULL) {
head = newNode;
tail = newNode;
} else {
tail->next = newNode;
tail = newNode;
}
scanf("%d", &num);
}
return head;
}
// 判断链表B是否是链表A的连续子序列
int isSubsequence(Node *A, Node *B) {
Node *p = A, *q = B;
while (p != NULL && q != NULL) {
if (p->data == q->data) {
p = p->next;
q = q->next;
} else {
p = p->next;
}
}
if (q == NULL) {
// B遍历完了,说明B是A的连续子序列
return 1;
} else {
// B没有遍历完,说明B不是A的连续子序列
return 0;
}
}
// 释放链表节点
void freeList(Node *head) {
Node *p = head;
while (p != NULL) {
Node *q = p;
p = p->next;
free(q);
}
}
int main() {
// 创建链表A、B
printf("请输入正整数序列A:");
Node *A = createList();
printf("请输入正整数序列B:");
Node *B = createList();
// 判断链表B是否是链表A的连续子序列
if (isSubsequence(A, B)) {
printf("链表B是链表A的连续子序列\n");
} else {
printf("链表B不是链表A的连续子序列\n");
}
// 释放链表节点
freeList(A);
freeList(B);
return 0;
}
阅读全文