刷题第七天:南邮NOJ【1014数据的插入与删除】

数据的插入与删除

时间限制(普通/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;

}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值