| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
/* 
两个整数序列A=a1,a2,a3,...,am和B=b1,b2,b3,...,bn已经存入两个单链表中,设计一个算法,判断序列B是否是序列A的连续子序列 
*/ 
 
#include<stdio.h> 
#include<stdlib.h> 
 
typedef struct LNode 
{ 
    int data; 
    struct LNode *next; 
} LNode,*LinkList; 
 
//先建立一个链表,运用后插法吧(带头结点) 
LinkList BuildList(LinkList &L) 
{ 
    //先创立一个结点,让L指向它 
    L=(LNode *)malloc(sizeof(LNode)); 
    L->next=NULL; 
    LNode *p=L; 
    LNode *s=L; 
    int e; 
    printf("请输入链表的数值:\n"); 
    scanf("%d",&e); 
    while(e!=-1) 
    { 
        s=(LNode *)malloc(sizeof(LNode)); 
        s->data=e; 
        p->next=s; 
        p=s; 
        scanf("%d",&e); 
 
    } 
    s->next=NULL; 
    return L; 
} 
 
//输出链表 
void OutputList(LinkList L) 
{ 
 
    LNode *p=L->next; 
    if(p==NULL) 
    { 
        printf("链表为空!"); 
        return; 
    } 
    while(p!=NULL) 
    { 
        printf("%d ",p->data); 
        p=p->next; 
    } 
 
} 
 
//根据题目所写的骚操作 
bool Judge(LinkList A,LinkList B) 
{ 
    LNode *p=A; 
    LNode *q=B; 
    //先判断两个链表的大小 
    int a=0; 
    while(p->next!=NULL) 
    { 
        p=p->next; 
        a++; 
    } 
    int b=0; 
    while(q->next!=NULL) 
    { 
        q=q->next; 
        b++; 
    } 
    if(a<=b) 
    { 
        return false; 
    } 
    //判断B是否为A的子集 
    p=A; 
    q=B->next; 
    int n=0; 
loop1: 
    while(1) 
    { 
        p=p->next; 
        q=B->next; 
        if(p==NULL) 
        { 
            goto loop; 
        } 
        while(q!=NULL) 
        { 
            if(p->data==q->data) 
            { 
                n++; 
                goto loop1; 
            } 
            else 
            { 
                q=q->next; 
            } 
        } 
    } 
loop: 
    if(n>=b) 
    { 
        return true; 
    } 
    else 
    { 
        return false; 
    } 
} 
 
 
int main() 
{ 
    LinkList A,B; 
    LNode *a=BuildList(A); 
    LNode *b=BuildList(B); 
    if(Judge(a,b)) 
    { 
        printf("B是A的子集"); 
    } 
    else 
    { 
        printf("B不是A的子集"); 
    } 
 
} 
 |   
 
 
 
 |