用c#实现单链表(程序代码已经验证,完全正确)
1.程序的大致结构如下图:
2.下面依次列出各个类的代码
①ILISTDs.cs 这是一个接口类,列出单链表的方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 单链表
{
public interface IListDs<T>
{
int GetLength();//求长度
void Clear();//清空操作
bool IsEmpty();//判断线性表是否为空
void Append(T item);//附加操作
void Insert(T item,int i);//插入操作
T Delete(int i);//删除操作
T GetElem(int i);//取表元
int Locate(T value);//按值查找
}
}
②LinkList.cs 单链表的实现类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 单链表
{
public class LinkList<T> : IListDs<T>
{
private Node<T> head;//单链表的头引用
//头引用的属性
public Node<T> Head
{
get
{
return head;
}
set
{
head = value;
}
}
//构造器
public LinkList()
{
head = null;
}
//求单链表的长度
public int GetLength()
{
Node<T> p = head;
int len = ;
while (p != null)
{
p = p.Next;
len++;
}
return len;
}
//清空单链表
public void Clear()
{
head = null;
}
//判断是否为空
public bool IsEmpty()
{
return head==null;
}
//在单链表的末尾添加新元素
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);
Node<T> m = r.Next;
r.Next = q;
q.Next = m;
}
}
//在单链表第i个位置后面插入一个值为item的节点
public void InsertPost(T item, int i)
{
if (IsEmpty() || i < )
{
Console.WriteLine("链表为空或者位置错误");
return;
}
if (i == )
{
Node<T> q = new Node<T>(item);
q.Next = head.Next;
head.Next = 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);
Node<T> m = r.Next;
r.Next = q;
q.Next = m;
}
else
{
Console.WriteLine("插入位置过大,error");
}
}
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)
{
q = p;
p = p.Next;
j++;
}
if (j == i)
{
q.Next = p.Next;
return p.Data;
}
else
{
Console.WriteLine("位置不正确");
return default(T);
}
}
//获得单链表第i个元素
public T GetElem(int i)
{
if (IsEmpty())
{
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.Next!=null)&&(!p.Data.Equals(value))))
{
p = p.Next;
i++;
}
if (p == null)
{
Console.WriteLine("不存在这样的节点。");
return -;
}
else
{
return i;
}
}
}
}
③ Node.cs 节点类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 单链表
{
public class Node<T>
{
private T data;//数据域
private Node<T> next;//引用域
//构造器
public Node(T val, Node<T> p)
{
data = val;
next = p;
}
//构造器
public Node(Node<T> p)
{
next = p;
}
//构造器
public Node(T val)
{
data = val;
}
//构造器
public Node()
{
data = default(T);
next = null;
}
//数据域属性
public T Data {
get {
return data;
}
set {
data = value;
}
}
//引用域属性
public Node<T> Next {
get {
return next;
}
set {
next = value;
}
}
}
}
④Program.cs 主程序
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 单链表
{
class Program
{
static void Main(string[] args)
{
LinkList<string> link = new LinkList<string>();
link.Append("");
link.Append("");
link.Append("jqk");
link.Insert("abc",);
link.InsertPost("def",);
int length = link.GetLength();
int k=link.Locate("");
string m=link.GetElem();
Console.WriteLine("567的位置为"+k);
Console.WriteLine("位置为3的值为"+m);
Console.WriteLine("链表的长度为"+length);
Node<string> n = link.Head;
while (n != null)
{
Console.WriteLine(n.Data);
n = n.Next;
}
}
}
}
⑤运行结果如下图,和预测结果完全一致
用c#实现单链表(程序代码已经验证,完全正确)的更多相关文章
- 在O(n) 时间复杂度,O(1)空间复杂度内反转单链表
在LeetCode中看到判断回文的程序:https://leetcode.com/problems/palindrome-linked-list/ 里面用单链表来存储数据,先反转前半部分的单链表,然后 ...
- C++学习(三十五)(C语言部分)之 单链表
单链表 就好比火车 火车头-->链表头部火车尾-->链表尾部火车厢-->链表的节点火车厢连接的部分-->指针火车中的内容-->链表节点的的数据链表节点包含数据域和指针域数 ...
- C语言实现单链表节点的删除(带头结点)
我在之前一篇博客<C语言实现单链表节点的删除(不带头结点)>中具体实现了怎样在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表.代码演示样例上传至 https: ...
- 《程序员代码面试指南》第二章 链表问题 将单链表每K个节点之间逆序
样例 链表1-2-3-4-5-6-7-8-9-10 K=3 ,结果 3-2-1-6-5-4-9-8-7-10 java代码 /** * @Description:将单链表每K个节点之间逆序 * @Au ...
- 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点
题目 在单链表和双链表中删除倒数第K个节点 java代码 /** * @Description:在单链表和双链表中删除倒数第K个节点 * @Author: lizhouwei * @CreateDat ...
- [程序员代码面试指南]链表问题-将单链表的每k个节点之间逆序
题目描述 给定一个单链表的表头节点head,实现一个调整单链表的函数,是的每k个节点之间逆序,如果最后不够k个节点一组,则不调整最后几个节点. 题解 内部函数reverse实现链表beg到end的翻转 ...
- 左神算法书籍《程序员代码面试指南》——2_11将单链表的每K个节点之间逆序
[题目]给定一个单链表的头节点head,实现一个调整单链表的函数,使得每K个节点之间逆序,如果最后不够K个节点一组,则不调整最后几个节点.例如:链表:1->2->3->4->5 ...
- 左神算法书籍《程序员代码面试指南》——2_02在单链表和双链表中删除倒数第k个字节
[题目]分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点.[要求]如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1).[题解]从头遍历链表, ...
- 【数据结构】单链表&&静态链表详解和代码实例
喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 01 单链表(Singly Linked List ) 1.1 什么是单链表? 单链表是一种链式存储的结构.它动态的为节点分配存 ...
随机推荐
- CentOS6.5实现rsync+inotify实时同步
参考博文: 参考1:CentOS6.5实现rsync+inotify实时同步 参考2:inotify-tools+rsync实时同步文件安装和配置 CentOS 6.3下rsync服务器的安装与配置 ...
- 纯JAVA驱动:sqlserver版本不同,驱动与连接也有所区别
纯JAVA驱动:// 2005 版本:驱动:Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");连接:”jd ...
- ASP.NET MVC 5 学习教程:修改视图和布局页
原文 ASP.NET MVC 5 学习教程:修改视图和布局页 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 ...
- Python 2.7 学习笔记 基本知识
python是一种解释型的.面向对象的.带有动态语义的高级程序设计语言.本文介绍下python的基本知识. 一.安装 各种操作系统有自己的安装方法,linux系统一般都自带了python的环境.这里不 ...
- objective-C 初识
objective-C objective-c 是c语言的改进版 一.方法的定义: 格式: -/+(返回值类型)方法名:(参数类型) 参数名 [方法名] : (参数类型) 参数名......... 例 ...
- Use Node.js DDP Client on Arduino Yun to Access Meteor Server
Use Node.js DDP Client on Arduino Yun to Access Meteor Server 概述 在Arduino Yun上安装 Node.js, 并測试与 Meteo ...
- [置顶] 图书推荐:SQL Server 2012 T-SQL基础 Itzik Ben-Gan
经过近三个月的不懈努力,终于翻译完毕了.图书虽然是基础知识,但是,即使你已经使用T-SQL几年,很多地方还是能够弥补你的知识空白.大师级的人物写基础知识,或许你想知道这基础中还有哪些深奥,敬请期待吧. ...
- 【转】Lua脚本语法说明简介
Lua 的语法比较简单,学习起来也比较省力,但功能却并不弱. 所以,我只简单的归纳一下Lua的一些语法规则,使用起来方便好查就可以了.估计看完了,就懂得怎么写Lua程序了. 在Lua中,一切都是变量, ...
- Bootstrap技术: 如何给nav导航组件的tab页增加关闭按钮以及动态的添加和关闭tab页
先给出示例html代码 <div> <!-- Nav tabs --> <ul class="nav nav-tabs" role="tab ...
- Mixtile LOFT
日前,国内电子原型类开发团队Mixtile(深圳致趣科技)新推出的 Mixtile LOFT套件,受到业内著名的海外科技网站CNXSoft的关注和报道. 如果要阅读相关的原文报道,可点击这里.下面摘录 ...