C#数据结构-单链表

   理论基础:

    链表是用一组任意的存储单元来存储线性表中的数据元素

    如果结点的引用域只存储该结点直接后继结点的存储地址,则该链表叫单链表(Singly Linked List)。

    单链表由头引用H唯一确定。头引用指向单链表的第一个结点,也就是把单链表第一个结点的地址放在H中。

   C#实现:

    1接口

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

    2实现

         首先,必须定义一个单链表的节点类。

Code
 1 public class Node<T>
 2    {
 3        private T data;        //数据域
 4        private Node<T> next;  //引用域
 5
 6        
 7        public Node(T val)
 8        {
 9            data = val;
10            next = null;
11        }

12
13        public Node()
14        {
15            data = default(T);
16            next = null;
17        }

18
19        public T Data
20        {
21            get
22            {
23                return data;
24            }

25            set
26            {
27                data = value;
28            }

29        }

30        public Node<T> Next
31        {
32            get
33            {
34                return next;
35            }

36            set
37            {
38                next = value;
39            }

40        }

41
42
43    }

     实现主体类

     Append,Insert,InsertBack三个方法实质上都是插入操作,可以考虑用overload或者override来实现,有兴趣的朋友试试。

Code
  1public class LinkList<T> : IListDS<T>
  2    {
  3        private Node<T> head;
  4        public Node<T> Head
  5        {
  6            get
  7            {
  8                return head;
  9            }

 10            set
 11            {
 12                head = value;
 13            }

 14        }

 15        public LinkList()
 16        {
 17            head = null;
 18        }

 19
 20        /**//// <summary>
 21        /// 获取长度
 22        /// </summary>
 23        /// <returns></returns>

 24        public int GetLength()
 25        {
 26            Node<T> p = head;
 27            int len = 0;
 28            while (p != null)
 29            {
 30                ++len;
 31                p = p.Next;
 32            }

 33            return len;
 34        }

 35
 36        /**//// <summary>
 37        /// 清空操作
 38        /// </summary>

 39        public void Clear()
 40        {
 41            head = null;
 42        }

 43
 44        /**//// <summary>
 45        /// 判断线性表是否为空
 46        /// </summary>
 47        /// <returns></returns>

 48        public bool IsEmpty()
 49        {
 50            if (head == null)
 51            {
 52                return true;
 53            }

 54            else
 55            {
 56                return false;
 57            }

 58        }

 59
 60        /**//// <summary>
 61        /// 附加操作,线性表未满,将值为item的新元素添加到末尾
 62        /// </summary>
 63        /// <param name="item"></param>

 64        public void Append(T item)
 65        {
 66            Node<T> newNode = new Node<T>(item);  //根据元素创建新的节点
 67            Node<T> node = new Node<T>();
 68
 69            if (head == null)
 70            {
 71                head = newNode;
 72                return;
 73            }

 74            node = head;
 75            while (node.Next != null)
 76            {
 77                node = node.Next;
 78            }

 79            node.Next = newNode;
 80
 81        }

 82
 83        /**//// <summary>
 84        /// 寻找节点
 85        /// </summary>
 86        /// <param name="i"></param>
 87        /// <returns></returns>

 88        public Node<T> FindNode(int i)
 89        {
 90            if (IsEmpty())
 91            {
 92                Console.Write("List is empty");
 93                return null;
 94            }

 95            if (i < 1)
 96            {
 97                Console.Write("Index is error");
 98                return null;
 99            }

100            Node<T> current = head;
101            int j = 1;
102
103            while (current.Next != null && j < i)
104            {
105                ++j;
106                current = current.Next;
107            }

108            return current;
109        }

110
111        /**//// <summary>
112        /// 插入操作,在第i个节点前面插入item
113        /// </summary>
114        /// <param name="item"></param>
115        /// <param name="i"></param>

116        public void Insert(T item, int i)
117        {
118            Node<T> newNode = new Node<T>(item);
119            Node<T> node = new Node<T>();
120            Node<T> current = FindNode(i);
121            if (current != null)
122            {
123                node = current;       //对目标节点备份
124                newNode.Next = current;
125                node.Next = newNode;
126            }

127        }

128
129        /**//// <summary>
130        /// 插入操作,在第i个节点后面插入item
131        /// </summary>
132        /// <param name="item"></param>
133        /// <param name="i"></param>

134        public void InsertBack(T item, int i)
135        {
136            Node<T> newNode = new Node<T>(item);
137            Node<T> current = FindNode(i);
138            if (current != null)
139            {
140                newNode.Next = current.Next;
141                current.Next = newNode;
142            }

143        }

144
145        /**//// <summary>
146        /// 删除操作
147        /// </summary>
148        /// <param name="i"></param>
149        /// <returns></returns>

150        public T Delete(int i)
151        {
152            Node<T> current = FindNode(i);
153            Node<T> node = new Node<T>();
154            if (current != null)
155            {
156                node = current;   //对目标节点备份
157                node.Next = current.Next;
158                return current.Data;
159            }

160            else
161            {
162                Console.Write("the node is not exist!");
163                return default(T);
164            }

165        }

166
167        /**//// <summary>
168        /// 去表元
169        /// </summary>
170        /// <param name="i"></param>
171        /// <returns></returns>

172        public T GetElem(int i)
173        {
174            Node<T> current = FindNode(i);
175
176            if (current != null)
177            {
178                return current.Data;
179            }

180            else
181            {
182                Console.Write("the node is not exist!");
183                return default(T);
184            }

185        }

186
187        /**//// <summary>
188        /// 按值查找
189        /// </summary>
190        /// <param name="value"></param>
191        /// <returns></returns>

192        public int Locate(T value)
193        {
194            if (IsEmpty())
195            {
196                Console.WriteLine("List is Empty!");
197                return -1;
198            }

199            Node<T> current = new Node<T>();
200            current = head;
201            int i = 1;
202            while (current.Next != null && !current.Data.Equals(value))
203            {
204                current = current.Next;
205                ++i;
206            }

207            return i;
208        }

209    }

