题目要求:
输入两组数据 list A 、list B。判断list B是否为list A的子集。
两组数据均以-1结尾,且-1不计入数据。
#include<stdio.h>
#include<stdlib.h>
/*定义结构变量*/
/*命名为list,其指针为listPtr*/
typedef struct List{
int num;
struct List* next;
}list;
typedef struct List* listPtr;
/*子函数,用于输入数据*/
listPtr input(void);
void main()
{
/*输入数据*/
listPtr Ahead,Bhead; /*设定Ahead、Bhead为A、B链表的头节点*/
printf("Please input listA(end by -1):\n");
Ahead=input();
printf("Please input listB(end by -1):\n");
Bhead=input();
/*针对B链表中每一节点的num遍历A链表中是否存在*/
listPtr a=Ahead,b=Bhead;
for(;b;b=b->next) /*以B链表中的所有numb为循环节*/
{
for(;a;a=a->next) /*针对B链表中的每一num遍历A链表*/
{
if(a->num==b->num) /*判断A中存在该num*/
break;
}
if(!a) /*该情况为A中没有该num*/
{
printf("ListB is not the sub sequence of listA.");
break; /*跳出循环,得出结论*/
}
}
if(!b) /*该情况为A中存在B链表的所有num,得出结论*/
printf("ListB is the sub sequence of listA.");
}
/*输入数据*/
listPtr input(void)
{
int number;
listPtr head=NULL,last=NULL,now=NULL;
/*head为头节点,last为尾节点,now为待加入链表的节点*/
scanf("%d",&number);
while(number!=-1)
{
now=(listPtr)malloc(sizeof(list));/*为每一数据创建内存*/
now->num=number;
now->next=NULL;
if(head==NULL) /*该情况为刚创建链表时没有节点,只有待加入的now节点*/
{
head=now; /*此时头节点和尾节点均为now节点*/
last=now;
}
else /*一般情况*/
{
last->next=now; /*将原链表尾节点指针指向now节点*/
last=now; /*now节点成为新的尾节点*/
}
scanf("%d",&number); /*输入下一待加入链表的数据*/
}
return head; /*将输入完全的链表的头节点返回给Ahead、Bhead*/
}