C# 单向链表数据结构 (一)

时间:2022-10-13 19:42:31

单向链表数据结构是有节点组成,每个节点包含两部分,第一部分为存储数据,
第二部分为指向下一个节点的指针。注意,有两个特色的节点,分别为“头节点”
和“尾节点”,头节点本身没有数据,只存储下一个节点的指针,尾节点只存数据

  1   //节点类
public class ListNode
{
public ListNode(int NewValue)
{
Value = NewValue;
}
//前一个
public ListNode Previous;
//后一个
public ListNode Next;
//值
public int Value; }
//链表类
public class Clist
{
public Clist()//构造函数
{
//初始化
ListCountValue = ;
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 -= ;
return;
}
if (!IsEof())//若删除尾
{
Tail = Current.Previous;
Current = Tail;
ListCountValue -= ;
return;
}
Current.Previous.Next = Current.Next;//若删除中间数据
Current = Current.Previous;
ListCountValue -= ;
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 == )
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 += ;
return;
}
//中间插入
NewNode.Next = Current;
NewNode.Previous = Current.Previous;
Current.Previous.Next = NewNode;
Current = NewNode;
ListCountValue += ;
}
//进行升序插入方法
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)
{
//参数:InsertValue 插入的数据
//为空链表
if (IsNull())
{
//添加
Append(InsertValue);
return;
}
//移动到头
MoveFrist();
if (InsertValue > GetCurrentValue())
{
//满足条件,则插入,退出
Insert(InsertValue);
return;
}
while (true)
{
if (InsertValue > GetCurrentValue())
{
//满足条件,则插入,退出
Append(InsertValue);
break;
}
if (IsEof())
{
//尾部添加
Append(InsertValue);
break;
}
//移动到下一个指针
MoveNext();
} }
}