2.4求连个递增来表的差集
题目描述:
已知A和B表是两个集合,其元素的值递增排列;设计一个算法,求A和B的差集,
(即出现在A中但是不在B中) 结果放在A中,同时返回元素的个数。
算法思想:
需要设置三个指针,pa,pb,pc;初始时,pa指向L1的第一个结点,pb指向第二个结点,pc指向L3求得头结点,L3=L1,即使用L1的头结点当做新链表L3的头结点。当pa和pb都非空时,比较两个指针所指向的元素的值:1.当pa->data<pb->data时,说明当前pa所指向的元素值在L1中,此时令pc=pa,pb不变,pa向后移动,pa=pa->next;2.当pa->data>pb->data时,说明pb所指向的元素在L2中,而不在L1中,则pa指针保持不变,pb后移,pb=pb->next;3.当pa->data==pb->data时,说明pa和pb所指向的是L1和L2的公共元素,则需要改变pc的指向,pa也啊哟后移,pc->next=pa->next,pa=pa->next。
void DiffSet(LinkList &L1,LinkList &L2,LinkList &L3){
struct LNode *pa,*pb,*pc;
pa=L1->next;
pb=L2->next;
pc=L3=L1;
while(pa&&pb){
if(pa->data<pb->data){
pc=pa;
pa=pa->next;
}else if(pa->data>pb->data){
//pc=pa;
pb=pb->next;
}else if(pa->data==pb->data){
// pc=pa;
// pa=pa->next;
// pb=pb->next;
// pc=pa;
pc->next=pa->next;
pa=pa->next;
}
}
}
具体实现:
/*
已知A和B表是两个集合,其元素的值递增排列;设计一个算法,求A和B的差集,
(即出现在A中但是不在B中) 结果放在A中,同时返回元素的个数。
*/
#include<stdio.h>
#define MAX 100
typedef struct LNode {
int data;
struct LNode *next;
}LNode,*LinkList;
int InitList(LinkList &L){
L=new LNode;
L->next=NULL;
return 1;
}
int ListLength(LinkList &L){
struct LNode *p;
p=L->next;
int length=0;
while(p){
++length;
p=p->next;
}
return length;
}
void TraveList(LinkList L){
struct LNode *p;
p=L->next;
while(p){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
void CreateList(LinkList &L,int n){
L=new LNode;
L->next=NULL;
struct LNode *r;
r=L;
for(int i=0;i<n;i++){
printf("请输入第%d个元素的值:",i+1);
struct LNode *s;
s=new LNode;
scanf("%d",&s->data);
s->next=NULL;
r->next=s;
r=s;
}
}
void DiffSet(LinkList &L1,LinkList &L2,LinkList &L3){
struct LNode *pa,*pb,*pc;
pa=L1->next;
pb=L2->next;
pc=L3=L1;
while(pa&&pb){
if(pa->data<pb->data){
pc=pa;
pa=pa->next;
}else if(pa->data>pb->data){
//pc=pa;
pb=pb->next;
}else if(pa->data==pb->data){
// pc=pa;
// pa=pa->next;
// pb=pb->next;
// pc=pa;
pc->next=pa->next;
pa=pa->next;
}
}
}
int main(){
LinkList L1,L2,L3;
if(InitList(L1)){
printf("L1初始化成功!\n");
}else{
printf("L1初始化失败!\n");
}
if(InitList(L2)){
printf("L2初始化成功!\n");
}else{
printf("L2初始化失败!\n");
}
if(InitList(L3)){
printf("L3初始化成功!\n");
}else{
printf("L3初始化失败!\n");
}
printf("请输入L1的长度:");
int n1;
scanf("%d",&n1);
CreateList(L1,n1);
TraveList(L1);
printf("请输入L2的长度:");
int n2;
scanf("%d",&n2);
CreateList(L2,n2);
TraveList(L2);
DiffSet(L1,L2,L3);
TraveList(L3);
printf("差集的元素个数:%d",ListLength(L3));
}