西工大数据结构NOJ003:顺序表的删除
这道题从数学上来讲其实非常好理解
就是三个集合A,B,C,先求B和C的交集,然后A减去B和C的交集之后输出A的元素就行了
思路非常的简单
#include <iostream>
#define MAXSIZE 100
using namespace std;
struct SqList{
int elem[MAXSIZE];
int length;
SqList(int length){
this->length=length;
// 把输入数据的工作放在了构造函数里面,非常的简介
for(int i=0;i<length;i++){
cin>>elem[i];
}
}
void del(int pos){
if(pos<1||pos>length){
return;
}
for(int i=pos-1;i<length-1;i++){
elem[i]=elem[i+1];
}
length--;
}
int locate(int value){
// 找到线性表中值为value的位置
for(int i=0;i<length;i++){
if(elem[i]==value){
return i+1;
}
}
return -1;
// 找不到返回-1
}
int retrieve(int pos){
// 取出线性表中第pos个元素的值
if(pos>0&&pos<=length){
return elem[pos-1];
}
cout<<-1;
// 如果找不到这个元素返回-1
}
void PrintList(){
for(int i=0;i<length;i++){
cout<<elem[i]<<" ";
}
cout<<endl;
}
};
void Intersection(SqList &la,SqList &lb) {
// 找到la和lb的交集,存储在la里
int k, x;
for (int i = 1; i <= la.length;) {
x = la.retrieve(i);
k= lb.locate(x);
if (k == -1) {
la.del(i);
//如果没有在lb中找到那么将该元素删除,注意此时i并没有变化,因为在del函数中会将数组往前移动,懂不懂物理里面经常说的运动是相对的,就是这个意思
}else{
i++;
}
}
}
void AminusBandC(SqList &la,SqList &lb){
// la删除lb和lc的交集之后的结果
int k,x;
for(int i=1;i<=lb.length;){
x=lb.retrieve(i);
k=la.locate(x);
if(k==-1){
i++;
}else{
la.del(k);
}
}
}
int main() {
int lenA,lenB,lenC;
cin>>lenA>>lenB>>lenC;
// 线性表的初始化
SqList la(lenA);
SqList lb(lenB);
SqList lc(lenC);
// 找相同元素的算法
Intersection(lb,lc);
AminusBandC(la,lb);
la.PrintList();
return 0;
}