我们一般只是学过C/C++的数据结构,想必学C#的学生会疑惑,为什么C#没有数据结构呢,那我来告诉你,其实C#也是有数据结构的,只不过我们不了解罢了,经过我半天的编程,终于把C#的数据结构写出来了,也大大增加了我对数据结构的理解,在这里提供出来,共享学习,共同进步!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 控制台程序
{
class CSharp数据结构
{
public static void Main(string[] args)
{
Console.WriteLine("Hello");
//ListNode list = new ListNode(10);
Creastlist list = new Creastlist();
list.Append(1);
list.Append(2);
list.Delete();//从队尾删除一个数据
Console.WriteLine(list.ListCount);
list.Clear();
Console.WriteLine(list.ListCount);
list.Append(1);
list.Append(2);
list.Append(4);
list.Append(3);
list.MovePrevious();
list.Append(5);
list.MovePrevious();
Console.WriteLine(list.GetCurrentValue());
//打印输出当前链表中的数据
list.ShowList(list);
list.Clear();
Console.WriteLine("\n"+"清空后的链表节点个数为:"+list.ListCount);
Console.WriteLine("新建一个初始化好的链表:");
String str = Console.ReadLine();
Creastlist NewList=new Creastlist(str);
Console.Write("当前初试换好的链表为:\n");
NewList.ShowList(NewList);
Console.Write("\n链表中节点的个数为:");
Console.WriteLine(NewList.ListCount);
Console.Read();
}
}
// 结点类
public class ListNode
{
public ListNode(int NewValue)
{
Value = NewValue;
}
/// <summary>
/// 前一个节点
/// </summary>
public ListNode Previous;
/// <summary>
/// 后一个节点
/// </summary>
public ListNode Next;
/// <summary>
/// 值
/// </summary>
public int Value;
}
// 定义结点之后,开始类线性表的操作编程了.在LIST 类中,采用了,Head ,Tail, Current,三个指针,使用Append ,
//MoveFrist,MovePrevious,MoveNext,MoveLast ,Delete,InsertAscending,InsertUnAscending ,Clear 实现移动,添加,
//删除,升序插入,降序插入,清空链表操作,GetCurrentValue() 方法取得当前的值。
public class Creastlist
{
public Creastlist()
{
//构造函数
//初始化
ListCountValue = 0;
Head = null;
Tail = null;
}
/// <summary>
/// 构造一个初始化好的链表
/// </summary>
/// <param name="str">初始化的字符串,并以逗号或者空格隔开</param>
public Creastlist(string str)
{
//构造函数
//初始化
char[] separator = { ',',' '};
string[] s = str.Split(separator);
Creastlist list = new Creastlist();
foreach (string i in s)
{
int j=Convert.ToInt32(i);
list.Append(j);
}
ListCountValue = s.Length;
Tail = list.Current;
Head = list.Head;
}
/// <summary>
/// 头指针
/// </summary>
private ListNode Head;
/// <summary>
/// 尾指针
/// </summary>
private ListNode Tail;
/// <summary>
/// 当前指针
/// </summary>
private ListNode Current;
/// <summary>
/// 链表数据的个数
/// </summary>
private int ListCountValue;
/// <summary>
/// 尾部添加数据
/// </summary>
/// <param name="DataValue">值</param>
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;
}
/// <summary>
/// 删除当前的数据
/// </summary>
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;
}
}
/// <summary>
/// 向后移动一个数据
/// </summary>
public void MoveNext()
{
if (!IsEof()) Current = Current.Next;
}
/// <summary>
/// 向前移动一个数据
/// </summary>
public void MovePrevious()
{
if (!IsBof()) Current = Current.Previous;
}
/// <summary>
/// 移动到第一个数据
/// </summary>
public void MoveFrist()
{
Current = Head;
}
/// <summary>
/// 移动到最后一个数据
/// </summary>
public void MoveLast()
{
Current = Tail;
}
/// <summary>
/// 判断是否为空链表
/// </summary>
/// <returns>返回bool值</returns>
public bool IsNull()
{
if (ListCountValue == 0)
return true;
return false;
}
/// <summary>
/// 判断是否为到达尾
/// </summary>
/// <returns></returns>
public bool IsEof()
{
if (Current == Tail)
return true;
return false;
}
/// <summary>
/// 判断是否为到达头部
/// </summary>
/// <returns></returns>
public bool IsBof()
{
if (Current == Head)
return true;
return false;
}
/// <summary>
/// 获取当前数据
/// </summary>
/// <returns>返回当前节点的值</returns>
public int GetCurrentValue()
{
return Current.Value;
}
/// <summary>
/// 取得链表的数据个数
/// </summary>
public int ListCount
{
get
{
return ListCountValue;
}
}
/// <summary>
/// 清空链表
/// </summary>
public void Clear()
{
MoveFrist();
while (!IsNull())
{
//若不为空链表,从尾部删除
Delete();
}
}
/// <summary>
/// 在当前位置前插入数据
/// </summary>
/// <param name="DataValue">要插入的数据</param>
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;
}
/// <summary>
/// 进行升序插入
/// </summary>
/// <param name="InsertValue"></param>
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())
{
//满族条件,则插入,退出
Insert(InsertValue);
break;
}
if (IsEof())
{
//尾部添加
Append(InsertValue);
break;
}
//移动到下一个指针
MoveNext();
}
}
/// <summary>
/// 打印链表中全部的数
/// </summary>
/// <param name="list">链表参数</param>
public void ShowList(Creastlist list)
{
Console.WriteLine("当前链表中数据为:");
list.MoveFrist();
for (int i = 0; i < list.ListCount;i++ )
{
Console.Write(list.GetCurrentValue() + " ");
list.MoveNext();
}
}
}
}
如有不当之处,请指正!QQ:1213250243