题目描述
线性表是n个元素的有序集合(n≥0),n是线性表中元素的个数,称为线性表的长度。可以用一组地址连续的存储单元依次存储线性表中元素,采用这种存储方式的线性表称为顺序表。
请在顺序表上实现运算,实现顺序表的逆置,删除表中所有元素值等于x的元素。
输入
三组数据,顺序表元素类型分别为整型、字符型和实型。
每一组第一行给出元素数目n(0<n≤1000),第二行给出元素数值,第三行给出待删除的元素。
输出
三组数据,每一组第一行给出逆置后的顺序表元素,第二行是在此基础上删除指定元素后的顺序表元素,每一个输出元素后均有一个空格,如果元素全部被删除,那么输出一个空行。
样例输入
8
1 2 3 7 5 6 7 8
7
3
a c m
h
4
1.2 3.4 5.6 7.8
1.2
样例输出
8 7 6 5 7 3 2 1
8 6 5 3 2 1
m c a
m c a
7.8 5.6 3.4 1.2
7.8 5.6 3.4
代码:
#include<iostream>
#include<vector>
using namespace std;
//生成数组
template <class T>
void generate(T a[],int n){
for(int i=0;i<n;i++)
cin>>a[i];
}
//输出元素
template <class T>
void print(T a[],int n){
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
}
//逆置
template <class T>
void rever(T a[],int n){
T tmp;
for(int i=0;i<n/2;i++){
tmp = a[n-i-1];
a[n-i-1] = a[i];
a[i] = tmp;
}
}
//删除指定元素
template <class T>
int del(T a[],T del,int n){
int flag = 0;//标志是否找到要删除的元素
for(int i=0;i<n;i++){
if(a[i]==del)
flag++;
if(flag != 0 && i!=n-1)
{
a[i-flag+1] = a[i+1];
}
}
//找到要删除的元素,大小减一
if( flag == false)
return n;
else
return n-flag;
}
int main(){
int a,b,c,size;
int del_a;
char del_b;
double del_c;
cin>>a;
int *arr_int = new int[a];
generate(arr_int,a);
cin>>del_a;
cin>>b;
char *arr_char = new char[b];
generate(arr_char,b);
cin>>del_b;
cin>>c;
double *arr_double = new double[c];
generate(arr_double,c);
cin>>del_c;
rever(arr_int,a);
print(arr_int,a);
size = del(arr_int,del_a,a);
print(arr_int,size);
rever(arr_char,b);
print(arr_char,b);
size=del(arr_char,del_b,b);
print(arr_char,size);
rever(arr_double,c);
print(arr_double,c);
size = del(arr_double,del_c,c);
print(arr_double,size);
}