删除数组中相同的数据元素 C语言 比如1 1 1 1 1 2 2 3 1 1 4 结果是1 2 3 4

#include<stdio.h>
int main()
{
int a[10],i,j,k,n=10;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
{
if(a[i]==a[j])
{
for(k=j;k<n-1;k++)

a[k]=a[k+1];
n--;
j--;
}
}
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
这个是答案,自己做出来了

修订版:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef int T;

// 打印数组
void Print(T* beg, T* end, const char* msg)
{
printf(msg);
while(beg != end)
printf("%d ", *beg++);
putchar('\n');
}

// 把元素向左移以覆盖重复元素
void MoveUp(T* dest, T* src, T* end)
{
while(src != end)
*dest++ = *src++;
}

// 去重
T* Unique(T* beg, T* end)
{
T* dupBeg = end;

if(end - beg <= 1)
return end;

while(++beg != end)
{
if(*(beg - 1) == *beg)
{
dupBeg = beg;
while(*++dupBeg == *(dupBeg - 1) && dupBeg != end);
if(dupBeg == end)
return beg;
else
{
MoveUp(beg, dupBeg, end);
end -= dupBeg - beg;
}
}
}

return end;
}

// 求差集
T* SetDiff(T* a, T* endOfA, T* b, T* endOfB, T* c)
{
T* p;
for(; a != endOfA; ++a)
{
for(p = b; p != endOfB; ++p)
if(*p == *a)
break;
if(p == endOfB)
*c++ = *a;
}
return c;
}

inline int Cmp(const void* lhs, const void* rhs)
{
return *(const T*)lhs - *(const T*)rhs;
}

int main()
{
// 只是个示例,元素个数很多的话可以用动态数组
T a[] = , *endOfA = a + sizeof(a) / sizeof(a[0]);
T b[] = , *endOfB = b + sizeof(b) / sizeof(b[0]);
T* c, *endOfC;

// 排序
qsort(a, endOfA - a, sizeof(T), Cmp);
qsort(b, endOfB - b, sizeof(T), Cmp);

// 去重
endOfA = Unique(a, endOfA);
endOfB = Unique(b, endOfB);
Print(a, endOfA, "Set A: ");
Print(b, endOfB, "Set B: ");

// c = a - b;
c = (T*)malloc(sizeof(T) * (endOfA - a));
endOfC = SetDiff(a, endOfA, b, endOfB, c);
Print(c, endOfC, "Difference of A & B: ");

free(c);
return 0;
}

这样的话用C++更简单,直接set_difference:
#include <iostream>
#include <list>
#include <algorithm>
#include <iterator>
using namespace std;

int main()
{
int a[] = ;
int b[] = ;

list<int> la(a, a + 6);
list<int> lb(b, b + 5);
list<int> lc;

// 排序
la.sort();
lb.sort();

// 去重
la.unique();
lb.unique();

// 求差集,存在lc中
set_difference(la.begin(), la.end(), lb.begin(), lb.end(), back_inserter(lc));

// 打印
copy(lc.begin(), lc.end(), ostream_iterator<int>(cout, " "));
}

至于存储数据的数据结构,list,deque都是理想的选择,vector不太适合,因为你的数据量比较大,其他的就不用我说了吧,数据结构 + <algorithm> 就可以了,STL的算法和数据结构效率应该够高了吧,思路给你,具体的地方需要的话自己改一下。

如果嫌list是占用空间大的话可以用deque,但是unique和sort等方法就必须使用<algorithm>中的了,还有别忘了erase。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-07-05
#include <stdio.h>

main()
{
int i,j,t;
int a[10]={1,3,3,2,5,1,1,5,2,6};
t=a[0]; /*把第一个数赋给t*/
for(i=1;i<10;i++)
{
if (t==a[i]) /*判断是否有相同的*/
{
for(j=0;j+i<9;j++)/*用循环进行删除*/
a[i+j]=a[i+j+1];/*后面的数替代前面的*/
a[9]=0;
} /*后面补0*/
t=a[i+1]; /*把下一个数赋给t*/
}
for(i=0;i<10;i++)/*输出*/
printf("%d",a[i]);
}
相似回答