1、线性表

  概念::零个或多个数据元素的有序序列。

  描述:

2、线性表的抽象数据类型:

  ADT线性表

  Data:线性表的数据对象集合为{a1,a2,...,an},每个元素的类型均为DataType。其中除第一个元素a1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素an外,每一个元素有且只有一个直接后继元素,数据元素之间的关系是一对一的关系。

  Operation

  Init(*L):初始化操作,建立一个空的线性表;

  IsEmpty(*L):判断线性表是否为空,若为空,则返回true,否则返回false;

  Clear(*L):清空线性表;

  GetElem(*L,i):返回线性表位置为i的元素;

  LocateElem(*L,e):返回线性表中与元素i相同值的位置;

  Insert(*L,i,e):在线性表i位置插入元素e;

  Delete(*L,i):删除线性表位置i的元素;

  GetLength(*L):获得当前线性表的长度。

endADT

3、线性表的顺序存储结构

  概念:用一段地址连续的存储单元存储线性表的数据元素。

  如图:

    

    算法的C#语言实现

    

  1. /// <summary>
  2. /// 线性表的顺序存储结构
  3. /// </summary>
  4. public class SequentialStorageLinearList<T>
  5. {
  6. //最大存放数量
  7. private int _maxLength;
  8.  
  9. /// <summary>
  10. /// 最大存储数量
  11. /// </summary>
  12. public int MaxLength
  13. {
  14. get
  15. {
  16. return _maxLength;
  17. }
  18. }
  19.  
  20. // 当前存放位置
  21. private int _currentLength;
  22.  
  23. private T[] _LinearList;
  24.  
  25. //利用构造函数创建一个数组,用来存放数据
  26. public SequentialStorageLinearList(int maxLength)
  27. {
  28. if (maxLength <= 0)
  29. throw new Exception("The length can not be less than zero.");
  30. _maxLength = maxLength;
  31. _currentLength = 0;
  32. _LinearList = new T[_maxLength];
  33. }
  34.  
  35. /// <summary>
  36. /// 判断线性表是否为空
  37. /// </summary>
  38. /// <returns></returns>
  39. public bool IsEmpty()
  40. {
  41. return _currentLength == 0;
  42. }
  43.  
  44. /// <summary>
  45. /// 清空所有的元素
  46. /// </summary>
  47. public void ClearAll()
  48. {
  49. if (_currentLength > 0)
  50. {
  51. /*
  52. * 在高级语言.net中,我们可以重新创建一个新的数组,将其指向当前的_linearList
  53. *由于是托管代码,资源不需要手动释放,会自动释放
  54. *但是在c语言中,我们需要手动的释放其占用的空间(free)
  55. */
  56. _LinearList = new T[0];
  57. }
  58. }
  59.  
  60. /// <summary>
  61. /// 根据
  62. /// </summary>
  63. /// <param name="i"></param>
  64. /// <returns></returns>
  65. public T GetElement(int i)
  66. {
  67. if (_currentLength == 0 || _currentLength < i || i < 1)
  68. throw new Exception("Not find any Element.");
  69. T t = _LinearList[i];
  70. return t;
  71. }
  72.  
  73. /// <summary>
  74. /// 查找数据中是否存在元素e
  75. /// </summary>
  76. /// <param name="e"></param>
  77. /// <returns></returns>
  78. public int IndexOf(T e)
  79. {
  80. if (_currentLength == 0)
  81. throw new Exception("The array is empty.");
  82. for (int i = 0; i < _currentLength; i++)
  83. {
  84. T t = _LinearList[i];
  85. /*
  86. * T可能是引用类型,我们暂时的比较方式,不考虑重写equals
  87. */
  88. if (t.Equals(e))
  89. {
  90. return i;
  91. }
  92. }
  93. return -1;
  94. }
  95.  
  96. /// <summary>
  97. /// 在位置i处插入元素e
  98. /// </summary>
  99. /// <param name="e">待插入的元素e</param>
  100. /// <param name="i">插入位置i</param>
  101. public void Insert(T e, int i)
  102. {
  103. //数组已经存满
  104. if (_currentLength == _maxLength)
  105. throw new Exception("The array is full.");
  106. //当i位置不在范围内
  107. if (i < 1 || i > _currentLength + 1)
  108. throw new Exception("The location is illegal.");
  109. //若插入的数据不在表尾,在需要移动插入位置后面的数据一位
  110. if (i <= _currentLength - 1)
  111. {
  112. for (int j = _currentLength - 1; j > i; j--)
  113. {
  114. _LinearList[j + 1] = _LinearList[j];
  115. }
  116. }
  117. _LinearList[i - 1] = e;
  118. _currentLength++;
  119. }
  120.  
  121. /// <summary>
  122. /// 删除位置i处的元素
  123. /// </summary>
  124. /// <param name="i">位置i</param>
  125. public void Delete(int i)
  126. {
  127. if (_currentLength == 0)
  128. throw new Exception("The array is Empty.");
  129. if (i < 1 || i > _currentLength)
  130. throw new Exception("The location is illegal.");
  131. //删除位置i元素后需要将i后面的元素依次递增一位
  132. if (i < _currentLength)
  133. {
  134. for (int k = k-1; k < _currentLength; k++)
  135. {
  136. _LinearList[k - 1] = _LinearList[k];
  137. }
  138. }
  139. _currentLength--;
  140. }
  141. }

