数据的插入与删除
时间限制(普通/Java) : 1000MS/ 3000 MS 运行内存限制 : 65536 KByte
总提交 : 2183 测试通过 : 453
比赛描述
在一组数据(数目不超过10000)中,插入新数,删除所有与给定数相等的数据。
输入
第一行是未排序的一组非负整数,数目不超过10000。以-1作为结束标志。
第二行是要插入的数。
第三行是要删除的数。
输出
第一行输出自小到大排好序的数。如果没有元素,输出“No elements.”(不包括引号)。
第二行输出插入后自小到大排好序的数,以“,”隔开。
第三行输出删除后自小到大排好序的数,以“,”隔开。如果没有元素,输出“No elements.”(不包括引号)。
样例输入
100 98 79 63 44 99 -1
88
79
样例输出
44,63,79,98,99,100
44,63,79,88,98,99,100
44,63,88,98,99,100
提示
题目来源
GUOJ
来自
/*这一题所用时间比较久,并导致有接近2周时间没刷NOJ,今天终于通过*/
/*主要错误:只对重复数据进行了一次删除*/
#include
#include
voidsort(int *NUM,int N);//排序函数
voidprintarrays(int *NUM,int N);//打印函数
voidinsertarrays(int *NUM,int n,int N);//插入函数
intdeletearrays(int *NUM,int m,int N);//删除函数
int main()
{
int NUM[100000],n,m,s;//定义一个数组,n存放插入的数据,m存放要删除的数据
int N=0;
scanf("%d",&NUM[N]);//判断数组第一个数据是否为-1
while(NUM[N]!=-1)//将数据依次存放进数组
{
N++;
scanf("%d",&NUM[N]);
}
if(N!=0)//若数组个数不为0
{
scanf("%d",&n);
scanf("%d",&m);
sort(NUM,N);//排序
printarrays(NUM,N);//打印
insertarrays(NUM,n,N);//插入
printarrays(NUM,++N);//打印
s=deletearrays(NUM,m,N);//查找到需要删除的数据的个数
if(s)
printarrays(NUM,N-s);//若不为0,则打印出删除后的数据
else
printarrays(NUM,N);//若为0,则依次打印原有数据
}
else//数组个数为0
{
scanf("%d",&n);
scanf("%d",&m);
printf("No elements.\n");//题目要求输出内容
insertarrays(NUM,n,N);
printarrays(NUM,++N);
if(deletearrays(NUM,m,N))//表示插入的数据即为妖删除的数据
printf("No elements.\n");
else
printarrays(NUM,N);
}
return 0;
}
voidsort(int *NUM,int N)//常见的排序算法
{
int i,j,temp;
for(i=0;i for(j=N-1;j>i;j--) if(NUM[j] { temp=NUM[j]; NUM[j]=NUM[j-1]; NUM[j-1]=temp; } } voidprintarrays(int *NUM,int N)//打印数据函数 { int i; for(i=0;i { printf("%d",NUM[i]); if(i printf(","); } printf("\n"); } voidinsertarrays(int *NUM,int n,int N)//插入函数 { int i,j; for(i=0;i for(j=N-1;j>=i;j--) NUM[j+1]=NUM[j]; NUM[i]=n; } intdeletearrays(int *NUM,int m,int N)//删除函数 { int i=0,j,x,n=0;//i用来跟中相同数据的位置,j用来进行删除后的重新归位,x用来获得位置,n用来获得个数 while(i { if(NUM[i]==m) { x=i; n++; } i++; } if(n!=0)//若n不为0,则j的起始位置为(x-n+1) { for(j=x-n+1;j NUM[j]=NUM[j+n]; } return n; }