目录
题目
两个整数序列和已经存入两个单链表中,设计一个算法,判断序列B是否是序列A的连续子序列。
核心代码
//判断是否是连续的子序列
void serie(LinkList A,LinkList B){
LNode* p=A->next;
LNode* q=B->next;
while(p!=NULL&&q!=NULL){
if(p->data==q->data){
p=p->next;
// q=q->next;
}
q=q->next;
}
if(q==NULL){
printf("B是A的子序列");
}else{
printf("B不是A的子序列");
}
}
完整代码
//判断B是否是A的子序列
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct LNode
{
int data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList;
//初始化单链表,建立头结点
bool InitList(LinkList A,LinkList B){
A=(LNode *)malloc(sizeof(LNode));
A->next=NULL;
B=(LNode *)malloc(sizeof(LNode));
B->next=NULL;
return true;
}
//采用尾插法建立一个单链表A
LinkList List_TailInsert1(LinkList &A){
int x;
A=(LNode *)malloc(sizeof(LNode));
LNode *s,*r=A;
printf("请输入你想插入A的第一个值(1—10000):");
scanf("%d",&x);
while(x!=9999){
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s;
printf("想插入A的下一个值:");
scanf("%d",&x);
}
r->next=NULL;
return A;
}
LinkList List_TailInsert2(LinkList &B){
int x;
B=(LNode *)malloc(sizeof(LNode));
LNode *s,*r=B;
printf("请输入你想插入B的第一个值(1—10000):");
scanf("%d",&x);
while(x!=9999){
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s;
printf("想插入B的下一个值:");
scanf("%d",&x);
}
r->next=NULL;
return B;
}
//判断是否是连续的子序列
void serie(LinkList A,LinkList B){
LNode* p=A->next;
LNode* q=B->next;
while(p!=NULL&&q!=NULL){
if(p->data==q->data){
p=p->next;
// q=q->next;
}
q=q->next;
}
if(q==NULL){
printf("B是A的子序列");
}else{
printf("B不是A的子序列");
}
}
// 输出函数
void print1(LinkList A) {
LNode* p = A->next; // 从头节点开始遍历
if (p == NULL) {
printf("链表为空。\n");
} else {
printf("此时单链表A中的数据有: ");
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
}
int main(){
LinkList A;
LinkList B;
LinkList C;
InitList(A,B);
List_TailInsert1(A);
List_TailInsert2(B);
print1(A);
print1(B);
//判断是否是连续的序列
serie(A,B);
return 0;
}
示例
请输入你想插入A的第一个值(1—10000):1
想插入A的下一个值:2
想插入A的下一个值:3
想插入A的下一个值:4
想插入A的下一个值:9999
请输入你想插入B的第一个值(1—10000):3
想插入B的下一个值:4
想插入B的下一个值:9999
此时单链表A中的数据有: 1 2 3 4
此时单链表A中的数据有: 3 4
B是A的子序列