碰到的问题:1 方法参数为int类型,改用object类型碰到一些问题,查找节点的时候,遍历整个链表,如何对比参数节点

                   对比参数会不会影响算法的时间复杂度

                2 append,insert,insertback方法本质上都是插入操作,有没有更好的方法实现 

代码没有经过测试,有兴趣的朋友可以试试,有问题,告知一下!   

转载于:https://www.cnblogs.com/Richet/archive/2008/10/15/1311706.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/381536.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pandas 根据单号分类_由 “猫捉老鼠”游戏联想的用户分类问题

一、说在最前 用户识别&#xff0c;用户分类&#xff0c;精准营销…这是咱们业务人员常常念叨的话。底层逻辑为无论任何营销目的&#xff0c;在营销手段上&#xff0c;越针对某一细化群体&#xff0c;达成目的的概率也就会越大。那今天就来和大家说道说道用户识别/分类的一种方…

arraylist从大到小排序_java基础算法之二叉树排序(递归)

一、二叉树介绍在计算机科学中&#xff0c;二叉树是每个结点最多有两个子树的树结构。二叉树由各种节点组成&#xff0c;如下图所示&#xff1a;每个节点都可以有左子节点&#xff0c;右子节点每一个节点都有一个值二叉树遍历&#xff1a;二叉树的遍历分左序&#xff0c;中序&a…

uvm 形式验证_IC设计职位详解之“数字验证工程师”就业必学课程

数字验证处于数字IC设计流程的前端&#xff0c;属于数字IC设计类岗位的一种。在IC设计中&#xff0c;数字验证所占的人数比重是非常多的&#xff0c;很多大公司&#xff0c;数字前端设计工程师与验证工程师的比例已经达到1&#xff1a;3。数字验证主要分成几种层次的验证&#…

