判断是否是子串
题目问题描述:
两个整数序列A=a1,a2,a3,…,am和B=b1,b2,b3,…,bn已经存入两个单链表中,设计一个算法,判断序列B是否是序列A的连续子序列。
结果截图:
实现代码:
// 判断是否是字串(暴力法)
#include<stdio.h>
#include<stdlib.h>
typedef struct Node{
int data;
struct Node* next;
}Node, *Linklist;
void printList(Linklist L);
Linklist createList();
int Zilist(Linklist A,Linklist B);
int main(){
int yorn = 0;
printf("链表A:\n");
Linklist A = createList();
printf("链表B:\n");
Linklist B = createList();
yorn = Zilist(A,B);
printf("操作后: \n");
if(yorn == 1){
printf("是子串!\n");
printf("字串为: ");
printList(B);
}
else{
printf("不是子串!\n");
}
}
int Zilist(Linklist A,Linklist B){
Node* ra = A->next;
Node* rb = B->next;
Node* r = ra;//回溯节点
while(rb && rb){
if(ra->data == rb->data){
ra = ra->next;
rb = rb->next;
}
else{
r = r->next;
ra = r;
rb = B->next;
}
}
if(rb == NULL)
return 1;
else
return 0;
}
Linklist createList(){
Node* r = NULL;
int data,len;
printf("表长: ");
scanf("%d",&len);
Linklist L = (Linklist)malloc(sizeof(Node));
L->next = NULL;
r = L;
printf("表数据: ");
for(int i = 0;i < len;i++){
getchar();
scanf("%d",&data);
Node* p = (Node*)malloc(sizeof(Node));
p->data = data;
p->next = NULL;
r->next = p; //尾插
r = p;
}
return L;
}
void printList(Linklist L){
Node* p = L->next;
while(p){
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}