4、线性表的链式存储结构

  数据域:存储数据元素信息的域;

  指针域:存储直接后继位置的域;

  节点(Node):由数据域和指针域组成的数据元素ai的存储映像;

  我们把由n个节点链结成一个链表,即为线性表的链式存储结构。

  如图:

    

5、单链表

  链表的每个将结点中只包含一个指针域,我们称为单链表。同时我们把链表中第  一个结点的存储位置称为头指针。同时在链表的第一个结点前附设一个结点,称  为头结点。

  单链表的C#实现:

  

  1. /// <summary>
  2. /// 单链表的实现
  3. /// </summary>
  4. /// <typeparam name="T"></typeparam>
  5. public class SingleNode<T>
  6. {
  7. /// <summary>
  8. /// 序号
  9. /// </summary>
  10. public int Index { get; private set; }
  11.  
  12. /// <summary>
  13. /// 头指针
  14. /// </summary>
  15. public SingleNode<T> HeadNode { get; private set; }
  16.  
  17. /// <summary>
  18. /// 指针域
  19. /// </summary>
  20. public SingleNode<T> NextNode { get; set; }
  21.  
  22. /// <summary>
  23. /// 数据域
  24. /// </summary>
  25. public T Data { get; set; }
  26.  
  27. public SingleNode()
  28. {
  29. HeadNode = new SingleNode<T>();
  30. Index = ;
  31. NextNode = null;
  32. }
  33.  
  34. public SingleNode(T t)
  35. {
  36. Data = t;
  37. NextNode = null;
  38. }
  39.  
  40. /// <summary>
  41. /// 判断单链表是否为空
  42. /// </summary>
  43. /// <returns></returns>
  44. public bool IsEmpty()
  45. {
  46. return Index == ;
  47. }
  48.  
  49. /// <summary>
  50. /// 清空所有的元素
  51. /// </summary>
  52. public void ClearAll()
  53. {
  54. if (Index > )
  55. {
  56. NextNode = null;
  57. Data = default(T);
  58. Index = ;
  59. }
  60. }
  61.  
  62. /// <summary>
  63. /// 获得位置为i的元素
  64. /// </summary>
  65. /// <param name="i"></param>
  66. /// <returns></returns>
  67. public SingleNode<T> GetElement(int i)
  68. {
  69. if (Index == || Index < i || i < )
  70. throw new Exception("Not find any Element.");
  71. SingleNode<T> head = HeadNode;
  72. SingleNode<T> next;
  73. for (int k = ; k < Index; k++)
  74. {
  75. next = head.NextNode;
  76. if (next.Index == i)
  77. {
  78. return next;
  79. }
  80. head = next.NextNode;
  81. }
  82. return null;
  83. }
  84.  
  85. /// <summary>
  86. /// 查找数据中是否存在元素e
  87. /// </summary>
  88. /// <param name="e"></param>
  89. /// <returns></returns>
  90. public int IndexOf(T e)
  91. {
  92. if (Index == )
  93. throw new Exception("The array is empty.");
  94. SingleNode<T> head = HeadNode;
  95. SingleNode<T> next;
  96. for (int k = ; k < Index; k++)
  97. {
  98. next = head.NextNode;
  99. if (next.Equals(e))
  100. {
  101. return next.Index;
  102. }
  103. head = next.NextNode;
  104. }
  105. return -;
  106. }
  107.  
  108. /// <summary>
  109. /// 在位置i处插入元素e
  110. /// </summary>
  111. /// <param name="e">待插入的元素e</param>
  112. /// <param name="i">插入位置i</param>
  113. public void Insert(T t, int i)
  114. {
  115. /*
  116. *1.先判断i是否存在
  117. *2.若存在则创建一个空节点,将值t赋给该空节点
  118. *3.修改该节点的前驱和后继节点
  119. */
  120. if (i < || i > Index)
  121. throw new Exception("The location is illegal.");
  122. //获得当前位置i的节点
  123. var preNode = GetElement(i);
  124.  
  125. //创建空节点
  126. SingleNode<T> currentNode = new SingleNode<T>(t);
  127.  
  128. //修改前驱节点指向当前节点
  129. var nextNode = preNode.NextNode;
  130. preNode.NextNode = currentNode;
  131.  
  132. //将新节点的后继节点修改
  133. currentNode.NextNode = nextNode;
  134.  
  135. Index++;
  136. }
  137.  
  138. /// <summary>
  139. /// 删除位置i处的元素
  140. /// </summary>
  141. /// <param name="i">位置i</param>
  142. public void Delete(int i)
  143. {
  144. /*
  145. *1.查找位置为i的节点
  146. *2.修改节点的前继节点为查找节点的下一节点
  147. */
  148. //获得当前位置i-1的节点
  149. if (i < || i > Index)
  150. throw new Exception("The location is illegal.");
  151. var preNode = GetElement(i - );
  152. var nextNextNode = preNode.NextNode.NextNode;
  153. preNode.NextNode = nextNextNode;
  154. Index--;
  155. }
  156. }
 

