用C#学习数据结构之链表
2016-03-21 21:40
495 查看
单链表的定义
链表是用一组任意的存储单元来存储线性表中的数据元素(这组存储单元可以是连续的,也可以是不连续的)。那么,怎么表示两个数据元素逻辑上的相邻关系呢?即如何表示数据元素之间的线性关系呢?为此,在存储数据元素时,除了存储数据元素本身的信息外,还要存储与它相邻的数据元素的存储地址信息。这两部分信息组成该数据元素的存储映像(Image),称为结点(Node)。把存储据元素本身信息的域叫结点的数据域(Data Domain),把存储与它相邻的数据元素的存储地址信息的域叫结点的引用域(Reference Domain)。因此,线性表通过每个结点的引用域形成了一根“链条”,这就是“链表”名称的由来。
如果结点的引用域只存储该结点直接后继结点的存储地址,则该链表叫单链表(Singly Linked List)。把该引用域叫next。单链表结点的结构如图所示,图中data表示结点的数据域。
![](http://images2015.cnblogs.com/blog/628048/201603/628048-20160321211636323-1623716084.png)
单链表的结点结构
单链表结点类的实现
![](http://images2015.cnblogs.com/blog/628048/201603/628048-20160321212801511-641394356.png)
链式存储结构
通常,我们把链表画成用箭头相连接的结点的序列,结点间的箭头表示引用域中存储的地址
![](http://images2015.cnblogs.com/blog/628048/201603/628048-20160321212935589-1762202109.png)
单链表类LinkList<T>的实现说明如下所示
链表是用一组任意的存储单元来存储线性表中的数据元素(这组存储单元可以是连续的,也可以是不连续的)。那么,怎么表示两个数据元素逻辑上的相邻关系呢?即如何表示数据元素之间的线性关系呢?为此,在存储数据元素时,除了存储数据元素本身的信息外,还要存储与它相邻的数据元素的存储地址信息。这两部分信息组成该数据元素的存储映像(Image),称为结点(Node)。把存储据元素本身信息的域叫结点的数据域(Data Domain),把存储与它相邻的数据元素的存储地址信息的域叫结点的引用域(Reference Domain)。因此,线性表通过每个结点的引用域形成了一根“链条”,这就是“链表”名称的由来。
如果结点的引用域只存储该结点直接后继结点的存储地址,则该链表叫单链表(Singly Linked List)。把该引用域叫next。单链表结点的结构如图所示,图中data表示结点的数据域。
![](http://images2015.cnblogs.com/blog/628048/201603/628048-20160321211636323-1623716084.png)
单链表的结点结构
单链表结点类的实现
public class Node<T> { private T data; //数据域 private Node<T> next; //引用域 //构造器 public Node(T val, Node<T> p) { data = val; next = p; } //构造器 public Node(Node<T> p) { next = p; } //构造器 public Node(T val) { data = val; next = null; } //构造器 public Node() { data = default(T); next = null; } //数据域属性 public T Data { get { return data; } set { data = value; } } //引用域属性 public Node<T> Next { get { return next; } set { next = value; } } }
![](http://images2015.cnblogs.com/blog/628048/201603/628048-20160321212801511-641394356.png)
链式存储结构
通常,我们把链表画成用箭头相连接的结点的序列,结点间的箭头表示引用域中存储的地址
![](http://images2015.cnblogs.com/blog/628048/201603/628048-20160321212935589-1762202109.png)
单链表类LinkList<T>的实现说明如下所示
public class LinkList<T> : IListDS<T> { private Node<T> head; //单链表的头引用 //头引用属性 public Node<T> Head { get { return head; } set { head = value; } } //构造器 public LinkList() { head = null; } //求单链表的长度 public int GetLength() { Node<T> p = head; int len = 0; while (p != null) { ++len; p = p.Next; } return len; } //清空单链表 public void Clear() { head = null; } //判断单链表是否为空 public bool IsEmpty() { if (head == null) { return true; } else { return false; } } //在单链表的末尾添加新元素 public void Append(T item) { Node<T> q = new Node<T>(item); Node<T> p = new Node<T>(); if (head == null) { head = q; return; } p = head; while (p.Next != null) { p = p.Next; } p.Next = q; } //在单链表的第i个结点的位置前插入一个值为item的结点 public void Insert(T item, int i) { if (IsEmpty() || i < 1) { Console.WriteLine("List is empty or Position is error!"); return; } if (i == 1) { Node<T> q = new Node<T>(item); q.Next = head; head = q; return; } Node<T> p = head; Node<T> r = new Node<T>(); int j = 1; while (p.Next != null && j < i) { r = p; p = p.Next; ++j; } if (j == i) { Node<T> q = new Node<T>(item); q.Next = p; r.Next = q; } } //在单链表的第i个结点的位置后插入一个值为item的结点 public void InsertPost(T item, int i) { if (IsEmpty() || i < 1) { Console.WriteLine("List is empty or Position is error!"); return; } if (i == 1) { Node<T> q = new Node<T>(item); q.Next = head.Next; head.Next = q; return; } Node<T> p = head; int j = 1; while (p != null && j < i) { p = p.Next; ++j; } if (j == i) { Node<T> q = new Node<T>(item); q.Next = p.Next; p.Next = q; } } //删除单链表的第i个结点 public T Delete(int i) { if (IsEmpty() || i < 0) { Console.WriteLine("Link is empty or Position is error!"); return default(T); } Node<T> q = new Node<T>(); if (i == 1) { q = head; head = head.Next; return q.Data; } Node<T> p = head; int j = 1; while (p.Next != null && j < i) { ++j; q = p; p = p.Next; } if (j == i) { q.Next = p.Next; return p.Data; } else { Console.WriteLine("The ith node is not exist!"); return default(T); } } //获得单链表的第i个数据元素 public T GetElem(int i) { if (IsEmpty()) { Console.WriteLine("List is empty!"); return default(T); } Node<T> p = new Node<T>(); p = head; int j = 1; while (p.Next != null && j < i) { ++j; p = p.Next; } if (j == i) { return p.Data; } else { Console.WriteLine("The ith node is not exist!"); return default(T); } } //在单链表中查找值为value的结点 public int Locate(T value) { if (IsEmpty()) { Console.WriteLine("List is Empty!"); return -1; } Node<T> p = new Node<T>(); p = head; int i = 1; while (!p.Data.Equals(value) && p.Next != null) { p = p.Next; ++i; } return i; } }
相关文章推荐
- 数据结构队列C++代码实现
- 数据结构——顺序表初操作
- 数据结构基础 字符串相似度与最长公共子序列
- 数据结构 队列
- 数据结构 - 简单的顺序表结构
- 数据结构 - 回文和分离数字
- 将两个线性链表归并为一个有序链表
- HDU 3336 数据结构之KMP
- 数据结构7-图
- 计算数组长度引发的一些问题
- 十大排序算法
- 数据结构(java语言描述)递归实现——汉诺塔问题
- 2016年数据结构:顺序表的使用
- 数据结构之单链表操作
- 数据结构之顺序表操作
- Python 数据结构与算法——从二分图到寻找最大排列(Maximum Permutation)
- 数据结构学习笔记01链表
- 数据结构课设 打印选课学生名单 。。
- 数据结构课设 打印学生选课清单 (Hash)
- Python 数据结构与算法——选择排序(迭代版、递归版)