用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中的所有节点。
时间: 2024-02-01 20:14:20 浏览: 118
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
ListNode* createList() {
ListNode *head = NULL, *p = NULL, *q = NULL;
int num;
scanf("%d", &num);
while (num != -1) {
p = (ListNode*)malloc(sizeof(ListNode));
p->val = num;
p->next = NULL;
if (head == NULL) {
head = p;
q = p;
} else {
q->next = p;
q = p;
}
scanf("%d", &num);
}
return head;
}
void freeList(ListNode *head) {
ListNode *p = head, *q = NULL;
while (p != NULL) {
q = p->next;
free(p);
p = q;
}
}
int isSubList(ListNode *listA, ListNode *listB) {
ListNode *p = listA, *q = listB;
while (p != NULL) {
if (p->val == q->val) {
while (p != NULL && q != NULL && p->val == q->val) {
p = p->next;
q = q->next;
}
if (q == NULL) {
return 1;
}
q = listB;
}
p = p->next;
}
return 0;
}
int main() {
ListNode *listA = createList();
ListNode *listB = createList();
int isSub = isSubList(listA, listB);
if (isSub) {
printf("B is a subsequence of A.\n");
} else {
printf("B is not a subsequence of A.\n");
}
freeList(listA);
freeList(listB);
return 0;
}
```
阅读全文