using System;
using System.Collections.Generic;
using System.Text;

namespace SingleLinkedList
{
    class Program
    {
        static void Main(string[] args)
        {

//实例调用

}
    }

//定义单链表的结点
    //结点存储数据和下一个结点的地址(引用).这里用一个类表示.
    public class Node<T>
    {
        private T data;  //数据
        private Node<T> next; //引用

//构造器
        public Node(T val, Node<T> p)
        {
            data = val;
            next = p;
        }
       
        //构造器2
        public Node(Node<T> p)
        {
            next = p;
        }

//构造器3
        public Node(T val)
        {
            data = val;
            next = null;
        }

//构造器4
        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; }
        }
    }

//单链表类--定义操作结点的一些方法(如删除, 插入等).
    //IList<T>是.net自带的一个接口. 这里实现了这个接口.
    public class LinkList<T> : IList<T>
    {
        private Node<T> head;  //单链表的头引用

//头引用 属性
        public Node<T> Head
        {
            get { return head; }
            set { head = value; }
        }

//构造器
        public LinkList()
        {
            head = null;
        }

///<summary>
        ///求单链表的长度
        ///需要从表头开始, 一个结点一个结点遍历,直到表的末尾.
        ///</summary>
      
        public int GetLength()
        {
            Node<T> p = head;

int len = 0;
            while (p != null)
            {
                ++len;
                p = p.Next;
            }

return len;
        }

///<summary>
        /// 清空单链表
        /// head=null即可.
        /// 单链表清空后,原来结点所占用的空间不会一直保留, 而由垃圾回收器进行回收.
        ///</summary>
        public void Clear()
        {
            head = null;
        }

///<summary>
        /// 判断单链表是否为空
        /// head==null,即为空
        ///</summary>
        public bool IsEmpty()
        {
            if (head == null)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

///<summary>
        ///附加操作
        ///在单链表的末尾添加新元素
        /// </summary>
        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 < 1)
            {
                Console.WriteLine("List is empty or Position is error!");
                return;
            }

//就一个head元素.(插入到head前即可)
            if (i == 1)
            {
                Node<T> q = new Node<T>(item);
                q.Next = head;
                return;
            }

//非head(中间某一元素前插入P)
            Node<T> p = head;
            Node<T> r = new Node<T>();
            int j = 1;

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 个结点的位置后插入一个值为 item的结点.
        public void InsertPost(T item, int i)
        {
            if (IsEmpty() || i < 1)
            {
                Console.WriteLine("List is empty or Position is error!");
                return;
            }

if (i == 1)
            {
                Node<T> q = new Node<T>(item);
                q.Next = head.Next;
                head.Next = q;
                return;
            }

Node<T> p = head;
            int j = 1;

while (p != null && j < i)
            {
                p = p.Next;
                ++j;
            }

if (j == i)
            {
                Node<T> q = new Node<T>(item);
                q.Next = p.Next;
                p.Next = q;
            }
        }

//删除单链表的第 i 个结点
        public T Delete(int i)
        {
            if (IsEmpty() || i < 0)
            {
                Console.WriteLine("Link is empty or Position is error!");
                return default(T);
            }

Node<T> q = new Node<T>();
            if (i == 1)
            {
                q = head;
                head = head.Next;
                return q.Data;
            }

Node<T> p = head;
            int j = 1;

//从头一直找到 i 所在的位置
            //条件是: (1).单链表没有到末尾, (2).还没有到 i 所在的位置 ( j< i).
            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("The item node is not exist!");
                return default(T);
            }
        }

//获得单链表的第 i 个数据元素
        public T GetElem(int i)
        {
            if (IsEmpty())
            {
                Console.WriteLine("List is empty!");
                return default(T);
            }

Node<T> p = new Node<T>();
            p = head;
            int j = 1;

while (p.Next != null & j < i)
            {
                ++j;
                p = p.Next;
            }

if (j == i)
            {
                return p.Data;  //找到了.
            }
            else
            {
                Console.WriteLine("The item node is not exist!");
                return default(T);
            }
        }

///<summary>
        ///在单链表中查找值为 value 的结点
        ///</summary>
        public int Locate(T value)
        {
            if (IsEmpty())
            {
                Console.WriteLine("List is Empty!");
                return -1;
            }

Node<T> p = new Node<T>();
            p = head;
            int i = 1;
            while (!p.Data.Equals(value) && p.Next != null)
            {
                p = p.Next;
                ++i;
            }

return i;
        }

}

}

