#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef int Elemtype;
typedef int Status;
typedef struct Lnode{
Elemtype data;
struct Lnode *next;
}Lnode,*LinkList;
LinkList ListInit(int n){//初始化线性表篇
LinkList L;
Lnode *p,*q;
L = (Lnode*)malloc(sizeof(Lnode));
if(!L){
return ERROR;
}
L->next = NULL;
p = L;
for(int i = 0 ; i < n ; i++){
q = (Lnode*)malloc(sizeof(Lnode));
if(!q){
return ERROR;
}
printf("请输入元素:");
scanf("%d",&q->data);
q->next = NULL;
p->next = q;
p = q;
}
return L;
}
LinkList ListIntersection(LinkList La,LinkList Lb,int n ,int m){//求线性表A和B的交集
LinkList Lc;
Lc = (Lnode*)malloc(sizeof(Lnode));
if(!Lc){
return ERROR;
}
Lc->next = NULL;
Lnode *p,*q,*s,*t;
s = Lc;
p = La->next;
for(int i = 0 ;i < n ;i++){
q = Lb->next;//每次遍历完线性表B,都要把指针指回头结点
for(int j = 0; j < m ; j++){
if(p->data == q->data){
t = (Lnode*)malloc(sizeof(Lnode));
if(!t){
return ERROR;
}
t->data = q->data;
t->next = NULL;
s->next = t;
s = t;
}
q = q->next;
}
p = p->next;
}
return Lc;
}
LinkList ListUnion(LinkList La,LinkList Lb,int n ,int m){//求线性表A和B的并集
LinkList Lc;
Lc = (Lnode*)malloc(sizeof(Lnode));
if(!Lc){
return ERROR;
}
Lc->next = NULL;
Lnode *p,*q,*s,*t,*r,*w;
p = Lc;
s = La->next;
for(int i = 0 ; i < n; i++){//把顺序表A的元素都放到顺序表C中
q = (Lnode*)malloc(sizeof(Lnode));
if(!q){
return ERROR;
}
q->data = s->data;
q->next = NULL;
p->next = q;
p = q;
s = s->next;
}
t = p;//t指针指向Lc表尾
r = Lb->next;
for(int i = 0 ; i < m ;i++){
int flag = 0;
s = La->next;//每次遍历完线性表A,都要把指针指回头结点
for(int j = 0; j < n ; j++){
if(r->data == s->data){
flag = 1;
break;
}
s = s->next;
}
if(flag == 0){
w = (Lnode*)malloc(sizeof(Lnode));
if(!w){
return ERROR;
}
w->data = r->data;
w->next = NULL;
t->next = w;
t = w;
}
r = r->next;
}
return Lc;
}
LinkList ListDifferenceSet(LinkList La,LinkList Lb,int n ,int m){//求线性表A和B的差集
LinkList Lc;
Lc = (Lnode*)malloc(sizeof(Lnode));
if(!Lc){
return ERROR;
}
Lc->next = NULL;
Lnode *p,*q,*s,*w;
s = Lc;
p = La->next;
for(int i = 0 ;i < n ;i++){
int flag = 0;
q = Lb->next;//每次遍历完线性表B,都要把指针指回头结点
for(int j = 0; j < m ; j++){
if(p->data == q->data){
flag = 1;
break;
}
q = q->next;
}
if(flag == 0){
w = (Lnode*)malloc(sizeof(Lnode));
if(!w){
return ERROR;
}
w->data = p->data;
w->next = NULL;
s->next = w;
s = w;
}
p = p->next;
}
return Lc;
}
void ListPrint(LinkList L){//打印线性表
Lnode *p;
p = L->next;
while(p){
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
int main(){
LinkList La,Lb,Lc;
int n,m;
printf("请输入线性表A的元素个数:");
scanf("%d",&n);
La = ListInit(n);
printf("线性表A为:");
ListPrint(La);
printf("请输入线性表B的元素个数:");
scanf("%d",&m);
Lb = ListInit(m);
printf("线性表B为:");
ListPrint(Lb);
Lc = ListIntersection(La,Lb,n,m);
if(Lc->next == NULL){
printf("线性表A和B的交集为空!\n");
}else{
printf("线性表A和B的交集为:");
ListPrint(Lc);
}
printf("线性表A和B的并集为:");
Lc = ListUnion(La,Lb,n,m);
ListPrint(Lc);
printf("线性表A和B的差集为:");
Lc = ListDifferenceSet(La,Lb,n,m);
ListPrint(Lc);
return 0;
}
求顺序表A和顺序表B的交集、并集和差集
于 2022-09-26 21:38:07 首次发布