顺序表的删除
在长度为 n(n<1000)的顺序表中可能存在着一些值相同的“多余”数据元素(类型为整型),编写一个程序将“多余”的数
据元素从顺序表中删除,使该表由一个“非纯表”(值相同的元素在表中可能有多个)变成一个“纯表”(值相同的元素在表中只能有一个)。
输入
第一行输入表的长度 n;
第二行依次输入顺序表初始存放的 n 个元素值。
输出
第一行输出完成多余元素删除以后顺序表的元素个数;
第二行依次输出完成删除后的顺序表元素。
示例输入
12
5 2 5 3 3 4 2 5 7 5 4 3
示例输出
5
5 2 3 4 7
思路:
嵌套遍历两遍该表(i)(j) 如果a[i] == a[j]且i != j 则说明有相同元素,删除。
#include<iostream>
#include<cstdio>
#define Max 1000
using namespace std ;
int max ( int a , int b )
{
return a>b?a:b ;
}
class Form
{
private :
int a[Max] , length ;
public :
Form ( int l ) : length (l) {}
int Return () //返回长度
{
return length ;
}
void Creat () //创建
{
for ( int i = 0 ; i < length ; i++ )
{
int k ;
cin >> k ;
a[i] = k ;
}
}
void Show () //输出
{
for ( int i = 0 ; i < length ; i++ )
{
cout << a[i] << " " ;
}
}
/* void Delete ( int i ) //如果忘记了就画五个圈去找
{
int k ;
for ( k = i - 1 ; k < length ; k++ )
{
a[k] = a[k+1] ;
}
length-- ;
}//调试可以增加一条语句:一个一个输出 这样方便看结果 */
void traverse ( ) //遍历加删除
{
for ( int i = 0 ; i < length ; i++ )
{
for ( int j = 0 ; j < length ; j++)
{
if ( i != j )
{
if ( a[i] == a[j] )
{
for ( int k = max(i,j) ; k < length ; k++ )
{
a[k] = a[k+1] ;
}
length-- ;
}
}
}
}
}
};
int main ()
{
int a ;
while ( scanf("%d",&a) != EOF )
{
Form f1( a ) ;
f1.Creat() ;
f1.traverse() ;
cout << f1.Return() ;
cout << endl ;
f1.Show() ;
cout << endl ;
}
return 0 ;
}