• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#模拟链表数据结构的实例解析

C#模拟链表数据结构的实例解析

作者:灵犀 字体:[增加 减小] 来源:互联网 时间:2017-05-28

灵犀 通过本文主要向大家介绍了马桶c的个人空间,c语言,欲情 c max,维生素c,奔驰c200等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

写在前面

模块化编程是大多数初学者必经之路,然后可能你走向了结构化编程,链表是一种典型结构模式,它的出现克服了数组必须预先知道大小的缺陷,听不懂?你只需要记住,链表结构非常牛叉就可以了,学习这种结构对我们的逻辑思维有很大提升。

什么是链表结构呢?

链表是一种物理存储单元上非连续、非顺序的存储结构。比如A->B->C,这种结构,我们可以理解为A连接着B,B连接C,像这种结构我们就叫做链表结构。对了,火车的车厢,其实就是链表的结构的最好说明

为什么要有链表结构呢?

学过计算机的都知道数组(Array),数组常用切好用,但也存在问题。首先,数组必须需要知道空间大小(int[] age = new int[100], 必须声明长度),其次,对于元素之间插入、删除操作效率很低(如何在数组中间插入一个元素?)。

链表的出现,完美的解决了这些问题。

如何实现链表

首先我们需要声明一种结构

//链表结构: 构造节点 - 连接节点
//Template
class Node
{
  public int num;
  //指向下一个元素
  public Node next;
}

//链表结构: 构造节点 - 连接节点
//Template
class Node
{
  public int num;
  //指向下一个元素
  public Node next;
}

</div>


我们可以把上面的这种结构看做是一个礼品盒,可以存放整形数值。

然后我们创建一个MyList先生,这位先生就使用Node去存放整形物品,而且使用了链表结构哦!

class MyList
{
  public Node currentNode;
  public Node point;
  public MyList()
  {
    currentNode = new Node();
  }
  //存放物品
  public void Add(int value)
  {
    //第一次
    if(point == null)
    {
      currentNode.num = value;
      point = currentNode;
    }
    else  //2 3 4..... 次
    {
      Node temp = new Node();
      temp.num = value;
      point.next = temp;
      //更新指针
      point = temp;
    }

  }
}

class MyList
{
  public Node currentNode;
  public Node point;
  public MyList()
  {
    currentNode = new Node();
  }
  //存放物品
  public void Add(int value)
  {
    //第一次
    if(point == null)
    {
      currentNode.num = value;
      point = currentNode;
    }
    else  //2 3 4..... 次
    {
      Node temp = new Node();
      temp.num = value;
      point.next = temp;
      //更新指针
      point = temp;
    }
 
  }
}

</div>


然后,我们可以在客户端测试一下:

public static void Main (string[] args)
{
  MyList<int> mList = new MyList<int>();
  //添加元素
  mList.Add(1);
  mList.Add(11);
  mList.Add(111);
  mList.Add(1111);
  while(mList.currentNode != null)
  {
    Console.WriteLine (mList.currentNode.num);
    mList.currentNode = mList.currentNode.next;
  }
}

public static void Main (string[] args)
{
  MyList<int> mList = new MyList<int>();
  //添加元素
  mList.Add(1);
  mList.Add(11);
  mList.Add(111);
  mList.Add(1111);
  while(mList.currentNode != null)
  {
    Console.WriteLine (mList.currentNode.num);
    mList.currentNode = mList.currentNode.next;
  }
}

</div>


我们自己定义的一个整形集合就这样ok了。它有两个优点:可以存放任意多个元素!方便元素的插入和删除。

双向链表的定义和简单操作:

双向链表其实是单链表的改进。当我们对单链表进行操作时,有时你要对某个结点的直接前驱进行操作时,又必须从表头开始查找。这是由单链表结点的结构所限制的。因为单链表每个结点只有一个存储直接后继结点地址的链域,那么能不能定义一个既有存储直接后继结点地址的链域,又有存储直接前驱结点地址的链域的这样一个双链域结点结构呢?这就是双向链表。在双向链表中,结点除含有数据域外,还有两个链域,一个存储直接后继结点地址,一般称之为右链域;一个存储直接前驱结点地址,一般称之为左链域。

