asp.net C#数据结构 单链表LinkList

继续发数据结构系列~今天是单链表。

类图:

接口的代码不重复发了

 代码如下 复制代码

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(T val, Node<T> p)
    {
        _Data = val;
        _Next = p;
    }

    public Node(Node<T> p)
    {
        _Next = p;
    }

    public Node(T val)
    {
        _Data = val;
        _Next = null;
    }

    public Node()
    {
        _Data = default(T);
        _Next = null;
    }
}

 

单链表类LinkList<T>:

public class LinkList<T> : IListDs<T>
{
    private Node<T> _Head;

    public Node<T> Head
    {
        get
        {
            return _Head;
        }
        set
        {
            _Head = value;
        }
    }

    public int Length
    {
        get
        {
            Node<T> p = _Head;
            int len = 0;
            while (p != null)
            {
                ++len;
                p = p.Next;
            }
            return len;
        }
    }

    public bool IsEmpty
    {
        get
        {
            if (_Head == null)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }

    public LinkList()
    {
        _Head = null;
    }

    public void Clear()
    {
        _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;
    }

    public void Insert(T item, int i)
    {
        if (IsEmpty || i < 1)
        {
            // List is empty or Position is error
            return;
        }
        if (i == 1)
        {
            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 = 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;
        }
    }

    public void InsertPost(T item, int i)
    {
        if (IsEmpty || i < 1)
        {
            //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;
        }
    }
   
    public T Delete(int i)
    {
        if (IsEmpty || i < 0)
        {
            //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;
        while (p.Next != null && j < i)
        {
            ++j;
            q = p;
            p = p.Next;
        }
        if (j == i)
        {
            q.Next = p.Next;
            return p.Data;
        }
        else
        {
            //The ith node is not exist!
            return default(T);
        }
    }

    public T GetElement(int i)
    {
        // 转换为物理序位
        --i;

        if (IsEmpty)
        {
            //List is empty!
            return default(T);
        }
        Node<T> p = new Node<T>();
        p = _Head;
        int j = 0;
        while (p.Next != null && j < i)
        {
            ++j;
            p = p.Next;
        }
        if (j == i)
        {
            return p.Data;
        }
        else
        {
            //The ith node is not exist
            return default(T);
        }
    }

    public int Locate(T value)
    {
        if (IsEmpty)
        {
            //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;
    }
}

 

private static void LinkListTest()
{
    Console.WriteLine("LinkList Created:n---------------------------------");
    LinkList<string> lkList = CreateLListHead(new string[] { "a", "b", "c", "d" });
    PrintLinkList(lkList);
    Console.WriteLine("n");

    Console.WriteLine("Post Insert "world" into index 2:n---------------------------------");
    lkList.InsertPost("world", 2);
    PrintLinkList(lkList);
    Console.WriteLine("n");

    Console.WriteLine("Insert "hello" into index 2:n---------------------------------");
    lkList.InsertPost("hello", 2);
    PrintLinkList(lkList);
    Console.WriteLine("n");

    Console.WriteLine("Append "e":n---------------------------------");
    lkList.Append("e");
    PrintLinkList(lkList);
    Console.WriteLine("n");

    Console.WriteLine("Delete item on index 5:n---------------------------------");
    lkList.Delete(5);
    PrintLinkList(lkList);
    Console.WriteLine("n");

    Console.WriteLine("Locate item "hello":n---------------------------------");
    Console.WriteLine("#{0}", lkList.Locate("hello"));
    Console.WriteLine();

    Console.WriteLine("Clear LinkList:n---------------------------------");
    lkList.Clear();
    PrintLinkList(lkList);
    Console.WriteLine("n");

    Console.ReadKey();
}

public static LinkList<string> CreateLListHead(string[] strs)
{
    LinkList<string> L = new LinkList<string>();
    foreach (var item in strs)
    {
        Node<string> p = new Node<string>(item);
        p.Next = L.Head;
        L.Head = p;
    }
    return L;
}

 

时间: 2024-08-01 08:48:58

asp.net C#数据结构 单链表LinkList的相关文章

数据结构C#版笔记--单链表(LinkList)

上一篇学习了"顺序表(SeqList)",这一篇来看下"单链表(LinkList)".在上一篇的最后,我们指出了:顺序表要求开辟一组连续的内存空间,而且插入/删除元素时,为了保证元素的顺序性,必须对后面的元素进行移动.如果你的应用中需要频繁对元素进行插入/删除,那么开销会很大.   而链表结构正好相反,先来看下结构: 每个元素至少具有二个属性:data和next.data用来存放数据,而next用来指出它后面的元素是谁(有点"指针"的意思). 链

数据结构 单链表-求大神给我讲讲数据结构单链表和队列

问题描述 求大神给我讲讲数据结构单链表和队列 帮我彻底分析下两种结构,感激不尽多谢大神了 解决方案 单链表和队列是两个层次的事情. 单链表是一种基本的表示一个线性表的方式,它记录下当前节点的数据和指向下一个节点的指针.因此一环一环可以得到整个数据.除了单链表,我们还有数组.双向链表.循环链表等. 队列是一种先进先出的数据结构,它高于链表一个层次,这是说,你可以用链表实现队列(当然也可以用数组或者别的).另外还有先进后出的数据结构(堆栈)等. 解决方案二: 具体你可以google下wikipedi

插入删除-数据结构单链表的插入与删除

问题描述 数据结构单链表的插入与删除 设单链表某一节点为p,怎样在p节点前插入一个结点?怎样删除p节点自身?(要求:用Java语言写出具体程序语言) 解决方案 这个主要是定位问题,只要能定到节点p的位置就好. List list = new LinkedList(); list.add(list.indexOf(p), "插入内容");//由于是链表结构,所以数据插入位置的后方下标自动后移 list.remove(list.indexOf(p));//删除p节点 就是这个思路,不知道对

浅谈PHP链表数据结构(单链表)_php实例

链表:是一个有序的列表,但是它在内存中是分散存储的,使用链表可以解决类似约瑟夫问题,排序问题,搜索问题,广义表 单向链表,双向链表,环形链表 PHP的底层是C,当一个程序运行时,内存分成五个区(堆区,栈区,全局区,常量区,代码区) 规定:基本数据类型,一般放在栈区 复合数据类型,比如对象,放在堆区 定义一个类Hero 定义成员属性排名 $no 定义成员属性姓名 $name 定义成员属性昵称 $nickname 定义成员属性 $next,是一个引用,指向下一个Hero对象 定义构造函数,传递参数:

用java学习数据结构--单链表

数据|数据结构 /* * Created on 2004-9-10 * * 单链表中的结点类型声明. */package org.arliang;/** * @author 李梁 * * 单链表中的结点. */public class node{ private int data; //存放数据 private node link; //链接的下一个接点. public static void main(String[]args) { } /** * @return Returns the da

数据结构 单链表-帮我看看下面的程序哪里出错了,刚从数据结构学的单链表,运行不了

问题描述 帮我看看下面的程序哪里出错了,刚从数据结构学的单链表,运行不了 就简单的取值 插入 删除 合并 #include #include #include typedef struct LNode { int num; struct LNode *next; }LNode,*LinkList; void InitiList(LinkList L) { L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; } void LocateElem(Link

数据结构 单链表-设计算法在带头结点的单链表L中删除数据值最小的结点

问题描述 设计算法在带头结点的单链表L中删除数据值最小的结点 //单链表类型定义如下: typedef struct node { int data; struct node *next; } ListNode; typedef ListNode *LinkList; //设计算法在带头结点的单链表L中删除数据值最小的结点(设链表中各结点数据值 均不相同).函数的原型为:void f34(LinkList L)

数据结构 单链表-单链表的连接..数据结构..帮忙看一下。第一个表出来正确,但第二个练上去是一窜数字

问题描述 单链表的连接..数据结构..帮忙看一下.第一个表出来正确,但第二个练上去是一窜数字 #include #include using namespace std; typedef struct node { char data; node *next; }Node; int init(Node *&L) { L=(Node *)malloc(sizeof(Node)); L->next=NULL; return 0; } int crete(Node *&L,int a[],

C语言数据结构单链表之温故而知新

抛弃繁杂的定义,以实用,实战的角度来学习数据结构,这将使得数据结构的学习非常的简单. 前面已经学习了单链表的创建操作:http://blog.csdn.net/morixinguan/article/details/68951912 这节,将单链表温习的笔记共享出来,然后写一个例子,以防自己忘记. 1.单链表的数据结构的定义: 创建节点函数原型可定义如下: struct list *create_node(int data) ; 如何创建单链表的节点,主要分以下步骤: (1)给当前的每个节点的数