C#实现单向链表
来源:互联网 发布:网络英语学习平台 编辑:程序博客网 时间:2024/06/05 23:45
链表是一种线性数据结构,使用它能动态地存储一种结构数据。链表是n个数据元素的有限序列,其元素需要自己定义,既可以是一个整数或一个字符串。在计算机程序设计中,经常使用链表。
一、技术要点:
链表是一种重要的数据结构,该结构由节点组成。每个节点包含两部分数据,第一部分是节点本身的数据,第二部分是指向下一个节点的指针。对于单向链表,链表中存在两个特殊的节点,分别为“头结点”和“尾节点”。头结点本身没有数据,只存储下一个节点的指针,尾节点只存储数据。
下面是设计的一个节点类,代码如下:
public class ListNode { public ListNode(int NewValue) { Value = NewValue; } public ListNode Previous; public ListNode Next; public int Value; }其中,私有成员Value用于存储节点本身的数据,Next用于存储下一个节点的指针,Previous用于存储上一个节点的指针。对于链表的操作,无非是进行节点的查找、插入和删除。
1) 查找节点
在进行节点查找时,通常根据节点的数据查找节点。要实现节点的查找,首先需要解决的问题就是遍历链表中的所有节点。可以从链表头节点开始,利用循环的方式向下查找,如果当前节点指向的下一个节点不为空,则将下一个设置为当前节点。
2) 插入节点
插入节点需要考虑两种情况。第一种情况是在链表尾节点处插入节点,这种情况比较简单,只要将当前尾节点的Next指向新节点就可以了。第二种情况是在链表的中间位置插入节点,首先需要确定在哪个节点(当前节点)后插入新的节点,这就应该由用户确定了。然后需要记录当前节点的下一个节点,可以定义一个临时的节点进行记录。先将当前节点的下一个节点指向新添加的节点,再将新添加的节点的下一个节点指向临时节点,这样就可以了。
3) 删除节点
删除节点也需要考虑两种情况。第一种情况是删除尾节点,这种情况操作相对比较简单,首先找到尾节点之前的一个节点,将该节点指向的下一个节点设置为空,然后释放尾节点资源。第二种情况是删除链表中间部分的节点,首先需要找到当前节点的上一个节点,并定义一个临时节点PriorNode进行记录,然后再定义一个临时节点TempNode记录当前节点的下一个节点,最后将PriorNode的下一个节点指向TempNode,并释放当前节点。
二、代码实现(C#单向链表类库)
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace UnilateralismChainTable{//节点类 public class ListNode { public ListNode(int NewValue) { Value = NewValue; } public ListNode Previous; public ListNode Next; public int Value; }//初始化并定义指针变量 public class Clist { public Clist() { ListCountValue = 0; Head = null; Tail = null; } private ListNode Head; private ListNode Tail; private ListNode Current; private int ListCountValue;//尾部添加数据的代码如下: public void Append(int DataValue) { ListNode NewNode = new ListNode(DataValue); if (IsNull()) { Head = NewNode; Tail = NewNode; } else { Tail.Next = NewNode; NewNode.Previous = Tail; Tail = NewNode; } Current = NewNode; ListCountValue += 1; }//删除当前数据的代码如下 public void Delete() { if (!IsNull()) { if (IsBof()) { Head = Current.Next; Current = Head; ListCountValue -= 1; return; } if (IsEof()) { Tail = Current.Previous; Current = Tail; ListCountValue -= 1; return; } Current.Previous.Next = Current.Next; Current = Current.Previous; ListCountValue -= 1; return; } } //移动数据的代码如下 //向后移动一个数据 public void MoveNext() { if (!IsEof()) Current = Current.Next; } //向前移动一个数据 public void MovePrevious() { if(!IsBof()) Current=Current.Previous; } //移动到第一个数据 public void MoveFrist() { Current=Head; } //移动到最后一个数据 public void MoveLast() { Current=Tail; } //判断是否为空链表 public bool IsNull() { if(ListCountValue==0) return true; return false; } //判断是否达到尾部 public bool IsEof() { if(Current==Tail) return true; return false; } //判断是否到达头部 public bool IsBof() { if(Current==Head) return true; return false; } //获取节点值 public int GetCurrentValue() { return Current.Value; } //获取链表的数据个数 public int ListCount { get { return ListCountValue; } } //清空链表 public void Clear() { MoveFrist(); while(!IsNull()) { Delete(); } }//在当期位置前插入数据的代码如下: public void Insert(int DataValue) { ListNode NewNode=new ListNode(DataValue); if(IsNull()) { Append(DataValue); return; } if(IsBof()) { //为头部插入 NewNode.Next=Head; Head.Previous=NewNode; Head=NewNode; Current=Head; ListCountValue+=1; return; } //中间插入 NewNode.Next=Current; NewNode.Previous=Current.Previous; Current.Previous.Next=NewNode; Current.Previous=NewNode; Current=NewNode; ListCountValue+=1; }//进行升序插入的代码如下: public void InsertAscending(int InsertValue) { //参数InsertValue表示要插入的数据 if(IsNull()) { Append(InsertValue); return; } MoveFrist(); if(InsertValue<GetCurrentValue()) { Insert(InsertValue); return; } while(true) { if(InsertValue<GetCurrentValue()) { Insert(InsertValue); break; } if(IsEof()) { Append(InsertValue); break; } MoveNext(); } }//进行降序插入的代码如下: public void InsertUnAscending(int InsertValue) { if(IsNull()) { Append(InsertValue); return; } MoveFrist(); if(InsertValue>GetCurrentValue()) { Insert(InsertValue); return; } while(true) { if(InsertValue>GetCurrentValue()) { Insert(InsertValue); break; } if(IsEof()) { Append(InsertValue); break; } MoveNext(); } } }}注:
1、此为单向链表类库,大家可以在以后的程序开发中使用。
2、类库命名为UnilateralismChainTable,默认类名为Class1(这里改为Clist)。
- C#实现单向链表
- C#实现单向链表
- C#单向链表的实现
- 单向链表实现
- 单向链表实现
- C#链表;单向链表
- 单向链表实现源代码
- java 实现单向链表
- 单向链表实现反转
- java实现单向链表
- C++实现单向链表
- 单向链表的实现
- java 单向链表实现
- 单向链表实现堆栈
- 单向链表JS实现
- 单向链表的实现
- java实现单向链表
- 单向链表插入实现
- Android中sqlite数据库应用
- 从优化到再优化,最长公共子串
- JSTL获取list的大小
- LINUX串口共享
- sgu 552 Database Optimization
- C#实现单向链表
- udev的自定义规则
- 使用udev修改u盘设备文件名
- spark running errors
- Android Binder设计与实现 – 设计篇
- 智能指针实现
- 精简IT,敏捷商道 -- 企业云计算IT基础设施平台架构概览
- Knockout 新版应用开发教程之"text"绑定
- 搜索练习题集