namespace DounlyLinkedlist
{
  //定义双向链表的结点
  public class Node
  {
    public Object Element;
    public Node FLink;
    public Node BLink;

    public Node()
    {
      Element = null;
      FLink = null;
      BLink = null;
    }

    public Node(Object element)
    {
      Element = element;
      FLink = null;
      BLink = null;
    }

  }

  //链表操作的类
  public class LinkedList
  {
    
    public Node Header;

    public LinkedList()
    {
      Header = new Node("Header");
      Header.FLink = null;
      Header.BLink = null; 
    }

    //查找结点
    private Node Find(Object item)
    {
      Node Current = new Node();
      Current = Header;
      while (Current.Element != item)
      {
        Current = Current.FLink;
      }
      return Current;
    }

    //插入结点
    public void InsertNode(Object item,Object postionItem)
    {
      Node Current = new Node();
      Node NewItem = new Node(item);
      Current = Find(postionItem);
      if (Current != null)
      {
        NewItem.FLink = Current.FLink;
        NewItem.BLink = Current;
        Current.FLink = NewItem;
      }
    }

    //删除结点
    public void Remove(Object item)
    {
      Node P = Find(item);
      if (P.FLink != null)
      {
        P.BLink.FLink = P.FLink;
        P.FLink.BLink = P.BLink;
        P.BLink = null;
        P.FLink = null;
      }
      
    }


    //查找双向链表最后一个结点元素
    private Node FindLast()
    {
      Node Current = new Node();
      Current = Header;
      while (!(Current.FLink == null))
      {
        Current = Current.FLink;
      }
      return Current;
    }


    //逆向打印双向链表
    public void PrintReverse()
    {
      Node Current = new Node();
      Current = FindLast();
      while (!(Current.BLink == null))
      {
        Console.WriteLine(Current.Element);
        Current = Current.BLink;
      }
    }

    //打印双向链表
    public void Print()
    {
      Node Current = new Node();
      Current = Header;
      while (!(Current.FLink == null))
      {
        Console.WriteLine(Current.FLink.Element);
        Current = Current.FLink;
      }
    }
  }
}

</div>

链表应用场景

应用场景:集合(动态数组)、贪吃蛇、地图的循环生成、老虎机效果等等,链表可以帮助我们完成很多事情。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#利用ReportViewer生成报表
  • C#基于正则去掉注释的方法示例
  • C#中new的用法及与override的区别分析
  • C#实现两个richtextbox控件滚动条同步滚动的简单方法
  • C# for循环的经典案例集锦
  • C#操作word的方法示例
  • C#使用WebClient登录网站并抓取登录后的网页信息实现方法
  • C# WinForm制作异形窗体与控件的方法
  • C#实现Excel表数据导入Sql Server数据库中的方法
  • C#使用NPOI上传excel

相关文章

  • 2017-05-28C#端口转发用法详解
  • 2017-05-28C#关于类的只读只写属性实例分析
  • 2017-05-28C#对文件/文件夹操作代码汇总
  • 2017-05-28C#基础概念二十五问 21-25
  • 2017-05-28c#字符串值类型与引用类型比较示例
  • 2017-05-28C#巧用DateTime预设可选的日期范围(如本年度、本季度、本月等)
  • 2017-05-28实例详解C#正则表达式
  • 2017-05-28C#简单连接sql数据库的方法
  • 2017-05-28C#之WinForm WebBrowser实用技巧汇总
  • 2017-05-28C#使用webbrowser的常见用法实例

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 深入讲解C#编程中嵌套类型和匿名类型的定义与使用
    • C#修改IIS站点framework版本号的方法
    • C# BackgroundWorker用法详解
    • C# 绘制统计图大全(柱状图, 折线图, 扇形图)
    • C#启动进程的几种常用方法
    • 经典排序算法之冒泡排序(Bubble sort)代码
    • C#导入导出Excel数据的两种方法
    • C#二进制序列化实例分析
    • C#中数组段用法实例分析
    • C# Ini文件操作实例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有