C#数据结构:单链表

  • 1、自定义单链表结构:
  • 单链节点类
using System.Collections;
using System.Collections.Generic;
using UnityEngine; /// <summary>
/// 单链表节点
/// </summary>
/// <typeparam name="T"></typeparam>
public class Node<T>
{
private T data;//数据 private Node<T> next; //指针,下个元素 public T Data
{
get
{
return data;
} set
{
data = value;
}
} public Node<T> Next
{
get
{
return next;
} set
{
next = value;
}
} public Node()
{
data = default(T);
next = null;
} public Node(T _data, Node<T> _next)
{
this.data = _data;
this.next = _next;
} public Node(T _data)
{
this.data = _data;
this.next = null;
} public Node(Node<T> _next)
{
this.next = _next;
} }
  • 单链表类

/// <summary>
/// 单链表
/// </summary>
/// <typeparam name="T"></typeparam>
public class LinkList<T>
{
private Node<T> head;//头指针 public LinkList()
{
head = new Node<T>();
} //判空
public bool IsEmpty()
{
return head.Next == null;
} //添加操作
public void Add(T item,bool isHeadAdd=false)
{
if(isHeadAdd)
{
Insert(item, 0);
return;
} if(IsEmpty())
{
head.Next = new Node<T>(item);
}
else
{
Node<T> temp = head;
while (true)
{
if(temp.Next!=null)
{
temp = temp.Next;
}
else
{
break;
}
}
temp.Next = new Node<T>(item);
}
} //插入操作
public void Insert(T item, int index)
{
if (index < 0 || index > GetLength()) //可以插到尾部
{
Debug.LogError("index不合法!");
return;
} Node<T> newNode = new Node<T>(item);
if(index==0)//头插入
{
Node<T> temp = head.Next;
head.Next = newNode;
newNode.Next = temp;
}
else
{
Node<T> temp = head;
for (int i = 0; i < index ; i++)
{
temp = temp.Next;
}
Node<T> preNode = temp;
Node<T> currteNode = temp.Next;
preNode.Next = newNode;
newNode.Next = currteNode;
}
} //删除操作
public T Delete(int index)
{
T data = default(T);
if (index < 0 || index > GetLength()-1)
{
Debug.LogError("index不合法!");
return data;
} Node<T> temp = head;
for (int i = 0; i < index; i++)
{
temp = temp.Next;
}
Node<T> preNode = temp;
Node<T> currteNode = temp.Next;
preNode.Next = currteNode.Next;
data = currteNode.Data;
currteNode = null;
return data;
} public T this[int index]//索引器访问值
{
get
{
T data = default(T);
if (index < 0 || index > GetLength() - 1)
{
Debug.LogError("index不合法!");
return data;
} Node<T> temp = head;
for(int i=0;i<=index;i++)
{
temp = temp.Next;
}
return temp.Data;
}
} //访问index位置的值
public T GetElem(int index)
{
return this[index];
} //链表长度
public int GetLength()
{
int length = 0;
if(!IsEmpty())
{
Node<T> temp = head;
while (true)
{
if (temp.Next != null)
{
length++;
temp = temp.Next;
}
else
{
break;
}
}
}
return length;
} //寻址
public int Locate(T value)//有相同值的返回首次查找到的元素的index
{
if(!IsEmpty())
{
int index = 0;
Node<T> temp = head;
while(true)
{
if(temp.Next!=null)
{
temp = temp.Next;
if (temp.Data.Equals(value))
{
return index;
}
index++;
}
else
{
break;
}
}
Debug.Log("无此值!");
return -1;
}
else
{
Debug.Log("空表!");
return -1;
} } //清空操作
public void Clear()
{
head.Next = null;
} //显示表元素
public void Display()
{
if (IsEmpty())
{
Debug.Log("表空");
return;
}
Debug.Log("表中的值:"); int index = 0;
Node<T> temp = head;
while (true)
{
if (temp.Next != null)
{
temp = temp.Next;
Debug.Log("index:" + index.ToString() + " value:" +temp.Data);
index++;
}
else
{
break;
}
}
} }
  • 单链表测试用例:
