• [数据结构]C#基于数组实现泛型顺序表


    前方预警,只完成了顺序表的插入/删除/查找。

    错误代码示例:

     1         /// <summary>
     2         /// 查找顺序表第i个位置的元素
     3         /// 在显示情况中,我们更常用下标
     4         /// </summary>
     5         /// <param name="i"></param>
     6         /// <returns></returns>
     7         public T GetElemByIndex(int i)
     8         {
     9             //T temp = ;
    10             if (data.Length == 0)
    11             {
    12                 //throw new IndexOutOfRangeException("索引超出顺序表范围");
    13                 throw new NullReferenceException("顺序表为空");
    14             }
    15             else if (i < 1 || i > Length + 1)
    16             {
    17                 throw new IndexOutOfRangeException("索引超出顺序表范围");
    18             }
    19             else
    20             {
    21                 return data[i-1];
    22             }
    23         }
    查找制定位置的元素

     注意在代码中,返回值没有按照数据结构课本的方式,返回Status,因为用户调用方法,就是要获取返回值的,用ref的方式反而不好使用,感觉怪怪的。

     另外,在非法调用时,也不是通过cw的方式提醒用户出错,而是采用直接抛出异常的方式,数组是否越界这些判断理应放权给用户。

     还有,从代表中,我们发现,不返回值,而是抛出异常,编译任然会通过。

    正确代码示例:

    if (Length == 0)
    {
          throw new NullReferenceException("顺序表为空");
    }    
    

    判断顺序表是否为空时,不能用data.Length属性,因为该属性值不是顺序表的大小,而是数组的大小,永远为MaxSize;而Length表示线性表的长度;

     1 //插入
     2 for (int j = Length - 1; j >= i - 1; j--)
     3 {
     4         data[j + 1] = data[j];
     5 }
     6             
     7 
     8 //删除
     9 for (int j = i; j < Length; j++)
    10 {
    11                 data[j - 1] = data[j];
    12  }

    注意思维模式的改变,之前无论是删除元素,还是修改元素,都和数据结构课本中的思路不一致,事实证明,课本中的思路是清晰的。需要处理那些元素,注意是数组中的那些元素,那么j就初始化为要处理的第一个元素下标,然后判断边界条件。

  • 相关阅读:
    MySQL 中视图和表的区别以及联系是什么?
    MAC将根目录文件夹的权限赋给用户
    PHP 基础篇 PHP 中 DES 加解密详解
    软件构架师必修科(转)
    遍历指定文件夹下所有的xml文件并动态生成HTML页面!
    使用XML创建Excel文档
    XmlTextWriter创建XML文件
    什么是耦合?
    JavaScript经典效果集锦(一)
    软件最大的追求是什么?
  • 原文地址:https://www.cnblogs.com/SharpL/p/4451683.html
Copyright © 2020-2023  润新知