/** * 用链表实现 王道P40 T16 * * ①算法思想: * 两个链表从头到尾逐一比较, * 若 data 等等,一起后移, * 若 data 不等,则 B 链表从头开始和谐 A 上次链表的位置继续比较。 * * ②数据结构: * typedef struct LNode{ * int data; * struct LNode *next; * }LNode,*LinkList; * * ③算法设计 */ #include <stdio.h> #include <iostream> typedef struct LNode{ int data; struct LNode *next; }LNode,*LinkList; bool IsSubSet(LinkList A,LinkList B){ LinkList r = A -> next,q,p = r; while(r){ q = B -> next;//q 每次从头开始比较 while(q && p && (q -> data == p -> data)){//保证 r 和 q 都不为空 p = p -> next; q = q -> next; } if(q == NULL){//如果 q = NULL,说明 q 把 B 比较后,说明 B 是 A 的子序列 return true; } 如果不是因为 q == NULL 结束死循环,说明 A B 还没有比较成功, //那么 p 从下一个,q 从头开始,两者重新对比。 p = p -> next; } return false; } 以下是测试程序 尾插法建立单链表(有头节点) LinkList CreatLinkListR(){ LinkList L = (LinkList)malloc(sizeof(LNode));//创建头结点,头指针L指向头节点 LinkList p = L,q; 这里不必让 L -> next 指向空,因为L保存了头结点指针,尾插一定会在L后插入一个新节点,所以L后面肯定会有节点而不是空, //p用于保存尾节点指针,因此应允许 p -> next 为空。 int data; while(1){ scanf("%d",&data); if(data == 99999) break; q = (LinkList)malloc(sizeof(LNode)); q -> data = data; p -> next = q; p = q; } p -> next = NULL; return L; } 循环单链表的遍历(有头节点,无头结点) 引入带头结点 L -> next ,传入无头结点 L LinkList Order(LinkList L){ while(L){//当L不是空的时候 printf("%d ",L -> data); L = L -> next; } printf("\n"); } int main(){ LinkList A = CreatLinkListR(); LinkList B = CreatLinkListR(); Order(A -> next); Order(B -> next); printf("%d\n",IsSubSet(A,B)); }