- 浏览: 541869 次
- 性别:
- 来自: 天津
文章分类
- 全部博客 (230)
- java (87)
- c/c++/c# (39)
- ASP.net MVC (4)
- eclipse/visual studio (3)
- tomcat/weblogic/jetty (13)
- linux/unix/windows (20)
- html/javascript/jquery/kendo/bootstrap/layui/vue/react (31)
- hibernate/struts/spring/mybatis/springboot (21)
- lucene/solr/ELK (2)
- shiro (0)
- oracle/sqlserver/mysql/postgresql (23)
- shell/python/ruby (6)
- android (0)
- maven/ant (1)
- freemarker/thymeleaf/velocity (1)
- open source project (41)
- cache/memcached/redis (0)
- nosql/hadoop/hbase/mongodb (0)
- system architecture/dubbo/zookeeper (0)
- software testing (0)
- system optimization (0)
- system security (0)
- tcp/udp/http (2)
- roller/wordpress (2)
- 工具收藏 (8)
- 文摘 (4)
- 生活 (0)
最新评论
-
coconut_zhang:
这个demo 非常完整了,是指下面说的那个html 模版,模版 ...
flying sauser, thymeleaf实现PDF文件下载 -
a93456:
你好,你有完整的demo吗? String template这 ...
flying sauser, thymeleaf实现PDF文件下载 -
yujiaao:
fn 函数循环是没有必要的啊,可以改成
protecte ...
Java 笛卡尔积算法的简单实现 -
安静听歌:
设置了.setUseTemporaryFileDuringWr ...
使用jxl导出大数据量EXCEL时内存溢出的解决办法 -
q280499693:
写的很详细,但是我现在想知道他们是怎么定位log4j.prop ...
关于SLF4J结合Log4j使用时日志输出与指定的log4j.properties不同
在结点中设两个引用域,一个保存直接前驱结点的地址,叫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;
}
}
此外,循环链表的基本操作与单链表大体相同,只是判断链表结束的条件并不是判断结点的引用域是否为空,
而是判断结点的引用域是否为头引用,其它没有较大的变化
发表评论
-
CMPP短信网关客户端发送程序
2010-04-06 11:12 4779最近无聊,玩了玩ubuntu ... -
C#编程中的预处理指令
2010-01-13 11:22 1436在C#中, 虽然编译器没有单独的预处理器,但在处理预处理指令时 ... -
vs 打包winform程序步骤经验总结
2010-01-06 09:47 59221、 应用程序文件夹 : 在应用程序文件夹下新建一文件夹重名为 ... -
处理资源 'http://localhost/ws/Service.asmx' 时出错(iis,.netframework安装顺序造成的错)
2009-12-30 17:10 1957刚刚学习webservices,很多东西都不懂。写了个最简单的 ... -
图解在VS2005利用NUnit进行测试
2009-12-21 12:53 1592一、介绍NUnit是一款用于在.net环境进行单元测试的工具, ... -
如何编写单元测试用例(转载自CSDN)
2009-12-17 17:01 3208一、 单元测试的概念 ... -
NUnit2.0详细使用方法
2009-12-17 17:00 10965 .测试生命周期合约 如果记得test case的定义,其中 ... -
NUnit2.0详细使用方法
2009-12-17 16:58 12041、初识NUnitNUnit是一个开源单元测试框架,它提高一套 ... -
在.NET环境中使用单元测试工具Nunit
2009-12-17 16:56 1088简介编写单元测试是一 ... -
.NET命名空间使用介绍
2009-12-17 11:29 1758在ASP.NET中,.NET Framework为我们 ... -
一种清晰而又简单通用的分页算法
2009-12-17 10:03 6131分页,是WEB开发中面对的最常见的编程,实现方法多种多样。我也 ... -
读书笔记c#高级编程 委托和事件
2009-12-17 09:49 1122在C#中使用一个类时,分两个阶段。首先需要定义这个类,即告诉编 ... -
深入理解C#中的委托和事件:委托的定义
2009-12-16 16:04 1675委托和事件在 .Net Framework中的应用非常广泛,然 ... -
C#委托和事件(简单示例)
2009-12-16 15:46 38651.委派的实现过程。 首先来看一下委派,委派其实就是方法的传 ... -
关于配置文件的读取
2009-11-18 16:52 2174在1.0/1.1版本,都流行的 ... -
C# WInForm 无框窗体移动
2009-11-12 13:56 2046调用APIusing System.Runtime.Inter ... -
在C# 中如何动态地添加控件
2009-09-09 11:05 3688通常在写程序的时候 ... -
ListBox相互移动
2009-08-14 17:33 1461using System;using System.Colle ... -
TreeView-demo
2009-08-14 17:22 1347using System;using System.Co ... -
TreeView高效绑定数据
2009-08-13 17:28 4140前俩个项目都是做政府的门户网,他们的栏目、部门都要以树形展示, ...
相关推荐
在深入探讨如何使用C#实现双向链表之前,我们首先需要理解双向链表的基本概念及其在数据结构中的重要性。双向链表是一种线性数据结构,其中每个元素(节点)包含一个指向前一个节点和后一个节点的引用,这与只包含一...
在C#中,双向链表(Double-Linked List,简称DbLinkList)是一种重要的数据结构,它允许在列表中的每个元素都有两个链接:一个指向前一个元素,另一个指向后一个元素。这种数据结构使得在链表中进行前向和后向遍历变...
链表分为单向链表和双向链表,C#中的LinkedList是双向链表,每个节点有前驱和后继节点。 链表的基本操作包括: 1. **创建链表**:可以通过初始化一个新的LinkedList实例来创建链表。 ```csharp LinkedList<int> ...
本篇文章将深入探讨C#中的双向链表(Doubly Linked List)的实现,这是一类允许从两端进行访问的链式数据结构。 双向链表与单链表的主要区别在于每个节点不仅存储元素值,还包含两个指针,一个指向前一个节点,另一...
在C#编程语言中,双向链表是一种数据结构,它允许在列表中的任何位置进行插入和删除操作,因为每个节点都包含对前一个和后一个节点的引用。本篇文章将详细探讨如何在C#中实现一个双链表,并结合模板、接口和结构体等...
首先,链表是线性数据结构的一种,分为单链表、双向链表和循环链表。单链表每个节点仅包含指向下一个节点的指针;双向链表每个节点有前驱和后继指针;循环链表最后一个节点指回链表头。在C#中,你可以通过定义类来...
双向链表是一种数据结构,每个节点包含两个指针,分别指向前一个节点和后一个节点,允许我们以O(1)的时间复杂度进行前后节点的访问。在AOI系统中,双向链表可以用来存储场景中的实体,便于快速地查找和更新相邻实体...
链表是一种基础且重要的数据结构,它在计算机科学中扮演着不可或缺的角色,特别是在C#编程中。本教程将深入探讨C#实现链表的相关知识,为初学者提供实践指导。 一、链表概念 链表不同于数组,它不是一块连续的内存...
### 数据结构与算法使用C#(剑桥大学出版社) #### 一、概述 《数据结构与算法使用C#》是一本面向C#程序员的专业书籍,由迈克尔·麦克米兰(Michael McMillan)撰写,并由剑桥大学出版社出版。本书以C#语言为基础,...
本资源提供了C#语言实现的三种不同类型的链表:单链表、双向链表和循环链表的完整源码,这对于理解和实践C#编程中的链表操作极其有价值。 首先,我们来详细探讨单链表。单链表是一种线性数据结构,其中每个节点包含...
各种数据结构、算法及实用的C#源代码 C#,双向链表(Doubly Linked List)归并排序(Merge Sort)算法与源代码 1 双向链表 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和...
单向链表是一种常见的数据结构,在计算机科学中被广泛应用于解决各种问题。它由一系列节点组成,每个节点包含一个数据元素以及指向下一个节点的引用。本文将详细介绍如何在C#中实现一个基本的单向链表,并探讨其核心...
本文档主要探讨了两种基本的数据结构:单链表(SimpleLink)和双链表,以及如何在C#中实现它们。 首先,我们来看单链表。单链表是一种线性数据结构,其中每个节点包含数据以及指向下一个节点的引用。在C#中,我们...
《C#数据结构(2.0版)》中文版电子书是针对C#编程语言深入讲解数据结构的一本专业书籍。在计算机科学中,数据结构是组织和存储数据的方式,它直接影响到数据的处理效率和算法的设计。C#作为.NET框架下的主要编程语言...
链表的主要类型有单向链表和双向链表,这里我们主要讨论单向链表,因为题目中的描述并未提及双向链表。 在C#中,链表的实现通常涉及两个类:一个是链表类,负责维护链表的整体结构和操作;另一个是节点类,表示链表...
各种数据结构、算法及实用的C#源代码。C#,双向链表(Doubly Linked List)快速排序(Quick Sort)算法与源代码。双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。...
ArrayList提供了动态数组的功能,而LinkedList则是双向链表,支持快速插入和删除。 2. **栈和队列**:栈是一种后进先出(LIFO)的数据结构,常用于表达式求值、递归等场景。C#中的System.Collections.Stack类提供了...
在C#这种面向对象的语言中,理解和掌握数据结构尤为重要,因为这直接影响到程序的性能和可维护性。本资料包由陈广教授提供,包含PPT讲解和教材答案,对于学习数据结构与C#的结合应用极具价值。 首先,让我们深入...