6、循环链表

  将单链表中终端节点的指针端由空指针改为指向头节点,这样整个单链表就成为了一个环,这种头尾相接的单链表称为单循环链表。

  如图:

    

  实现代码类似与单链表。

7、双向链表

  在单链表的每个节点中,再设置一个指向其前驱节点的指针,从而形成的链表,我们称为双向链表。

  如图:

    

  C#代码实现:

  

8、链表和线性表的优缺点比较

    如图:

      

9、参考资料:

   单链表的19种操作: http://www.cnblogs.com/lifuqing/archive/2011/08/20/List.html

    单链表的C#实现:http://www.cnblogs.com/linzheng/news/2011/07/14/2106173.html

第三章 线性表(C#实现)的更多相关文章

  1. 《数据结构与算法分析:C语言描述》复习——第三章“线性表、栈和队列”——双向链表

    2014.06.14 20:17 简介: 双向链表是LRU Cache中要用到的基本结构,每个链表节点左右分别指向上一个和下一个节点,能够自由地左右遍历. 图示: 实现: // My implemen ...

  2. HTML第三章:表单

    第三章:表单 表单标签form:<form></form>//相当于一张记录用户信息的单子    常用属性:method:表单的提交方式,常用的值有两个             ...

  3. 数据结构(c语言版,严蔚敏)第2章线性表

    弟2章线性表

  4. [数据结构 - 第3章] 线性表之双向链表(C语言实现)

    一.什么是双向链表? 双向链表(double linked list)是在单链表的每个结点中,再设置一个指向其前驱结点的指针域.所以在双向链表中的结点都有两个指针域,一个指向直接后继,另一个指向直接前 ...

  5. 《SQL CookBook 》笔记-第三章-多表查询

    目录 3.1 叠加两个行集 3.2 合并相关行 3.3 查找两个表中相同的行 3.4 查找只存在于一个表中的数据 3.5 从一个表检索与另一个表不相关的行 3.6 新增连接查询而不影响其他连接查询 3 ...

  6. [数据结构 - 第3章] 线性表之单链表(C++实现)

    一.类定义 单链表类的定义如下: #ifndef SIGNALLIST_H #define SIGNALLIST_H typedef int ElemType; /* "ElemType类型 ...

  7. 第2章 线性表《C#数据结构和算法》

    ( )除第一个位置的数据 元素外,其它数据元素位置的前面都只有一个数据元素:( )除最后一个位置的 数据元素外,其它数据元素位置的后面都只有一个元素.也就是说,数据元素是 一个接一个的排列.因此,可以 ...

  8. 数据结构(C语言版)-第2章 线性表

    #define MAXSIZE 100 //最大长度 typedef struct { ElemType *elem; //指向数据元素的基地址 int length; //线性表的当前长度 }SqL ...

  9. 《数据结构与STL-第二章 线性表》读书笔记

    线性表 定义 线性表(linear list)是由零个或多个相同类型的数据元素构成的有限序列. 存储结构 顺序存储 最简单的存储方法是顺序存储法,即把线性表的数据元素按照逻辑次序顺序地放在一组地址连续 ...

随机推荐

  1. GWT工程 —— HostedMode(宿主模式下调试) 所有的运行命令

    Unknown argument: -helpGoogle Web Toolkit 1.7.0HostedMode [-noserver] [-port port-number | "aut ...

  2. virtualBox文件共享

    具体过程,可以参考: http://jingyan.baidu.com/article/2fb0ba40541a5900f2ec5f07.html 共享命令:sudo mount -t vboxsf ...

  3. 对Java的Map的Value字段进行排序

    构造TreeMap可以指定Comparator,但是不能对value字段进行排序.如果有需求对Value字段排序,例如map存放的是单词,单词出现次数,怎么按单词次数排序呢? 可以先将map中的key ...

  4. String字符串需要掌握的几个问题

    一.两种定义方式的区别: String str = "hello";      先在堆内存中查找是否已经有"hello",若有,将str指向已存在的它即可:若堆 ...

  5. <转>四个重要属性——Action、Data、Category、Extras

    Intent作为联系各Activity之间的纽带,其作用并不仅仅只限于简单的数据传递.通过其自带的属性,其实可以方便的完成很多较为复杂的操作.例如直接调用拨号功能.直接自动调用合适的程序打开不同类型的 ...

  6. JavaScript最全的10种跨域共享的方法

    在客户端编程语言中,如javascript和ActionScript,同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意义.同源策略规定跨域之间的脚本是隔离的,一个域的脚本不能访问和 ...

  7. poj 3270 置换

    poj 置换的应用 黑书原题P248 /** 题意: 给定序列, 将其按升序排列, 每次交换的代价是两个数之和, 问代价最小是多少 思路:1.对于同一个循环节之内的,肯定是最小的与别的交换代价最小 2 ...

  8. 求模和求余(附加C语言实现)

    求模和求余的总体计算步骤如下: 1.求整数商  c = a/b 2.计算模或者余数 r = a - c*b 求模和求余的第一步不同,求余在取c的值时向0方向舍入;取模在计算c的值时向无穷小方向舍入. ...

  9. linux 定时执行任务

    测试可以了,做个笔记 系统是centos 6.3 1,直接命令 crontab -e 编辑文件,里面写时间和你想要执行的命令. 例子 */1 * * * * sh /home/guanliyang/t ...

  10. Nancy之实现API

    Nancy之实现API的功能 0x01.前言 现阶段,用来实现API的可能大部分用的是ASP.NET Web API或者是ASP.NET MVC,毕竟是微软官方出产的,用的人也多. 但是呢,Nancy ...