判断B是否是A的子序列
图片展示
代码说明
/判断链表B是否是A的子链表
Bool is_child_list(Headnode list_A,Headnode list_B)
{
//1.判断链表是否存在
if(!is_exit_headnode_list(list_A) || !is_exit_headnode_list(list_B))
{
return FALSE;
}
//2.判断链表是否为空
if(is_empty_headnode_list(list_A) || is_empty_headnode_list(list_B))
{
return FALSE;
}
int count_A = list_A->length;// A的长度
int count_B = list_B->length;// B的长度
int sum = 0;//用于判断是否是子序列的统计
List p = list_A->next;//用于链表A的遍历节点
List job = NULL;//用于找子节点的遍历指针
List q = list_B->next;//用于链表B的遍历节点
//当不满足条件时,说明链表B的长度大于A,故必不是其子链表
while(count_A >= count_B)
{
//3.找到第一个节点相等的元素
if(p->data == q->data)
{
job = p;
while(q != NULL && job->data == q->data)
{
job = job->next;
q = q->next;
sum++;
}
}
//如果个数一致,则相等,前面已证实序列相同
if(sum == count_B)
{
return TRUE;
}
sum = 0;
//B链表回到起始节点,A链表移动到下一个节点
q = list_B->next;
p = p->next;
count_A--;
}
return FALSE;
}
思想方法
1.先设置3个用于工作的指针,指针p用于A表的遍历,指针q用于B表的遍历,指针work用于A表子序列的遍历。
2.先遍历A表第一个节点,与B表的第一个元素进行比较,如果不等,A的遍历指针移到下一个节点;如果相等,则进入A链表的子序列与B序列的对比。根据统计的元素相等的个数,看是否是其子序列。
3.若是,则返回正确;若不是,则让p指向下一个节点,让q回到B的第一个节点。