C#链表:一个简单实现
来源:互联网 发布:佳音简谱软件注册码 编辑:程序博客网 时间:2024/05/29 17:04
C#自带了泛型的链表类,在很多情况之下够用。遇到实际应用时,最好引用C#的链表类,封装成自己需要的类。
作为探索链表基本实现原理尝试实现了几个简单的方法。
一、(Node.cs文件)作为链表节点的类,将它封装在了链表类的内部。原因是客户在使用链表时不需要关注链表的节点类型。
<span style="font-family:Courier New;">using System;namespace LinkListTrial0._2{ partial class MyLinkedList<T> { class Node<DataType>:IComparable<DataType>,IEquatable<DataType> where DataType:IComparable { DataType data; Node<DataType> next; public Node<DataType> Next { get { return this.next; } set { this.next = value; } } public Node(DataType data) { this.data = data; this.next = null; } // 比较接口的实现,直接比较链表节点与数据 public int CompareTo(DataType obj) { DataType objData = (DataType)obj; return this.data.CompareTo(objData); } // 相等接口的实现,直接比较链表节点与数据 public bool Equals(DataType to_compare) { return this.data.Equals(to_compare); } // 打印数据 public override string ToString() { // TODO:可以加一些打印链接的创意 return this.data.ToString(); } } } }</span>
二、(MyLinkedList.cs文件)实现简单链表的类,存放实现链表的主要逻辑。主要目的是实现简单链表的增加和删除逻辑。
<span style="font-family:Courier New;">using System;namespace LinkListTrial0._2{ partial class MyLinkedList<T> where T:IComparable { Node<T> Head; public MyLinkedList() { // 在链表头部放置一个虚拟节点,简化逻辑 Node<T> dummy = new Node<T>(default(T)); this.Head =dummy; } public void AddAscend(T to_add) { Node<T> currentNode = Head; Node<T> nextNode; // 升序排列数据 for ( nextNode = currentNode.Next ; nextNode!=null && nextNode.CompareTo(to_add) < 0; ) { currentNode = nextNode; nextNode = currentNode.Next; } // 忽略重复数据 if (nextNode!=null && nextNode.Equals(to_add)) { return; } // 插入新来的非重复数据 Node<T> toaddNode = new Node<T>(to_add); currentNode.Next = toaddNode; toaddNode.Next = nextNode; } public void Delete(T to_delete) { Node<T> currentNode = Head; Node<T> nextNode; // 检测所有数据是否与待删除的数据相等 for (nextNode=currentNode.Next;!( nextNode==null || nextNode.Equals(to_delete)); ) { currentNode = nextNode; nextNode = currentNode.Next; } // 从中间删除数据 if (nextNode != null) { currentNode.Next = nextNode.Next; } } public void Clear() { // 清空所有数据 this.Head.Next = null; } public void PrintAll() { Node<T> currentNode = Head; Node<T> nextNode; for (nextNode=currentNode.Next; nextNode!=null; ) { Console.WriteLine(nextNode.ToString()); currentNode = nextNode; nextNode = currentNode.Next; } } }}</span>
三、(Program.cs文件)简单的测试程序。
<span style="font-family:Courier New;">using System;namespace LinkListTrial0._2{ class Program { static void Main(string[] args) { MyLinkedList<int> list = new MyLinkedList<int>(); list.Clear(); list.AddAscend(1); list.AddAscend(6); list.AddAscend(1); list.AddAscend(3); list.AddAscend(4); list.AddAscend(2); list.AddAscend(5); list.AddAscend(6); list.PrintAll(); Console.WriteLine("----------------------------------------------"); list.Delete(6); list.Delete(7); list.PrintAll(); Console.ReadLine(); } }}</span>
1、实现了简单的列表。
2、没有考虑性能的因素。
3、数据是相对固定的,应该根据使用情况灵活调整数据结构。
0 0
- C#链表:一个简单实现
- C#一个简单报表实现
- c#简单实现一个螺旋数组
- C#实现一个简单的HTTP服务器
- C#实现一个简单的HTTP服务器
- C#实现一个简单的HTTP服务器
- C#实现一个简单的 Restful Service
- C#实现一个简单链表
- 学习:C#实现一个简单的爬虫
- C#实现一个简单的定时任务
- 一个用C#实现的简单http server
- 一个用C#实现的简单http server(转)
- c#来实现一个简单的链表
- c#实现的一个简单的FTP客户端
- C#实现一个最简单的HTTP服务器
- C#实现一个最简单的HTTP服务器
- C#实现一个最简单的HTTP服务器
- C#异步:实现一个最简单的异步
- BIT Template
- 微软Visual Studio 2015 CTP1出来了赶快体验了及对它的期望
- jquery实现无刷新提交表单
- Apple Swift编程语言入门教程
- JAVA实现的异步redis客户端
- C#链表:一个简单实现
- 泛型中<T>的使用
- 初步了解的J2EE
- Eclipse插件开发之TreeViewer
- 关于随机函数的小应用
- GetWindowRect和GetClientRect
- 士兵队列训练问题
- 【Hibernate学习】——持久化对象的三种状态
- Swift初探一