`
coconut_zhang
  • 浏览: 541869 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

C#数据结构-双向链表

阅读更多

在结点中设两个引用域,一个保存直接前驱结点的地址,叫prev,一个直接后继结点的地址,叫next,这样的链表就是双向链表(Doubly Linked List)。
 
双向链表的结点结构示意图如上,双向链表结点的定义与单链表的结点的定义很相似,因此,双向链表节点类的实现可以参考单链表的节点类。


C#实现:

1接口

引用线性表的接口IListDS<T>

2实现

(1)双向链表节点类,参考单链表的节点类
 public class DBNode<T>
{
    private T data;              //数据域
    private DBNode<T> next;        //后继
    private DBNode<T> prev;        //前驱
    public T Data
    {
        get { return data; }
        set { data = value; }
    }
    public DBNode<T> Next
    {
        get { return next; }
        set { next = value; }
    }
    public DBNode<T> Prev
    {
        get { return prev; }
        set { prev = value; }
    }
    public DBNode()
    {
        data = default(T);
        prev = null;
        next = null;
    }
    public DBNode(T val)
    {
        data = val;
        next = null;
        prev = null;
    }
}
(2) 双向链表操作类实现

注意:由于双向链表的结点有两个引用,所以,在双向链表中插入和删除结点比单链表要复杂。双向链表中结点的插入分为在结点之前插入和在结点之后插入,插入操作要对四个引用进行操作

同样,删除操作也需要多多注意,其他的操作和单链表类似,不再赘述.
 public class DBLinkList<T> : IListDS<T>
{
    private DBNode<T> header;

    public DBNode<T> Header
    {

        get { return header; }
        set { header = value; }
    }
    public DBLinkList()
    {
        header = new DBNode<T>();
        header.Next = null;
        header.Prev = null;
    }
    /// <summary>
    /// 获取长度
    /// </summary>
    /// <returns></returns>
    public int GetLength()
    {
        DBNode<T> p = header;
        int len = 0;
        while (p != null)
        {
            ++len;
            p = p.Next;
        }
        return len;
    }
    /// <summary>
    /// 清空操作
    /// </summary>
    public void Clear()
    {
        header = null;
    }
    /// <summary>
    /// 判断线性表是否为空
    /// </summary>
    /// <returns></returns>
    public bool IsEmpty()
    {
        if (header.Data == null)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    /// <summary>
    /// 查找节点
    /// </summary>
    /// <param name="i"></param>
    /// <returns></returns>
    private DBNode<T> FindNode(int i)
    {
        if (IsEmpty())
        {
            Console.Write("list is empty");
            return null;
        }
        if (i < 1)
        {
            Console.Write("Index is error");
            return null;
        }
        DBNode<T> current = new DBNode<T>();
        current = header;
        int j = 1;
        while (current.Next != null && j < i)
        {
            ++j;
            current = current.Next;
        }
        return current;
    }
    /// <summary>
    /// 插入操作,在第i个节点前面
    /// </summary>
    /// <param name="item"></param>
    /// <param name="i"></param>
    public void Insert(T item, int i)
    {
        DBNode<T> current = FindNode(i);
        DBNode<T> newNode = new DBNode<T>(item);
        if (current != null)
        {
            current.Prev.Next = newNode;
            newNode.Next = current;
            newNode.Prev = current.Prev;
            current.Prev = newNode;
        }
        else
        {
            Console.Write("the node is not exist!");
        }
    }
    /// <summary>
    /// 插入操作,在第i个节点后面插入item
    /// </summary>
    /// <param name="item"></param>
    /// <param name="i"></param>
    public void InsertBack(T item, int i)
    {
        DBNode<T> current = FindNode(i);
        DBNode<T> newNode = new DBNode<T>(item);
        if (current != null)
        {
            current.Next.Prev = newNode;
            newNode.Prev = current;
            newNode.Next = current.Next;
            current.Next = newNode;
        }
        else
        {
            Console.Write("the node is not exist!");
        }
    }
    /// <summary>
    /// 附加操作,线性表未满,将值为item的新元素添加到末尾
    /// </summary>
    /// <param name="item"></param>
    public void Append(T item)
    {
        DBNode<T> newNode = new DBNode<T>(item);
        DBNode<T> p = new DBNode<T>();
        if (header == null)
        {
            header = newNode;
            return;
        }
        p = header;

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

    /// <summary>
    /// 删除操作
    /// </summary>
    /// <param name="i"></param>
    /// <returns></returns>
    public T Delete(int i)
    {
        DBNode<T> current = FindNode(i);
        if (current != null)
        {
            current.Prev.Next = current.Next;
            current.Next.Prev = current.Prev;
            current.Prev = null;
            current.Next = null;
            return current.Data;
        }
        else
        {
            Console.Write("the node is not exist!");
            return default(T);
        }
    }
    /// <summary>
    /// 取表元
    /// </summary>
    /// <param name="i"></param>
    /// <returns></returns>
    public T GetElem(int i)
    {
        DBNode<T> current = FindNode(i);
        if (current != null)
        {
            return current.Data;
        }
        else
        {
            Console.Write("the node is not exist!");
            return default(T);
        }
    }

    /// <summary>
    /// 按值查找
    /// </summary>
    /// <param name="value"></param>
    /// <returns>-1:链表或参数异常;0:节点不存在;1:值代表的位置</returns>
    public int Locate(T value)
    {
        if (IsEmpty())
        {
            Console.Write("list is empty");
            return -1;
        }
        if (value == null)
        {
            Console.Write("value is empty");
            return -1;
        }
        DBNode<T> current = new DBNode<T>();
        current = header;
        int result = 0;

        while (current.Next != null)
        {
            if (current.Data.Equals(value))
            {
                result = 1;
            }
        }
        return result;
    }
}
此外,循环链表的基本操作与单链表大体相同,只是判断链表结束的条件并不是判断结点的引用域是否为空,

而是判断结点的引用域是否为头引用,其它没有较大的变化

分享到:
评论

相关推荐

    C#实现双向链表C#,.net 链表 双向链表

    在深入探讨如何使用C#实现双向链表之前,我们首先需要理解双向链表的基本概念及其在数据结构中的重要性。双向链表是一种线性数据结构,其中每个元素(节点)包含一个指向前一个节点和后一个节点的引用,这与只包含一...

    C#数据结构之双向链表(DbLinkList)实例详解

    在C#中,双向链表(Double-Linked List,简称DbLinkList)是一种重要的数据结构,它允许在列表中的每个元素都有两个链接:一个指向前一个元素,另一个指向后一个元素。这种数据结构使得在链表中进行前向和后向遍历变...

    数据结构之链表,C#链表;数据结构之链表,C#链表

    链表分为单向链表和双向链表,C#中的LinkedList是双向链表,每个节点有前驱和后继节点。 链表的基本操作包括: 1. **创建链表**:可以通过初始化一个新的LinkedList实例来创建链表。 ```csharp LinkedList&lt;int&gt; ...

    C#双向链表的实现

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

    c#版的双向链表实现

    在C#编程语言中,双向链表是一种数据结构,它允许在列表中的任何位置进行插入和删除操作,因为每个节点都包含对前一个和后一个节点的引用。本篇文章将详细探讨如何在C#中实现一个双链表,并结合模板、接口和结构体等...

    数据结构-代码(C#实现)

    首先,链表是线性数据结构的一种,分为单链表、双向链表和循环链表。单链表每个节点仅包含指向下一个节点的指针;双向链表每个节点有前驱和后继指针;循环链表最后一个节点指回链表头。在C#中,你可以通过定义类来...

    双向链表实现的AOI

    双向链表是一种数据结构,每个节点包含两个指针,分别指向前一个节点和后一个节点,允许我们以O(1)的时间复杂度进行前后节点的访问。在AOI系统中,双向链表可以用来存储场景中的实体,便于快速地查找和更新相邻实体...

    数据结构 C#版 链表

    链表是一种基础且重要的数据结构,它在计算机科学中扮演着不可或缺的角色,特别是在C#编程中。本教程将深入探讨C#实现链表的相关知识,为初学者提供实践指导。 一、链表概念 链表不同于数组,它不是一块连续的内存...

    数据结构(C#版)----剑桥大学出版社

    ### 数据结构与算法使用C#(剑桥大学出版社) #### 一、概述 《数据结构与算法使用C#》是一本面向C#程序员的专业书籍,由迈克尔·麦克米兰(Michael McMillan)撰写,并由剑桥大学出版社出版。本书以C#语言为基础,...

    C#完整的链表应用源码

    本资源提供了C#语言实现的三种不同类型的链表:单链表、双向链表和循环链表的完整源码,这对于理解和实践C#编程中的链表操作极其有价值。 首先,我们来详细探讨单链表。单链表是一种线性数据结构,其中每个节点包含...

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

    各种数据结构、算法及实用的C#源代码 C#,双向链表(Doubly Linked List)归并排序(Merge Sort)算法与源代码 1 双向链表 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和...

    C#实现单向链表C# .net 链表 单向链表

    单向链表是一种常见的数据结构,在计算机科学中被广泛应用于解决各种问题。它由一系列节点组成,每个节点包含一个数据元素以及指向下一个节点的引用。本文将详细介绍如何在C#中实现一个基本的单向链表,并探讨其核心...

    C# 数据结构 doc

    本文档主要探讨了两种基本的数据结构:单链表(SimpleLink)和双链表,以及如何在C#中实现它们。 首先,我们来看单链表。单链表是一种线性数据结构,其中每个节点包含数据以及指向下一个节点的引用。在C#中,我们...

    C#数据结构(2.0版)中文版电子书

    《C#数据结构(2.0版)》中文版电子书是针对C#编程语言深入讲解数据结构的一本专业书籍。在计算机科学中,数据结构是组织和存储数据的方式,它直接影响到数据的处理效率和算法的设计。C#作为.NET框架下的主要编程语言...

    C# 链表实现

    链表的主要类型有单向链表和双向链表,这里我们主要讨论单向链表,因为题目中的描述并未提及双向链表。 在C#中,链表的实现通常涉及两个类:一个是链表类,负责维护链表的整体结构和操作;另一个是节点类,表示链表...

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

    各种数据结构、算法及实用的C#源代码。C#,双向链表(Doubly Linked List)快速排序(Quick Sort)算法与源代码。双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。...

    C#数据结构基础源程序.zip

    ArrayList提供了动态数组的功能,而LinkedList则是双向链表,支持快速插入和删除。 2. **栈和队列**:栈是一种后进先出(LIFO)的数据结构,常用于表达式求值、递归等场景。C#中的System.Collections.Stack类提供了...

    数据结构(C#语言描述)-陈广-PPT及教材答案—数据结构演示软件

    在C#这种面向对象的语言中,理解和掌握数据结构尤为重要,因为这直接影响到程序的性能和可维护性。本资料包由陈广教授提供,包含PPT讲解和教材答案,对于学习数据结构与C#的结合应用极具价值。 首先,让我们深入...

Global site tag (gtag.js) - Google Analytics