#include<stdio.h>
#include<malloc.h>
#include <stdlib.h>
#define maxsize 10
typedef int ElemType;
typedef int status;
typedef struct
{
ElemType *data;
int length;
}SqList;
SqList creat()
{
SqList L;
int len;
scanf("%d", &len);
L.data = (ElemType *)malloc(sizeof(int)*(len));
int a;
for (int i=0; i<len; i++)
{
printf("请输入第%d个元素值:", i+1);
scanf("%d", &a);
L.data[i] = a;
}
L.length = len;
return L;
}
void print(SqList A)
{
for(int i=0; i<A.length; i++)
printf("%d\n", A.data[i]);
}
SqList delete(SqList A, SqList B, SqList C)
{//删除A表中同时在B表和C表中出现的元素,ABC均为递增有序的顺序表
int i=0, j=0, k=0; //ijk分别用于扫描表ABC;
if(A.length>0)
{
while(i<A.length && j<B.length && k<C.length)
{
if(B.data[j] == C.data[k])
{
if(A.data[i] == B.data[j])
{
int no = i+1; int count = 1;
//往前找到与下标为i的元素值不同的元素
while(A.data[i] == A.data[no])
{
no ++;
count ++;
}//退出循环时no表示元素值大于A.data[i]的第一个元素下标,
//count表示与A[i]元素值相等的元素个数
for (int h=no; h<A.length; h++) //删除符合条件的元素
A.data[h-count] = A.data[h];
A.length -= count;
j++;
k++;
}
else if(A.data[i] < B.data[j])
i++;
else
{
j++;
k++;
}
}
else if(B.data[j] < C.data[k])
j++;
else
k++;
}
}
return A;
}
int main()
{
printf("请输入待建表A的表长:\n");
SqList A = creat();
printf("请输入待建表B的表长:\n");
SqList B = creat();
printf("请输入待建表C的表长:\n");
SqList C = creat();
A = delete(A, B, C);
print(A);
return 0;
}
2.29√ 已知ABC为三个递增有序的线性表,现要求对A表进行如下操作:删去那些即在B表中出现,又在C表中出现的元素(题中没有特别指明同一表中的元素值各不相同)
最新推荐文章于 2024-07-12 16:42:24 发布