zoukankan      html  css  js  c++  java
  • 循环链表中计算下标的简单算法

    今天我在写一个项目的时候突然遇到了一个问题,于是想起以前的数据结构,可是公式我忘了,推到了半节课,当初没有好好学,太难,那本书简直就是天书,不过里面的东西却非常实用。今天就拿出其中一个算法来玩玩,这是从单项循环链表中提取而来的。

     这个项目是用来切换图片,上一张,下一张。我把这些图片读到内存,用数组保存,数组下标用index变量来保存。


     图片
    显然下标的范围是:0,1,2,3,4(只有五张图)

    图片
    0->4这个方向表示上一张;每单击一次“上一张”按钮index就加一
    4->0这个方向表示下一张;每单击一次“下一张”按钮index就减一
    显然当index等于 4时,单击上一张,index就变成了5,而数组的下标最大为4。
    显然当index等于 0时,单击下一张,index就变成了-1,而数组的下标最小为0。

    有一个很简单的处理办法就是:(但是这个办法很low)
    每次单击上一张的的时候判断index的值,如果index等于5就使index等于0
    每次单击下一张的的时候判断index的值,如果index等于-1就使index等于4

    于是这个结构就变成了循环链表:
    图片
    图画的有点丑,自行脑补。


    可见这是一个循环的。
    于是我推出了一个公式:说明本公式适用于下标从0开始。
    假设:数组下标从0开始,最大下标为max,数组长度为length(length==max+1)并定义从0到max方向移动为正方向。指针用Index表示。
    正方向移动:index=(length+ (++index))%length;或者index=(++index)%length;
    负方向移动:index=(length + (--index))%length;
    可见一个数学表达式可以替代一个逻辑判断,算法效率并没有降低。

    (想要理解公式,展开推到,不要把这个结构看成直线,而是一个圆环)
    说明:
    假设max=4;也就是说这个数组长度为5,下标范围[0,4]。
    重点分析:
    当Index等于4的时候,向正方向移动(++index)
    当index等于0的时候,向负方向移动(--index)

    当index=4的时候,指针指向最后一个元素,此时将指针向正方向移动,指针的值index应等于0
    正方向公式:index=(5 + ++index)%5,化简:(5+5)%5,展开:5%5+5%5=0,good
    当index=0的时候,指针指向第一个元素,此时将指针向负方向移动,指针的值index应等于4
    负方向公式:index=(5 + --index)%5,化简:(5-1)%5,展开:4%5=4,good 

    C语言描述:

    图片

    图片

  • 相关阅读:
    关于C++中如何判断文件,目录存在的若干方法
    AStyle2.02在VS2008下的使用
    opencv与wxwidgets冲突(第三方库jpeg,tiff,png,zlib所引起)
    C和C++获取文件大小的方法总结
    跨平台项目组织2
    md5函数C语言实现
    分享本人自编的一个跨平台项目:伙食管理小软件
    win7 vs2008 release mt.exe停止工作
    跨平台项目组织
    SQL注入语句 (很全)
  • 原文地址:https://www.cnblogs.com/chaeyeon/p/7068428.html
Copyright © 2011-2022 走看看