/**
* 用链表实现 王道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 p = A -> next,r = p,q = B -> next;
while(p && q){
if(p -> data == q -> data){
p = p -> next;
q = q -> next;
}else{
r = r -> next;
p = r;
q = B;
}
if(q == NULL)
return true;
else
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));
}
王道书P40 T16(单链表实现)
于 2022-07-15 14:51:50 首次发布