题目描述
已知集合A和B,编程实现集合=A∩B,要求应用线性表提供的基本操作(初始化,求表长,取元素,定位/查找,插入等)来实现。
输入
输入数据共4行:
第1行:集合A的元素数
第2行:集合A中的元素(以空格间隔)
第3行:集合B的元素数
第4行:集合B中的元素(以空格间隔)
输出
集合A中的元素(以递增方式),以空格间隔(最后无空格)
样例输入 复制
6
4 5 6 1 2 3
3
6 9 1
样例输出 复制
1 6
算法设计思路:
- 分别调用初始化函数初始化两个线性表La和Lb。
- 分别输入两个线性表La和Lb中的数据。
- 依次取出La中第i个元素t,调用定位函数在Lb中查找元素t,如果找不到,则调用删除函数将t从La中删除(特别注意:删除第i个元素之后,第i+1个元素变成了第i个元素)。
- 调用排序函数对La中的元素进行排序。
- 调用输出函数输出已经排好序的La中的元素。
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef int ElemType;
typedef struct {
ElemType *elem; // 顺序表数组的基址
int length; // 顺序表当前元素个数
} SqList;
void initList(SqList &L);
void inputList(SqList &L);
void deleteList(SqList &L,int i);
void listIntersection(SqList &La,SqList Lb);
void sortList(SqList &L);
void printList(SqList L);
int main(void) {
SqList La,Lb;
initList(La);
initList(Lb);
inputList(La);
inputList(Lb);
listIntersection(La,Lb);
sortList(La);
printList(La);
return 0;
}
void initList(SqList &L) {
L.elem=(ElemType*)malloc(MAXSIZE*sizeof(ElemType));
L.length=0;
}
void inputList(SqList &L) {
scanf("%d",&L.length);
for(int i=0; i<L.length; i++) scanf("%d",&L.elem[i]);
}
void deleteList(SqList &L,int i) {
for(int j=i; j<L.length; j++) L.elem[j-1]=L.elem[j];
L.length--;
}
int locateElem(SqList L,ElemType e) {
int i;
for(i=0; i<L.length; i++)
if(L.elem[i]==e) break;
if(i==L.length) return 0;
else return i+1;
}
void listIntersection(SqList &La,SqList Lb) {
}
void sortList(SqList &L) {
int i,j,n;
n=L.length;
for(i=0; i<n-1; i++) {
int index=i;
for(j=i+1; j<=n-1; j++)
if(L.elem[index]>L.elem[j]) index=j;
int t=L.elem[index];
L.elem[index]=L.elem[i];
L.elem[i]=t;
}
}
void printList(SqList L) {
for(int i=0; i<L.length; i++) printf("%d ",L.elem[i]);
}