2 u011288190 u011288190 于 2014.08.19 09:04 提问

如何在结构体数组中删掉重复值

假如结构体数组中的数据为:3 3 5 5 5 3 7 0 2 5 ,删除后的结构体数组中的数据为:3 5 3 7 0 2 5

3个回答

u013741428
u013741428   2014.08.19 09:54

用个土方法吧,先吧结构体的数据截取出来,放在数组里遍历。在截取该数组的足后一个对象来遍历比较是否有相同的,有就删除,没有就吧该对象存放在新的数组中。

u011288190
u011288190 我的数据量很大,这样做太慢了
接近 4 年之前 回复
Ldoujintianhei
Ldoujintianhei   2014.08.19 10:31

如果你的数据最大小于数组的长度则可以这样实现。
思想: 根据拆装箱思想,先统计各个数据重复个数,再删除重复数据

#include
#include

using namespace std;

int main(){

int a[] = {3, 3, 5, 5, 5 ,3 ,7, 0 ,2, 5 };
int n = sizeof(a) / sizeof(int);

int *p = new int[n];

//3,3
memset(p, 0, n * sizeof(int));
for (int i = 0; i < n; i++){
    p [a[i]] ++;
    cout << p[i] << ",";
}

int count = 0;
for (int k = 0; k < n; k++)
{
    if (p[k] >= 1){
        a[count++] = k;
    }
}

cout << "删除后的数组" << endl;

cout << "长度: " << count << endl;
cout << "数据: ";
for (int k = 0; k < count; k++)
{
    cout << a[k] << ", ";
}
delete p;
getchar();
return 0;

}

如果不满足第一种方法,则用下面这种,时间复杂度取决于快排
思想:先排序,后挑选不重复的数据
#include
#include

using namespace std;

int cmp(const void a, const void *b){
return(
(int *)a - *(int *)b);
}

void show(int a[], int n){
for(int i = 0; i < n; i++) {
cout << a[i] << ",";
}
}

int main(){

//fun1();

int a[] = {3, 3, 5, 5, 5 ,3 ,7, 0 ,2, 5 };
int n = sizeof(a) / sizeof(int);
int *p = new int[n];

qsort(a, n, sizeof(a[0]),cmp);

//show(a, n);

int count = 0;
for(int i = 0; i < n; i++) {
    if( a[i] == a[i + 1]) {
        continue;
    }
    p[count++]= a[i];
}

show(p, count);
getchar();
return 0;

}

Ldoujintianhei
Ldoujintianhei 回答你的问题也是一种学习,no thanks
接近 4 年之前 回复
u011288190
u011288190 我本来是想把重复值去掉,把结构体数组整理好之后整体插入到数据库中,但后来改变了思路,读每一条数据,如果和上一条相同就跳过,不相同就把此条数据插入到数据库中。不过还是谢谢你!
接近 4 年之前 回复
a2644859030
a2644859030   2014.08.19 15:33

0
如果你的数据最大小于数组的长度则可以这样实现。
思想: 根据拆装箱思想,先统计各个数据重复个数,再删除重复数据
#include
#include
using namespace std;
int main(){
int a[] = {3, 3, 5, 5, 5 ,3 ,7, 0 ,2, 5 };
int n = sizeof(a) / sizeof(int);

int *p = new int[n];

//3,3
memset(p, 0, n * sizeof(int));
for (int i = 0; i < n; i++){
p [a[i]] ++;
cout << p[i] << ",";
}

int count = 0;
for (int k = 0; k < n; k++)
{
if (p[k] >= 1){
a[count++] = k;
}
}

u011288190
u011288190 谢谢了
接近 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!