c语言,两个将两个数组中的相同元素全部删去,输出删去后的两个数组。 如【1,1,1,2,2,2,0,2,1,3】和【0,1

如:输入【1,1,1,2,2,2,0,,5,1,3】和【0,1,1,0,4,4,3,2】

输入【5】和【4,4】

#include <iostream>
using namespace std;
bool Removeduplicate(int data[],int &lon,int a);//去掉数组中为a的数据
int main()
{
 int l1=10; 
 int l2=10;
 int a1[10]={10,10,12,26,56,26,30,30,20,10};
 int a2[10]={10,12,56,10,20,22,22,33,33,30};
 int j=0,i;
 while(j<=l1)
 {
  if(Removeduplicate(a1,l1,a2[j]))  //如果有删除就说明两数组中有有相同数据a2[j]
  {
   Removeduplicate(a2,l2,a2[j]); //如果a2[j]数据是重复数据就删除
  }
  else
  {
  j++;  //如果没有重复数据就判断下一个数据
  }
 }
 cout<<"l1="<<l1<<endl;
 for(i=0;i<l1;i++)
  cout<<a1[i]<<" ";
 cout<<endl;
 cout<<"l2="<<l2<<endl;
 for(i=0;i<l2;i++)
  cout<<a2[i]<<" ";
 cout<<endl;
 return 0;
}

bool Removeduplicate(int data[],int &lon,int a)    //去掉数组中为a的数据
{
 int mak=0;     //标志位
 for(int i=0;i<lon;i++)
 {
  if(data[i]==a)//找到相同数据就删除
  {
   for(int j=i;j<lon-1;j++)
   {
    data[j]=data[j+1];    //删除相同数据
   }
   i--;
   lon--;
   mak++;       //标志有进位就说明有删除
  }
 }
 if(mak>0)   //有删除就返回真
  return true;
 else
  return false;
}

 

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-06-09
#include<stdio.h>
#include<malloc.h>

int main(){

int m,n;
int *a,*b,*a_same,*b_same;

//----------初始化-------------
printf("输入数组a的个数:\n");
scanf("%d",&m);
a=(int*)malloc(m*sizeof(int));//动态分配数组
a_same=(int*)malloc(m*sizeof(int));//a_same用于标识是否相同
printf("输入数组a的值:\n");
for(int i=0;i<m;i++)
{
scanf("%d",a+i);
a_same[i]=0;//初始为0
}
printf("输入数组b的个数:\n");
scanf("%d",&n);
b=(int*)malloc(n*sizeof(int));
b_same=(int*)malloc(n*sizeof(int));
printf("输入数组b的值:\n");
for(int i=0;i<n;i++){
scanf("%d",b+i);
b_same[i]=0;
}

//----------------比较-----------
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(a[i]==b[j])
{
a_same[i]=b_same[j]=1;}//若相同则标识为1
}
}
//----------输出结果----------------
printf("数组a为:\n");
for(int i=0;i<m;i++){
if(a_same[i]==0)
printf("%d ",a[i]);
}

printf("\n");
printf("数组b为:\n");
for(int i=0;i<n;i++){
if(b_same[i]==0)
printf("%d ",b[i]);
}

return 0;
}追问

这个程序本身是正确的,但是因为开了两个标记数组,如果输入的数组大的话,多开两个素组就多耗费一倍内存了。不过还是谢谢你认真回答了。

追答

好吧,其实我有考虑过,要实现楼主所采纳的答案也不难,只不过因为每次删一个数对于数组来说很浪费时间,需要移动很多数,所以我就用空间换取时间吧,因为一般内存那么多,不用白不用。我的方法使用标志位,只需要双层循环一次就可以了。最好,节约时间和节约空间,各有所好吧。

第2个回答  2013-06-09
写好了
#include <stdio.h>
int main()
{
long a[1000],b[1000];//看完整个程序再看这句注释:因为元素为int类型,所以将元素标记为32769不会溢出
int n1,n2;
printf("请输入第一个数组的元素个数:\n");//输入第一个数组
scanf("%d",&n1);
int i;
for(i = 0; i < n1; i++)
{
scanf("%d",&a[i]);
}
printf("请输入第二个数组的元素个数:\n");//输入第二个数组
scanf("%d",&n2);
int j;
for(j = 0; j < n2; j++)
{
scanf("%d",&b[j]);
}
for(i = 0; i < n1; i++) //在数组中搜索相同的元素值,找到了,就标记为32769,然后不要输出。
{
for(j = 0; j < n2; j++)
{
if(a[i] == b[j])
{
a[i] = 32769;
b[i] = 32769;
}
}
}
for(i = 0; i < n1; i++)
{
if(a[i] != 32769)
printf("%d ",a[i]);
}
for(j = 0; j < n2; j++)
{
if(b[j] != 32769)
printf("%d ",b[j]);
}
return 0;
}追问

如果数组中本来就有32769这个数呢?声明的数组是长整型,所以,输入的数就可以是长整型数,这样就会出现错误,是不是?

追答

如果是长整型,那就把作为标志的32769改为'\0' //即空,就可以了啊

本回答被网友采纳
相似回答