关联查询数据重复怎么办_在设计数据表的时候,是一个宽表好,还是多个维度表好?...

数据仓库每张表的搭建&#xff0c;主要依赖于这个表在整个数据仓库中的作用和相关意义。首先要清楚这个表的存在是为了解决那些问题&#xff0c;什么角色使用&#xff0c;怎么保证使用者尽可能好的体验解决问题。从以上所提到的角度去看待问题&#xff0c;拆解以下几点因素&…

用python画出叶子_太疯狂了!原来用粉笔画画,也可以这么美,简单几招教你,美到邻居羡慕嫉妒...

......点进来之前先让大家瞧瞧相信这是用粉笔画的吗&#xff1f;▼玫瑰花▼山茶花▼蓝色鸢尾花▼樱花树▼这一张张让人直流鼻血的作品没错这就是用色粉笔画出来的很多人问&#xff1a;是不是平时老师上课时用的粉笔呢&#xff1f;这里给大家科普下&#xff1a;色粉画&#xff0…

jsonp react 获取返回值_必须要会的 50 个React 面试题(下)

翻译&#xff1a;疯狂的技术宅原文&#xff1a;https://www.edureka.co/blog/interview-questions/react-interview-questions29. 你对受控组件和非受控组件了解多少&#xff1f;受控组件非受控组件1. 没有维持自己的状态1. 保持着自己的状态2.数据由父组件控制2.数据由 DOM 控…

snipaste截图软件滚动截图_截图工具的逆袭,Snipaste 还可以这么玩

这是我们的历史文章。为让大家更好找到自己需要的软件&#xff0c;我们会在三条位置推送&#xff0c;那些备受关注的APP和软件。提到「截图」大家会想到什么呢&#xff1f;微信&#xff0c;QQ 或者 功能更加完善的截图工具&#xff1f;有想过「截图」可以这样用吗&#xff1f;还…

plsql developer无监听程序_微信小程序支持分享到朋友圈啦!技术解读跟我来

千呼万唤始出来&#xff01;微信小程序页面分享到朋友圈的功能&#xff0c;终于在安卓系统灰度测试了&#xff01;目前只在安卓系统&#xff01;只在安卓系统&#xff01;只在安卓系统&#xff01;iOS系统还没有办法体验。首先&#xff0c;我们看一下官方文档的描述&#xff0c…

mixin network_【译文】Mixin——以最高的安全性满足所有区块链资产的交易需求

一个免费的闪电般快速的数字资产端对端交易网络。01.概况Mixin 由一个理论上永久的内核、许多动态域和不同的多用途域扩展组成&#xff0c;以构成扩展的星形拓扑结构。Mixin Network 已经支持 BTC&#xff0c;BCH&#xff0c;ETH&#xff0c;EOS&#xff0c;ETC&#xff0c;SC&…

python柱形图代码_Python数据可视化:基于matplotlib绘制「条形图」

简介 条形图 &#xff08;bar chart&#xff09;是用宽度相同条形的高度或长短来表示数据多少的图形&#xff0c;可以横置或纵置。纵置时的条形图也称为 柱形图 &#xff08;column chart&#xff09;。 绘制条形图 1 import matplotlib.pyplot as plot 2 3 data [5., 25., 50…

源码 连接mysql_MySql轻松入门系列————第一站 从源码角度轻松认识mysql整体框架图...

一&#xff1a;背景 1. 讲故事 最近看各大技术社区&#xff0c;不管是知乎&#xff0c;掘金&#xff0c;博客园&#xff0c;csdn基本上看不到有小伙伴分享sqlserver类的文章&#xff0c;看样子这些年sqlserver没落了&#xff0c;已经后继无人了&#xff0c;再写sqlserver是不可…

asp.net mvc使用的心得和问题的解决方法(陆续更新ing)

