学习单链表的源码项目:http://files.cnblogs.com/xmfdsh/CSharp%E5%8D%95%E9%93%BE%E8%A1%A8.rar

链表是用一组任意的存储单元来存储线性表中的数据元素(在存储单元中可以是连续的,也可以是不连续的)。链表在存储数据元素时,除了存储数据元素本身的信息外,还要存储与它相邻的数据元素的存储地址信息。这两部分信息组成该数据元素的存储映像,称为节点。

节点的形象图如下:

首先定义一个类Node来表示这些节点:

public class Node<T>
{
private T data; //数据域
private Node<T> next; //引用域 #region 构造函数
/// <summary>
/// 构造函数
/// </summary>
/// <param name="val"></param>
/// <param name="p"></param>
public Node(T val, Node<T> p)
{
data = val;
next = p;
}
public Node(Node<T> p)
{
next = p;
}
public Node(T val)
{
data = val;
next = null;
}
public Node()
{
data = default(T);
next = null;
}
#endregion //数据域属性
public T Data
{
get
{
return data;
}
set
{
data = value;
}
}
//引用域属性
public Node<T> Next
{
get
{
return next;
}
set
{
next = value;
}
}
}

通常,我们把链表化成用箭头相连接的节点序列,节点间的箭头表示引用域中存储的地址。具体单链表的形式表示如下:

网上找到 图片,把循环列表 和 双向链表都弄上去了,也好提前了解下

因此要定义一个类表示整个链表,其中中间当然运用到了之前写Node类,类中的属性如下:

       private Node<T> head;//单链表头引用
//头引用属性
public Node<T> Head
{
get
{
return head;
}
set
{
head = value;
}
}
//构造函数
public LinkList()
{
head = null;
}

接下来就是实现之前讲的顺序表中定义好的接口 http://www.cnblogs.com/xmfdsh/p/3698456.html

        //求单链表长度
public int GetLength()
{
Node<T> p = head;
int len = ;
while(p!=null)
{
len++;
p = p.Next;
}
return len;
}
//清空单链表
public void Clear()
{
head = null;
} public bool IsEmpty()
{
if(head==null)
{
return true;
}
else
{
return false;
}
} public bool IsFull()
{
throw new NotImplementedException();
}
//在单链表末尾添加新元素
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<)
{
Console.WriteLine("链表为空或插入位置不允许");
return;
}
if (i == )
{
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 = ;
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节点
public T Delete(int i)
{
if(IsEmpty()||i<)
{
Console.WriteLine("链表为空或删除位置不允许");
return default(T);
}
Node<T> q = new Node<T>();
if (i == )
{
q = head;
head = head.Next;
return q.Data;
}
Node<T> p = head;
int j = ;
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 < )
{
Console.WriteLine("链表为空或者获取位置不允许");
return default(T);
}
Node<T> p = new Node<T>();
p = head;
int j = ;
while (p.Next != null && j < i)
{
p = p.Next;
j++;
}
if (j == i)
{
return p.Data;
}
else
{
Console.WriteLine("要获取的节点不存在");
return default(T);
}
}
//在单链表中查找值为value的节点
public int Locate(T value)
{
if (IsEmpty())
{
Console.WriteLine("链表为空");
return -;
}
Node<T> p = new Node<T>();
p = head;
int i = ;
while (!p.Data.Equals(value) && p.Next != null)
{
p = p.Next;
i++;
}
return i;
}

实现这些接口都不难,还是要理解链表的具体操作原理,只是记代码是没用的,不用多久就忘的差不多,p.Next等这些地方可以联想到C中的指针,不过C中的指针有时挺危险的,C#中的也许就安全多了吧。

然后再玩玩一些经典题目,首先就是单链表倒置

        //-----------------------------------单链表扩展方法---------------------------------------------
/// <summary>
/// 单链表倒置
/// </summary>
/// <param name="H"></param>
public void ReversLinkList(LinkList<T> H)
{
Node<T> p = H.head;
Node<T> q = new Node<T>();
H.head.Next = null;
while (p != null)
{
q = p;
p = p.Next;
q.Next = H.head.Next;
H.head.Next = q;
}
}

再做个题目:构造单链表Hb,要求Hb只包含Ha表中所有值不相同节点

        /// <summary>
