• 浅谈 循环数组


    在我们今后的编程中,可能会遇到这种情况:
    要求给数据链增添数据的同时要删去当前数据链的第一个数据。

    看到这个问题,相信好多同学想到了两种方法:
    1.用链表。因为我们的数据链是变化的,而且改的是第一个数据和最后一个数据。
    首先我对这个想法做一下评价:这种想法是好的,因为它不会像数组一样,浪费极大的空间,但是,这个想法还是有缺陷的,因为我们每增加一个数据,都要改变头指针和增添尾指针,这样下来,十分耗时;
    2.用数组。我们只需定义两个变量和一个数组即可用数组实现上述问题,用一个变量存储第一个有效元素下标,另一个数组存储最后一个有效元素的下标,有新数据要录入时,只需将第一个变量和最后一个变量加一即可。这个想法和第一种方法比起来,是缩短了时间,但是,相对地,消耗了极大的空间,所以,这种方法还是不可取。

    那么,本人现在来提出一种折中方法,那就是我们这篇博文的主题——循环数组

    什么是循环数组呢?
    循环数组的实现方法和我们上述的第二种实现方法类似,但是不会无休止的向有效元素后追加元素,由于我们每次增加元素时都会删去前面的元素,所以我们定义有效元素长度的数组即可,往后追加到末尾时,只需将下一个元素放在数组头即可。

    即:存储数据和删除数据时,分别要将读取的结束下标 和 起始下标 都进行改动。
    这样的话我们可以保证我们的数组空间被充分利用。

    说到这里,相信好多同学都大概知道了大概的实现方法了,还是没有想到实现方法的同学,也不要心急,现在,本人来写一个函数来实现一下循环数组:

    #define MaxLength 80;	//假设数据链最长长度为80
    
    int circularArray(int *arr, int *head, int *tail) {
    	int num;
    	int flag;
    	
    	while(((*head)-(*tail)) < MaxLength) {
    		printf("请输入数据: ");
    		scanf("%d", &num);
    		(*tail) = (*tail)+1 % MaxLength;	//主要是以下三行代码
    		arr[(*tail)] = num;
    		(*head) = (*head)+1 % MaxLength;
    	}
    }
    
    void readTheArray(int *arr; int head; int tail) {
    	int i = head;
    
    	while((++i)%MaxLength != tail) {
    		printf("%d", arr[i]);
    	}
    }
    

    循环数组相比于普通数组的最大优点就是对于数组空间的利用率十分高。

    这就是我们这篇博文的全部内容了,其实相对于这个算法,不适合用一个函数来进行讲解,因为这只是一个使用数组的方法,做成函数的话,灵活性相对而言就降低了。

    大致思想相信同学们都了解了,我们在之后的博文中的另一个项目实训——《贪吃蛇》博文中用到这个算法思想。
    我相信,在那篇博文中,同学们对这个算法思想的理解将会更加深刻了。

  • 相关阅读:
    gojs常用API-画布定义
    页面开发的标准
    iis7.5做反向代理配置方法实例图文教程
    Tomcat实现反向代理
    nodejs的package.json依赖dependencies中 ^ 和 ~ 的区别
    dependencies与devDependencies的区别
    常见的cmd命令
    解决SecureCRT中文显示乱码
    ASP防XSS代码
    Android页面之间进行数据回传
  • 原文地址:https://www.cnblogs.com/codderYouzg/p/12412024.html
Copyright © 2020-2023  润新知