using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class _002_SingleLinkTable : MonoBehaviour { LinkList<string> sqeList; void Start()
{
//初始化顺序表
sqeList = new LinkList<string>(); ////判空操作
Debug.Log("单链表是否为空:" + sqeList.IsEmpty()); ////添加操作
Debug.Log("头插法,添加操作--------------添加'123','456','789'");
sqeList.Add("123",true);
sqeList.Add("456",true);
sqeList.Add("789",true);
sqeList.Display();
Debug.Log("尾插法,添加操作--------------添加'123','456','789'");
sqeList.Add("123");
sqeList.Add("456");
sqeList.Add("789");
sqeList.Display(); Debug.Log("单链表是否为空:" + sqeList.IsEmpty()); ////插入操作
Debug.Log("单链表插入操作---------------在index=3处插入字符串:'111'");
sqeList.Insert("111", 3);
sqeList.Display(); ////删除操作
sqeList.Delete(2);
Debug.Log("单链表删除操作---------------删除index=2的元素");
sqeList.Display(); ////表长
Debug.Log("单链表表长-------------------单链表表长:" + sqeList.GetLength()); ////查找
Debug.Log("单链表查找--------------index查value");
Debug.Log("index=0的值:" + sqeList[0]);
Debug.Log("index=2的值:" + sqeList.GetElem(2));
Debug.Log("单链表查找--------------value查index"); ////寻址
Debug.Log("'789’的index值:" + sqeList.Locate("789")); ////清空
Debug.Log("清空单链表");
sqeList.Clear();
sqeList.Display();
} }

运行结果:


注意:

1.单链表在访问值时,只能从头节点访问下去,只能通过前一节点访问到下一节点,很多时候需要借助临时变量来存储需要的节点。

2.单链表的添加可以是尾插方式,也可以是头插法方式.

采用头插法,创建出的是一个逆序表,先输入的在最后。

3.head是表头指针head.next=null表示该表为空表,表如果不为空,head.next就是首节点,某个节点node.next=null,表示该node为尾节点