转载于:https://www.cnblogs.com/ziyiFly/archive/2008/09/04/1283909.html

C#实现--单链表(链式)相关推荐

  1. 数据结构—链表-链式存储

    头节点里面不放任何东西 头指针指向头节点 有些链表没有头节点 头指针直接指向首节点 头节点是为了方便插入和删除运算的实现 单链表的存储结构其实就是描述每一个节点是如何构成的 首先他数据域和数据类型是什 ...

  2. 洛谷 P1352 没有上司的舞会【树形DP/邻接链表+链式前向星】

    题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...

  3. 带有头节点单链表,带有头节点单链表逆置的四种方法

    文章目录 带头结点的单链表 单链表逆置的四种做法 带头结点的单链表 链式存储结构:逻辑上相邻的数据元素,并不要求物理上也相邻: 单链表的代码实现 .h文件 #pragma once typedef i ...

  4. 从零开始学数据结构和算法(二)线性表的链式存储结构

    链表 链式存储结构 定义 线性表的链式存储结构的特点是用一组任意的存储单元的存储线性表的数据元素,这组存储单元是可以连续的,也可以是不连续的. 种类 结构图 单链表 应用:MessageQueue 插 ...

  5. 线性表的链式表示——单链表

    单链表 定义 线性表的链式存储又称单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素.每个链表的结点,除存放元素自身的信息之外,还需要存放一个指向其后继结点的指针.即单链表的结构分为两部分, ...

  6. java链式结构_(Java)单链表Java语言链式结构实现(数据结构四)

    1.迭代器接口实现 package com.zhaochao; public interface Iterator { boolean hasNext(); E next(); boolean del ...

  7. 【数据结构】线性表的链式存储-单链表

    单链表的定义 线性表的链式存储又称为单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素. 为了建立起数据元素之间的线性关系,对每个链表结点,除了存放元素自身的信息之外,还需要存放一个指向其后 ...

  8. 《数据结构》c语言版学习笔记——单链表结构(线性表的链式存储结构Part1)

    线性表的链式存储结构 数据结构系列文章 第二章 单链表结构 文章目录 线性表的链式存储结构 前言 一.单链表的建立 代码 二.单链表的读取 代码 三.单链表的插入 代码 四.单链表的删除 代码 五.单 ...

  9. 数据结构之线性表-链式存储之单链表(一)

    本人文笔较差,语文从来不及格,基础不好,写此类文章仅供自己学习,理解队列及其他知识,高手大神请略过.参考书籍 <数据结构与算法分析-Java语言描述> 1.1 单链表简介 线性表的最大的缺 ...

最新文章

  1. Unity3D脚本属性
  2. 赠书 | 人工智能变“人工智障”?关于因果关系的新科学
  3. 【Android 文件管理】分区存储 ( 修改与删除图片文件 )
  4. matlab 三维核密度图_Matlab精彩画图示例:三维网状图和三维曲面图
  5. 数据库系统实训——实验四——视图
  6. 计算机可以待机无法关机,win7怎么设置不待机?如何设置自动关机的方法【详解】...
  7. Java读写二进制文件示例
  8. 2018百度之星程序设计大赛-资格赛P1002子串查询(前缀和)
  9. java编码规范概述_Java 编码规范 (转)
  10. 前端能读取压缩包内容吗?_移动硬盘出现无法读取数据还能恢复吗?
  11. Atitit opencv模板匹配attilax总结
  12. python deap_python 的 DEAP框架学习
  13. 普通链接二维码打开小程序实现动态传递参数
  14. python 数字索引转excel列名
  15. excel 与mysql交互_excel和数据库交互
  16. servlet中destory方法的误解
  17. 图神经网络的图网络学习(上)
  18. 实验:使用SSMS创建并管理数据库及其基本表
  19. 港科夜闻|香港科大(广州)(筹)与民心港人子弟学校签署合作框架协议
  20. 智慧政务行业发展报告

热门文章

  1. 50行python代码自动生成文章_如何通过50行Python代码获取公众号全部文章
  2. 再论DataSet与DataFrame的区别
  3. Windows核心编程_Miniblin(5) 前后端交互数据
  4. Windows核心编程_锁屏
  5. 多线程编程:线程死锁的原因以及解决方法
  6. 面向意图的SDN北向接口
  7. 什么是Mac地址?什么是交换机? 涉及单工,半双工,双工模式
  8. oracle:触发器,自治事务,instead of trigger,trigger
  9. ORACLE学习笔记--性能优化3
  10. C#反射的Assembly的简单应用