/// 构造单链表Hb,要求Hb只包含Ha表中所有值不相同节点
/// </summary>
/// <param name="Ha"></param>
/// <returns></returns>
public LinkList<T> Purge(LinkList<T> Ha)
{
LinkList<T> Hb = new LinkList<T>();
Node<T> p = Ha.head;
Node<T> q = new Node<T>();
Node<T> s = new Node<T>(); s = p;
p = p.Next;
s.Next = null;
Hb.head.Next = s;
while (p != null)
{
s = p;
p = p.Next;
q = Hb.head;
while(q!=null&&!(q.Data.Equals(s.Data)))
{
q = q.Next;
}
if(q==null)
{
s.Next = Hb.head;
Hb.head = s;
}
}
return Hb;
}

C#单链表(数据结构)的更多相关文章

  1. 单链表数据结构 - java简单实现

    链表中最简单的一种是单向链表,每个元素包含两个域,值域和指针域,我们把这样的元素称之为节点.每个节点的指针域内有一个指针,指向下一个节点,而最后一个节点则指向一个空值.如图就是一个单向链表 一个单向链 ...

  2. 数据结构之单链表的实现-java

    一.单链表基本概念 单链表是一种链式存取的数据结构,用一组地址任意的存储单元(一般是非连续存储单元)存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点的构成:元素data + 指针next ...

  3. 单链表 C++ 实现 - 含虚拟头节点

    本文例程下载链接:ListDemo 链表 vs 数组 链表和数组的最大区别在于链表不支持随机访问,不能像数组那样对任意一个(索引)位置的元素进行访问,而需要从头节点开始,一个一个往后访问直到查找到目标 ...

  4. 数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  5. 数据结构与算法分析——C语言描述 第三章的单链表

    数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...

  6. 数据结构(C语言第2版)----时间复杂度和单链表

    马上要到校招了,复习下相关的基础知识. 时间复杂度是什么? 官方解释: 算法的执行时间需要依据算法所编制的程序在计算机上于运行时所消耗的时间来度量.在算法中可以使用基本的语句的执行次数作为算法的时间复 ...

  7. 数据结构算法C语言实现(二)---2.3线性表的链式表示和实现之单链表

    一.简述 [暂无] 二.头文件 #ifndef _2_3_part1_H_ #define _2_3_part1_H_ //2_3_part1.h /** author:zhaoyu email:zh ...

  8. python 数据结构之单链表的实现

    链表的定义: 链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址.由于每个结点都包含了可以链接起来的地址信息,所以用一个变量就 ...

  9. C# 数据结构--单链表

    什么是单链表 这两天看到很多有关单链表的面试题,对单链表都不知道是啥的我.经过学习和整理来分享一下啥是单链表和单链表的一些基本使用方法.最后看些网上有关单链表的面试题代码实例. 啥是单链表? 单链表是 ...

随机推荐

  1. OJ推荐【转】

    来自:http://blog.csdn.net/zdp072/article/details/16207111 一. Online Judge简介: Online Judge系统(简称OJ)是一个在线 ...

  2. 银河英雄传说 (codevs 1540) 题解

    [问题描述] 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰 ...

  3. C# A窗口内容显示在B窗口中的方法

    HeScripts script = new HeScripts(); //A窗口中实例化B窗口 string okscripts = "test"; //设置字段内容 scrip ...

  4. Java 第四天 Mysql

    下载地址 http://dev.mysql.com/downloads/  社区版是免费的 配置将zip 解压copy到本地,如:C:\mysql-5.6.15-winx64,复制配置文件my-def ...

  5. poj 2777 Count Color

    题目连接 http://poj.org/problem?id=2777 Count Color Description Chosen Problem Solving and Program desig ...

  6. django-pagination的使用

    1.安装django-pagination 2.将文件夹pagination复制到项目的根目录下 3.修改settings: 1.将 'pagination.middleware.Pagination ...

  7. mac下163企业邮箱客户端的配置

    一 添加账户       添加账户->添加其他邮件账户->输入电子邮件地址和密码.(全名随意起).   二 收件服务器和发件服务器的设置       收件服务器:pop.qiye.163. ...

  8. Swift global function(count indexOfObject contains...)

    当你在使用Swift时会发现一些常用的函数不!见!了! 比如 String:    s.count()  s.contains() Array: a.indexOfObeject(t:<T> ...

  9. Java中的访问权限

    Java中有四种访问权限,从大到小依次是:public –> protected –> default(friendly) –> private. 简单说明下: public 作用域 ...

  10. Android实现地图服务

    Android实现地图服务 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 代码实现 这里使用的是百度地图,具体配置方法请看官方文档即可.(也可以参考我 ...