加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

转:C语言基础算法——数组元素的查找、删除和添加

(2018-09-02 19:19:04)
分类: 信息学奥赛
内容来自: https://blog.csdn.net/junjie_ac/article/details/79321859

来晚了,这篇博客本来整理好昨晚就该发的,但程序出现了点bug,抽时间又调了下,又恰逢今天与一些优秀的同学交流,聊天甚是愉悦并掌握了许多有用的信息,导致差点忘了这事。从这篇博客开始,我们慢慢要进阶了,小白们,如果觉得我写的还不错,麻烦你注册常来,顺便给我点个赞哈~让更多的人看到此类干货。 
————————————————华丽分割线———————————————————— 
今天一样是对数组元素进行相应操作,不过是稍微复杂点的操作,但是在实际生活中又是比较基础的应用。我给思路给程序,发散思维的工作你们脑洞大点,充分发挥自己的想象力并去实施,你会慢慢发现C语言就是人工智能女友,哈哈。 
————————————————华丽分割线———————————————————— 
一、数组元素的查找和删除 
首先,给定一些数组元素(有些同学会问为什么总是给定?不要急,前期牢固基础,后期才能开车载人,成为一名合格的老司机),C中定义好一组数后,数组中的元素有下标或者说索引,比如说,第1个元素就是从下标为0开始,第2个元素下标就是1,……依次类推。 
其次,我们遇到个问题:如果要访问数组中的元素,到底是直接访问元素?还是访问元素的下标?访问的计算机思路是什么?(数组元素在这里是数组中的数) 
答:通过访问元素下标来访问元素。穷举法。谨记!!! 
最后,既然是查找,那我们的思路就是:要查找的是元素的下标。如果和删除操作相结合就是:我们要怎么样才能删除特定的数据,查找到要删除的元素的下标后,然后干嘛?注意:前方高能地想,如果怎么样,那么要干嘛?也就是说,如果找到了,那么我要删除。 
重头戏来了,初步思路已经有,你要怎么删除???? 
比如,1 2 3 4 5,删除 3 是不是成了 1 2 4 5。想想, 
1、删除导致元素减少 
2、4的位置到了3,5的位置到了4 
总结:所谓删除逻辑就是,后面一个数覆盖前面一个数,最后数量要减少了1。

二、数组元素的添加 
承接上面的删除操作,下启添加操作。 
添加到底是个什么操作呢?这么说吧,你要挖墙脚,如狼似虎、锲而不舍、饥渴难耐的你在微信和她聊天,表白了,结果呢?你再发送消息,“您还不是对方的好友,请通过验证添加对方为好友”,她把你删了。后来呢,她和她男友吹了,她想起了锲而不舍的你(备胎一号),她又添加了你,此时,细心的朋友发现,刚添加的朋友在微信通讯录里是处于最后一位,而刷新一下,朋友就会因为昵称拼音首字母被有序排列在好友列表里。 
要划重点了,同学们。你先是被添加了,通讯录里才有你,也就是说,先进行添加操作,再执行整体数量加1的操作。通讯录好比一个数组,刚添加的你是在最后一位,通讯录扩充了,而刷新后,你被排序了。(排序可用之前的冒泡排序,我敲的累所以没写) 
总结: 
1、先执行添加操作,再执行数组长度 + 1 的操作 
2、刚被添加的元素在数组末位 
3、这里是数字,升序还是降序排列,随你,用我第一篇博客的方法去实现

好啦,上程序代码:


#include 

//查找和删除的业务逻辑
 
int main()
{
    int count = 7;                //数组元素个数
    double Nums[] = {423.2, 457.7, 409.0, 412.3, 407.6, 580.3, 320.5};
    int JudgementNum;             //用户进行下一步操作的判断数
    double InsertNum;             //用户要插入的数据
    double DeleteNum;             //用户要删除的数据
    int DeleteIndex = -1;         //删除某个数据的下标(索引),要给一个不可能的初值,方便判断。

    int i;                        //循环变量

    printf("当前采集到的数据为:\n");
    for(i = 0; i < count; i++)
    {
        printf("%.2lf\t", Nums[i]);
    }
    printf("\n\n是否需要删除部分数据?\n提示:输入数字1进行删除操作,输入数字0确认当前数据采集无误。\n");
    printf("请输入:");
    scanf("%d", &JudgementNum);
    if(JudgementNum == 1)
    {
        printf("\n请输入要删除的数据:");
        scanf("%lf", &DeleteNum);
        for(i = 0; i < count; i++)       //穷举法,是常用算法之一
        {
            if(DeleteNum == Nums[i])     //Nums[i]表示数组中的第i个元素
            {
                //找到后并记录当前数据的下标(索引)
                DeleteIndex = i;
                break;                   //找到了要删除的数据,直接跳出循环,提升效率
            }
        }
        //根据索引的判断,如果你要删除的数的下标和所给定索引的初值相同,那么肯定就是没找到。
        if(DeleteIndex == -1)
        {
            printf("没有找到该数据,删除失败!\n");
        }
        else
        {
            //如果找到了,建立一个循环并且从下标开始,数组中的元素后面一个覆盖前面一个,且数组长度 - 1
            for(i = DeleteIndex; i < count - 1; i++)
            {
                Nums[i] = Nums[i+1];
            }
                count--;
            //并打印输出后的结果
            printf("\n第%d个数据将被删除,删除后的结果为:\n", DeleteIndex + 1);
            for(i = 0; i < count; i++)
            {
                printf("%.2lf\t", Nums[i]);
            }
        }
    }else if(JudgementNum == 0)
    {
        printf("当前数据采集无误并保存!");
    }
    else
    {
        printf("删除数据操作发生错误!");
    }
    //注意:以下程序实现的是删除数据之后的插入操作
    printf("\n\n是否需要添加部分数据?\n提示:输入数字1进行添加操作,输入数字0保存当前数据。\n");
    printf("请输入:");
    scanf("%d",&JudgementNum);
    if(JudgementNum == 1)
    {
        printf("\n请输入要添加的数据:");
        scanf("%lf", &InsertNum);
        //进行添加操作,再数组长度+1
        Nums[count] = InsertNum;
        count++;
        printf("\n添加数据后的结果为:\n");
        for(i = 0; i < count; i++)
        {
            printf("%.2lf\t", Nums[i]);
        }
    }else if(JudgementNum == 0)
    {
        printf("当前数据已被保存。\n");
    }
    else
    {
        printf("添加数据操作发生错误\n");
    }
    return 0;
}

  • 程序设计细节: 

我增加了程序的判断能力(用好if-else if-else结构) 
1、是否需要进行删除操作,通过输入0还是1进行。同理添加操作。 
2、输入的是数字还是其他数字对程序的执行结果不同。

程序测试结果: 
https://img-blog.csdn.net/20180213155303782?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvanVuamllX2Fj/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70  
https://img-blog.csdn.net/20180213155415925?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvanVuamllX2Fj/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70  
https://img-blog.csdn.net/20180213155445366?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvanVuamllX2Fj/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70

谢谢阅览,转载请注明出处。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有