【C#】【数据结构】002-线性表:单链表的更多相关文章

  1. 数据结构之 线性表---单链表的操作B(先逆序+再删除重复元素)

    数据结构上机测试2-2:单链表操作B Time Limit: 1000MS Memory limit: 65536K 题目描述 按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删 ...

  2. 数据结构之 线性表---单链表操作A (删除链表中的指定元素)

    数据结构上机测试2-1:单链表操作A Time Limit: 1000MS Memory limit: 4096K 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据 ...

  3. Python线性表——单链表

    1. 线性表简介 线性表是一种线性结构,它是由零个或多个数据元素构成的有限序列.线性表的特征是在一个序列中,除了头尾元素,每个元素都有且只有一个直接前驱,有且只有一个直接后继,而序列头元素没有直接前驱 ...

  4. JAVA实现具有迭代器的线性表(单链表)

    一,迭代器的基本知识: 1,为什么要用迭代器?(迭代:即对每一个元素进行一次“问候”) 比如说,我们定义了一个ADT(抽象数据类型),作为ADT的一种实现,如单链表.而单链表的基本操作中,大部分需要用 ...

  5. C语言 严蔚敏数据结构 线性表之链表实现

    博主最近在考成都大学皇家计算机科学与技术专业,复习专业课数据结构,正好学习到线性结构中的线性表用链表这种存储结构来实现. 首先,数据结构包括1.数据的操作2.逻辑结构3.存储结构(数据结构三要素. 直 ...

  6. 数据结构之线性表(python版)

    数据结构之线性表(python版) 单链表 1.1  定义表节点 # 定义表节点 class LNode(): def __init__(self,elem,next = None): self.el ...

  7. [Python] 数据结构--实现顺序表、链表、栈和队列

    说明: 本文主要展示Python实现的几种常用数据结构:顺序表.链表.栈和队列. 附有实现代码. 来源主要参考网络文章. 一.顺序表 1.顺序表的结构 一个顺序表的完整信息包括两部分,一部分是表中元素 ...

  8. 用C#学习数据结构之线性表

    什么是线性表 线性表是最简单.最基本.最常用的数据结构.线性表是线性结构的抽象(Abstract),线性结构的特点是结构中的数据元素之间存在一对一的线性关系.这种一对一的关系指的是数据元素之间的位置关 ...

  9. C语言数据结构-顺序线性表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作

    1.数据结构-顺序线性表的实现-C语言 #define MAXSIZE 100 //结构体定义 typedef struct { int *elem; //基地址 int length; //结构体当 ...

  10. 【Java】 大话数据结构(2) 线性表之单链表

    本文根据<大话数据结构>一书,实现了Java版的单链表. 每个结点中只包含一个指针域的链表,称为单链表. 单链表的结构如图所示: 单链表与顺序存储结构的对比: 实现程序: package ...

随机推荐

  1. UWP 画一个圆形头像

    经常需要做一个圆形头像的样式,like this 做法很简单,直接上xaml. <Ellipse Width=" Height="> <Ellipse.Fill& ...

  2. asp.net多文件上传

    文件上传简单实现是非常容易的,但是想要更高的要求,比如通过ajax上传文件.一次上传多个文件.文件比较大等等,这里面的坑就不是很容易填(对于新手来说).因此在这里我准备通过ajax实现多文件上传.在开 ...

  3. 100 Same Tree 相同的树

    给定两个二叉树,写一个函数来检查它们是否相同.如果两棵树在结构上相同并且节点具有相同的值,则认为它们是相同的.示例 1:输入 :      1         1             / \    ...

  4. cmder安装

    官网地址:http://gooseberrycreative.com/cmder/ 一款非常漂亮好用的cmd工具. 在github或者官网下载后解压,点击Cmder.exe即可启动. 32位系统会遇到 ...

  5. css3 变换、过渡效果、动画

    1 CSS3 选择器 1.1 基本选择器 1.2 层级 空格 > + .item+li ~ .item~p 1.3 属性选择器 [attr] [attr=value] [attr^=value] ...

  6. node.js0-5初级者

    伴着<妈是心中的茉莉花> 这里,我用的sublime记事本,所以用的运行方法是终端.(后来发现git 可以省去cd切换目录). 安装node.js  官网说的很清楚. 这里我们可以在js文 ...

  7. (转载)最近总是遇到各种 IEbug,mark一下,学习到了,转载出处:http://www.cnblogs.com/ruomeng/p/5332814.html

    本文分享下我在项目中积累的IE8+兼容性问题的解决方法.根据我的实践经验,如果你在写HTML/CSS时候是按照W3C推荐的方式写的,然后下面的几点都关注过,那么基本上很大一部分IE8+兼容性问题都OK ...

  8. Ubuntu下HTTPS配置

    Ubuntu下HTTPS配置非常简单,对大部分用户而言,使用普通的自签名证书,只需按照步骤进行就可以了,无需了解密钥.证书的更多知识,更深的背景知识还有RSA算法.DES算法.X509规范.CA机构. ...

  9. Fragment 创建及替换

    1.Fragment的产生与介绍 Android运行在各种各样的设备中,有小屏幕的手机,超大屏的平板甚至电视.针对屏幕尺寸的差距,很多情况下,都是先针对手机开发一套App,然后拷贝一份,修改布局以适应 ...

  10. NBUT 1118 Marisa's Affair (排序统计,水)

    题意: 每行给出一个人名和一个int值,人名可重复出现.要求对同一个人名统计int值,最大的先输出,若相同,则按照人名出现次数,若再相同,则按照人名字典序. 思路: 输入完全部进行排序,写个比较函数传 ...