1、在mvc下webform的分页控件不能用&#xff0c;只好自己山寨一个轻便的。 1publicclassPageHelp2{ 3 /**//// <summary> 4 /// 总页数 5 /// </summary> 6 public int TotalPageNum { get; set; } 7 /**//// <summary…

h5 一镜到底_这些一镜到底的H5还能怎么玩?

前文《单个公众号收入过亿&#xff0c;条漫为什么成为2019风口》提到&#xff0c;加入插画元素的条漫和ps拼接的长图文正处在2019年风口&#xff0c;这种现象也适合描述H5。以往扁平化的H5内容新颖&#xff0c;但视觉上缺乏大幅度的起伏。想要让H5看起来更有律动&#xff0c;就…

打开端口_打印机ip及端口设置

越洋帮路由网原创&#xff1a;文章是关于"打印机ip及端口设置"的相关知识分享&#xff0c;希望可以帮到大家。 - 素材来源网络 编辑:小易。随着科学技术的发展&#xff0c;各种技术成果也进入到千家万户&#xff0c;近日&#xff0c;有人咨询怎样设置和修改打印机ip及…

分计算iv值_快捷、经济、实用的光伏及IV曲线测试仪PVPM 1500X

PVPM 1500X IV曲线测试仪pvpm 1500x (1500V,20ADC)可测量光伏模块以及字符串或阵列的 iv 曲线。通过专利程序, 该设备可以直接在光伏系统的安装位置测量和计算峰值功率 ppk、r 和 rp。计算结果和图表可以显示在内部彩色的 tft 显示屏上。因此, 光伏系统的质量控制可以快速、经济…

Open Source Blog 开源ASP.NET/C# 博客平台 v2.5 发布(提供源码下载)

EntLib.com Blog 开源ASP.NET/C# 博客平台 v2.5 发布&#xff08;提供源码下载&#xff09;基于Subtext v2.0 开源ASP.NET博客系统的中文汉化及定制化开发&#xff0c;EntLib.com 开源博客小组根据用户的反馈意见&#xff0c;不断改进系统。2008年11月22日正式发布 EntLib.com …

兄弟3150cdn加粉后清零_兄弟MFC1618MFC1816 tn1035加粉清零方法

兄弟MFC-1618\MFC-1816 tn-1035加粉清零方法 有今天要发的题目的话؛兄弟MFC-1618\MFC-1816 tn-1035加粉清零方法 墨粉盒型号&#xff1a;兄弟TN-1035兄弟MFC-1618的清零方法有两种&#xff1a;一、清粉盒(转动粉盒右侧的齿轮180度)&#xff1b;二、在机器上操作&#xff1b;(以…

字体外面怎么加边框_有钱人家连电视墙都发“光”,大理石墙周围加一圈镜面边框,华丽...

阅读本文前&#xff0c;请您先点击上面蓝色字体&#xff0c;再点关 注这样您就可以继续免费收到文章了&#xff0c;每天都有分享&#xff0c;完全是“免费订阅”&#xff0c;请放心关注注&#xff1a;本文转载自网络&#xff0c;如有侵权&#xff0c;请在后台留言联系我们进行删…

计算机与人脑_类脑计算机:一种新型的计算系统

近日&#xff0c;中国浙江大学联合之江实验室共同研制成功了国内首台基于自主知识产权类脑芯片的类脑计算机(Darwin Mouse)。这台类脑计算机包含792颗浙江大学研制的达尔文2代类脑芯片&#xff0c;支持1.2亿脉冲神经元、近千亿神经突触&#xff0c;与小鼠大脑神经元数量规模相当…

吴玉禄他的机器人_中国人— 我们村的机器人

他是北京郊区的一名普通农民&#xff0c;二十多岁的时候突发奇想&#xff0c;一门心思要研制机器人。吴玉禄说&#xff0c;他自己也搞不清楚这个念头到底是哪儿来的。吴玉禄没有受过正规教育&#xff0c;他研制机器人所用的材料&#xff0c;都是些平时收捡来的“破烂”。吴玉禄…