c#数据结构——单链表
来源:互联网 发布:雾霾吸入 知乎 编辑:程序博客网 时间:2024/06/13 19:40
单链表
1.单链表的存储特点是 链式存储,顺序表的缺点是插入和删除元素很麻烦,因为它要移动很多元素,但查找很方便。单链表 等链式表失去了顺序表的随机存储的特点,但是修改链表很方便.
2顺序表.随机存储:找顺序表某一个元素所花的时间都一样,链表要想知道这个其中一个元素,比如知道上一个元素的位置,就不是随机存储.
3.单链表 每一个元素是由结点组成,结点分为data(数据)和next(下一个元素的地址)两部分.
单链表的实现
1.创建一个node 存放结点的信息. h 头结点只有地址。c# 语言可以使用指针,但我们这里使用引用类型实现。
public class MyNode<T> { private T data;//数据 private MyNode<T> next;//下一个元素地址 //属性因为要在外部赋值 public T Data { get { return data;} set { data = value; } } public MyNode() { next = null; data = default(T); } public MyNode<T> Next { get { return next;} set {next= value; } } public MyNode(T a) //只有数据部分,尾结点的情况 { data = a; next = null; } public MyNode(MyNode<T> pNode) { next = pNode; data = default(T);//T是引用返回null,值返回0; } public MyNode(T a,MyNode<T> pNode ) { this.data = a; this.Next = pNode; } }2.实现单链表的方法 链表名LinkList
public class LinkList<T> : IMyList<T> { private MyNode<T> headNode;//头结点 public LinkList() { headNode = null; //headNode为空表示这个单链表是空的 } public int GetLength() { if (headNode == null) return 0; else { MyNode<T> temp = headNode; int count = 1; while (true) { if (temp.Next == null) { break; } count++; temp = temp.Next; } return count; } } public void Clear() { headNode = null; } public bool IsEmpty() { if (headNode == null) return true; else { return false; } } public void Add(T item) { MyNode<T> temp = new MyNode<T>(item);//存储添加的元素 if (headNode == null) { headNode = temp;// 此时count=1,有一个元素 } else { MyNode<T> pNode = headNode; while (true) { if (pNode.Next == null) { headNode.Next = temp; break;//否则会报错,nullexcpation当你访问null的对象 } pNode = pNode.Next; } pNode.Next = temp; } } public void Insert(T item, int index)//要约束index; { MyNode<T> tempNode=new MyNode<T>(item); if (index==0) { //tempNode.Next = headNode.Next; //headNode.Next = tempNode;也可以使用这个 tempNode = headNode; headNode.Next = tempNode; } else { if(index>=GetLength()) throw new IndexOutOfRangeException("索引超出异常"); MyNode<T> currentNode = headNode; for (int i = 1; i <= index; i++) { if (currentNode.Next == null)//说明current显示在尾结点 { currentNode.Next = tempNode; break; } currentNode = currentNode.Next; } tempNode.Next = currentNode.Next; currentNode.Next = tempNode; } } public T Delete(int index) { T a; if (IsEmpty()) throw new Exception("为空还操作你妹");//表示为空不能删 if (index == 0)//删除了head结点,head 向后移 { a = headNode.Data; headNode = headNode.Next; } else { if (index >= GetLength()) throw new IndexOutOfRangeException("索引超出异常"); MyNode<T> currentNode = headNode; for (int i = 1; i <= index - 1; i++) { if (currentNode.Next.Next == null)//说明current到达尾结点 { a = currentNode.Next.Data; currentNode.Next = null; return a; } currentNode = currentNode.Next; } a = currentNode.Next.Data; currentNode.Next = currentNode.Next.Next; } return a; } public T GetElement(int index) { T a; if (IsEmpty()) throw new Exception("为空还操作你妹");//表示为空不能操作 if (index == 0)//删除了head结点,head 向后移 { a = headNode.Data; } else { if (index >= GetLength()) throw new IndexOutOfRangeException("索引超出异常"); MyNode<T> currentNode = headNode; for (int i = 1; i <= index - 1; i++) { if (currentNode.Next.Next == null)//说明current到达尾结点 { break; } currentNode = currentNode.Next; } a = currentNode.Next.Data; } return a; } public void ShowData() { MyNode<T> temp = headNode; while (true) { Console.Write(temp.Data+"\t"); if (temp.Next == null) { break; } temp = temp.Next; } } }
双向链表和循环链表
1.双向链表 就是 有一个前地址和后地址
2.循环链表就是 尾结点指向头结点 ,当头结点头尾相连就是空表
阅读全文
0 0
- c#数据结构——单链表
- c#数据结构学习——单链表
- c#数据结构——栈
- c#数据结构——队列
- C#版数据结构——冒泡排序
- C#版数据结构——插入排序
- c#数据结构学习——顺序表
- c#数据结构——顺序表
- C#数据结构回顾之单链表
- JAVA与C#对照学习系列 —— 数据结构
- C#版数据结构——简单选择排序
- 数据结构C#类库(1)——顺序表
- c# 数据结构
- c#数据结构
- 数据结构C#
- c#数据结构
- C# 数据结构
- C#数据结构
- for循环中进行Promise异步操作的问题总结
- Matlab保存图像的方法总结
- POJ 2376 Cleaning Shifts
- 多个相同classname的控件中查找子控件(父控件text、resource-id为空,classname不是唯一...)
- Java多线程之线程返回值
- c#数据结构——单链表
- Spring Boot学习笔记----Schedule
- SQL入门 7 8 9 10 11 12 从查询中获得有效的结果
- LayaAir 自转的小球围绕着鼠标转动
- J作业
- open-falcon
- 网络知识学习
- 简单资源管理器
- spring boot