数据的插入与删除
时间限制(普通/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
来自 <http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1014>
/*这一题所用时间比较久,并导致有接近2周时间没刷NOJ,今天终于通过*/
/*主要错误:只对重复数据进行了一次删除*/
#include<stdio.h>
#include<stdlib.h>
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<N;i++)
for(j=N-1;j>i;j--)
if(NUM[j]<NUM[j-1])
{
temp=NUM[j];
NUM[j]=NUM[j-1];
NUM[j-1]=temp;
}
}
voidprintarrays(int *NUM,int N)//打印数据函数
{
int i;
for(i=0;i<N;i++)
{
printf("%d",NUM[i]);
if(i<N-1)
printf(",");
}
printf("\n");
}
voidinsertarrays(int *NUM,int n,int N)//插入函数
{
int i,j;
for(i=0;i<N&&NUM[i]<n;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<N)//依次查找
{
if(NUM[i]==m)
{
x=i;
n++;
}
i++;
}
if(n!=0)//若n不为0,则j的起始位置为(x-n+1)
{
for(j=x-n+1;j<N-1;j++)
NUM[j]=NUM[j+n];
}
return n;
}