休整了大半个月,重新归来,继续我的数据结构之旅。
下面是用C#语言实现数据结构中的单链表
代码解析如下:
1.实例化个int型的单链表,并统计出单链表的长度。
2.定义单链表的节点
3.定义一个单链表,实现其基本功能
所有代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 单链表
{
class Program
{
static void Main(string[] args)
{
LinkList<int> d = new LinkList<int>();
d = CreateLink();
d.Insert(2, 5);
Console.WriteLine("单链表的长度为{0}",d.GetLength().ToString());
}
//从头部插入建立单链表
public static LinkList<int> CreateLink()
{
int d;
LinkList<int> L = new LinkList<int>();
d = Int32.Parse(Console.ReadLine());
while (d > -1)
{
Node<int> p = new Node<int>(d);
p.Next = L.Head;
L.Head = p;
d = Int32.Parse(Console.ReadLine());
}
return L;
}
}
//单链表节点类
class Node<T>
{
private T data; //节点的数据域
private Node<T> next; //节点的引用,指向下一个节点
//构造函数
public Node(T val, Node<T> p)
{
data = val;
next = p;
}
//构造函数
public Node(T val)
{
data = val;
next = null;
}
//构造函数
public Node()
{
data = default(T);
next = null;
}
//设置属性
public T Data
{
get
{
return data;
}
set
{
data = value;
}
}
public Node<T> Next
{
get
{
return next;
}
set
{
next = value;
}
}
}
//单链表类
class LinkList<T>
{
private Node<T> head;//单链表的头结点
//头结点的属性
public Node<T> Head
{
get
{
return head;
}
set
{
head = value;
}
}
//构造函数
public LinkList()
{
head=null;
}
//求单链表的长度
public int GetLength()
{
Node<T> p = head;
int length = 0;
while (p != null)
{
++length;
p = p.Next;
}
return length;
}
//清空单链表
public void Clear()
{
head = null;
}
//判断单链表是否为空
public bool IsEmpty()
{
if (head == null)
{
return true;
}
else
{
return false;
}
}
//在单链表的末尾添加新元素
public void Append(T item)
{
Node<T> q = new Node<T>(item);
Node<T> p = new Node<T>();
if (head == null)
{
head = q;
}
p = head;
while (p != null)
{
p = p.Next;
}
p.Next = q;
}
//在单链表的第i个结点的位置前插入一个值为item的节点
public void Insert(T item, int i)
{
if (IsEmpty() || i < 1)
{
Console.WriteLine("添加错误!");
return;
}
if (i == 1)
{
Node<T> q = new Node<T>(item);
q.Next = head;
head = q;
return;
}
Node<T> p = head;
Node<T> r = new Node<T>();
int j=1;
while (p.Next != null && j < i)
{
r = p;
p = p.Next;
++j;
if (j == i)
{
Node<T> q = new Node<T>(item);
q.Next = p;
r.Next = q;
break;
}
}
}
//在单链表的第i个结点的位置后插入一个值为item的节点
public void InsertPost(T item, int i)
{
if (IsEmpty() || i < 1)
{
Console.WriteLine("添加错误!");
return;
}
if (i == 1)
{
Node<T> q = new Node<T>(item);
q.Next = head.Next;
head.Next = q;
return;
}
Node<T> p = head;
int j = 1;
while (p != null&&j<i)
{
p = p.Next;
j++;
if (j == i)
{
Node<T> q = new Node<T>(item);
q.Next = p.Next;
p.Next = q;
break;
}
}
}
//删除单链表的第i个节点
public T Delete(int i)
{
if (IsEmpty() || i < 0)
{
Console.WriteLine("删除错误!");
return default(T);
}
Node<T> q = new Node<T>();
if (i == 1)
{
q = head;
head = head.Next;
return q.Data;
}
Node<T> p = head;
int j = 1;
while (p.Next != null&&j<i)
{
++j;
q = p;
p = p.Next;
}
if (j == i)
{
q.Next = p.Next;
return p.Data;
}
else
{
Console.WriteLine("所要删除的节点不存在!");
return default(T);
}
}
//获得单链表的第i个数据元素
public T GetElem(int i)
{
if (IsEmpty() || i < 0)
{
Console.WriteLine("获取错误,请按规格填写!");
return default(T);
}
Node<T> p = head;
int j = 1;
while (p.Next != null && j < i)
{
++j;
p = p.Next;
}
if (j == i)
{
return p.Data;
}
else
{
Console.WriteLine("所要获取的节点不存在!");
return default(T);
}
}
//在单链表中查找值为value的节点位置
public int Locate(T value)
{
if (IsEmpty())
{
Console.WriteLine("所查找的链表为空!");
return -1;
}
Node<T> p = head;
int i = 1;
while (p.Next != null && !p.Data.Equals(value))
{
p = p.Next;
++i;
}
return i;
}
//倒置链表
public void RecLink(LinkList<T> H)
{
Node<T> p = H.Head;
Node<T> q = new Node<T>();
H.Head = null;
while (p != null)
{
q = p;
p = p.Next;
q.Next = H.Head;
H.Head = q;
}
}
}
}