`

C#实现--单链表(链式)

阅读更多

C#实现--单链表(链式)

using System;
using System.Collections.Generic;
using System.Text;

namespace SingleLinkedList
{
class Program
{
static void Main(string[] args)
{

//实例调用

}
}


//定义单链表的结点
//结点存储数据和下一个结点的地址(引用).这里用一个类表示.
public class Node<T>
{
private T data; //数据
private Node<T> next; //引用

//构造器
public Node(T val, Node<T> p)
{
data = val;
next = p;
}

//构造器2
public Node(Node<T> p)
{
next = p;
}

//构造器3
public Node(T val)
{
data = val;
next = null;
}

//构造器4
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; }
}
}


//单链表类--定义操作结点的一些方法(如删除, 插入等).
//IList<T>是.net自带的一个接口. 这里实现了这个接口.
public class LinkList<T> : IList<T>
{
private Node<T> head; //单链表的头引用

//头引用 属性
public Node<T> Head
{
get { return head; }
set { head = value; }
}

//构造器
public LinkList()
{
head = null;
}

///<summary>
///求单链表的长度
///需要从表头开始, 一个结点一个结点遍历,直到表的末尾.
///</summary>

public int GetLength()
{
Node<T> p = head;

int len = 0;
while (p != null)
{
++len;
p = p.Next;
}

return len;
}

///<summary>
/// 清空单链表
/// head=null即可.
/// 单链表清空后,原来结点所占用的空间不会一直保留, 而由垃圾回收器进行回收.
///</summary>
public void Clear()
{
head = null;
}

///<summary>
/// 判断单链表是否为空
/// head==null,即为空
///</summary>
public bool IsEmpty()
{
if (head == null)
{
return true;
}
else
{
return false;
}
}

///<summary>
///附加操作
///在单链表的末尾添加新元素
/// </summary>
public void Append(T item)
{
Node<T> q = new Node<T>(item);
Node<T> p = new Node<T>();

if (head == null)
{
head = q;
return;
}

p = head;
while (p.Next != null)
{
p = p.Next;
}

p.Next = q;
}

//在单链表的第 i 个结点位置前插入一个值为 item 的结点.
public void Insert(T item, int i)
{
if (IsEmpty() || i < 1)
{
Console.WriteLine("List is empty or Position is error!");
return;
}

//就一个head元素.(插入到head前即可)
if (i == 1)
{
Node<T> q = new Node<T>(item);
q.Next = head;
return;
}

//非head(中间某一元素前插入P)
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;
}

}

//在单链表的第 i 个结点的位置后插入一个值为 item的结点.
public void InsertPost(T item, int i)
{
if (IsEmpty() || i < 1)
{
Console.WriteLine("List is empty or Position is error!");
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;
}
}

//删除单链表的第 i 个结点
public T Delete(int i)
{
if (IsEmpty() || i < 0)
{
Console.WriteLine("Link is empty or Position is error!");
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;

//从头一直找到 i 所在的位置
//条件是: (1).单链表没有到末尾, (2).还没有到 i 所在的位置 ( j< i).
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("The item node is not exist!");
return default(T);
}
}

//获得单链表的第 i 个数据元素
public T GetElem(int i)
{
if (IsEmpty())
{
Console.WriteLine("List is empty!");
return default(T);
}

Node<T> p = new 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("The item node is not exist!");
return default(T);
}
}

///<summary>
///在单链表中查找值为 value 的结点
///</summary>
public int Locate(T value)
{
if (IsEmpty())
{
Console.WriteLine("List is Empty!");
return -1;
}

Node<T> p = new Node<T>();
p = head;
int i = 1;
while (!p.Data.Equals(value) && p.Next != null)
{
p = p.Next;
++i;
}

return i;
}

}


}

分享到:
评论

相关推荐

    c#实现顺序表、单链表、顺序栈、冒泡排序、折半查找.zip

    使用c#语言编写的winform程序,实现顺序表、单链表、顺序栈、冒泡排序、折半查找 源代码和程序展示: 顺序表:https://blog.csdn.net/HAIIAKU/article/details/119302855 单链表:...

    数据结构链式表

    本文将深入探讨链式表的原理、实现以及在C#语言中的应用,以VS2008开发环境为例,涵盖单链表、循环链表和双链表。 首先,链式表是一种动态数据结构,与数组不同,它不依赖于物理存储位置的连续性。每个链表节点(也...

    C#(数据结构与教程)单链表的实例应用程序

    单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储...

    单链表上机报告

    在这个数据结构上机实验中,学生们被要求使用C#语言来实现单链表的模型,并为其添加各种操作功能。 首先,实验的主要目标是让学生熟悉单链表的基本结构和操作原理。为了实现这一目标,实验要求创建两个类:`Link` ...

    数据结构 (C#语言版)

    通过对这些知识点的学习,读者不仅可以理解数据结构的基本原理,还可以掌握如何在C#环境中实现这些数据结构。这对于从事软件开发工作的程序员来说是非常有用的资源。此外,本书还提供了配套的光盘资料,包括源代码、...

    数据结构(C#语言版).

    - **基本操作实现**:实现单链表的插入、删除等操作。 - **应用举例**:例如实现动态列表的功能。 #### 2.4 其他链表 - **双向链表**:每个节点有两个指针,一个指向后继节点,另一个指向前驱节点。 - **循环链表*...

    数据结构与算法-C#版

    这是C#版的数据结构与算法的代码实现,包括:顺序表,单链表,双链表;顺序栈,链栈;顺序队列,链队列;顺序串;用数组进行特殊矩阵的存储,稀疏矩阵的存储;顺序存储二叉树,链式存储二叉树,哈夫曼树;多重链表...

    C#双向链表的实现

    本篇文章将深入探讨C#中的双向链表(Doubly Linked List)的实现,这是一类允许从两端进行访问的链式数据结构。 双向链表与单链表的主要区别在于每个节点不仅存储元素值,还包含两个指针,一个指向前一个节点,另一...

    链式队列.rar

    在编程语言中,链式队列的实现通常涉及到指针或者引用的概念,例如在C++、C#、Java等面向对象的语言中,可以定义一个节点类(Node)和一个队列类(Queue)。队列类包含对头节点和尾节点的引用,以及相关的操作方法。...

    数据结构(C#语言版)

    ### 数据结构(C#语言版)知识点详解 #### 第1章 绪论 ...通过这些知识点的学习,读者可以了解到数据结构的基本概念、算法的重要性以及如何在C#中实现常见的线性表。这对于深入理解和掌握数据结构是非常有帮助的。

    数据结构C#语言版.rar

    C#中常用的链表有单链表和双链表,它们允许在任意位置插入和删除元素,但不支持随机访问。 4. 队列:队列是一种先进先出(FIFO)的数据结构,C#中可以使用System.Collections.Generic命名空间下的Queue类来实现。...

    2.线性表.ppt

    顺序表的C#实现可以定义一个名为SeqList的类,继承自IListDS接口,实现接口中定义的方法,如GetLength、Clear、IsEmpty、Add、Insert、Delete、GetElem等。同时,可以添加一个索引器以支持通过下标访问元素。 链表...

    [详细完整版]图解数据结构.pdf

    在实际实现中,线性表可以采用顺序存储或链式存储两种方式。资料中主要讨论了顺序表,即用一维数组来存储线性表的元素。 图2-1展示了线性表的概念,其中元素a1到an通过它们的存储位置LOC(a1)和LOC(ai)表示。图2-2...

    数据结构(基于C#)

    本主题将深入探讨“数据结构(基于C#)”,重点关注链式存储表示的二叉树。二叉树作为一种重要的数据结构,具有广泛的应用,如搜索、排序、文件系统等。在C#编程语言中实现这些概念,可以提升软件性能和算法效率。 ...

    一算法可实现两个非递减的线性表的合并,采用链式存储结构,能够输出合并前和合并后链表的内容

    在Visual Studio 2019中实现这个算法,可以使用C++或者C#等语言,定义链表节点结构体,包含数据和指针成员,然后编写相应的函数来完成链表的创建、插入、遍历和合并操作。`Project1`可能是实验代码的主项目文件,...

    C#,双向链表(Doubly Linked List)快速排序(Quick Sort)算法与源代码

    循环链表是一种链式存储结构,它的最后一个结点指向头结点,形成一个环。因此,从循环链表中的任何一个结点出发都能找到任何其他结点。循环链表的操作和单链表的操作基本一致,差别仅仅在于算法中的循环条件有所不同...

    C#,双向链表(Doubly Linked List)归并排序(Merge Sort)算法与源代码

    循环链表是一种链式存储结构,它的最后一个结点指向头结点,形成一个环。因此,从循环链表中的任何一个结点出发都能找到任何其他结点。循环链表的操作和单链表的操作基本一致,差别仅仅在于算法中的循环条件有所不同...

Global site tag (gtag.js) - Google Analytics