• C# 数据结构与算法系列(三) 线性表之链表


    线性表的链存储称为链表。特点:存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
    链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素
    的数据域,另一个是存储下一个结点地址的指针域。
    链表有单链表,双向链表等
    下面介绍单链表的实现方法:

    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; }
            }
        }

        
    public class LinkList<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 = 0;
                
    while (p != null)
                {
                    
    ++len;
                    p 
    = p.Next;
                }
                
    return len;
            }
            
    public void clear()
            {
                head 
    = null;
            }
            
    public bool isEmpty()
            {
                
    if (head == null)
                    
    return true;
                
    else
                    
    return false;
            }
            
    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)
                {
                    
    throw new Exception("Insert: Error!");
                }
                
    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;
                }
                
    else
                {
                    
    throw new Exception("Insert: Error");
                }
            }
            
    public T Delete(int i)
            {
                
    if (isEmpty() && i < 0)
                {
                    
    throw new Exception("Error");
                }
                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
                {
                    
    return default(T);
                }
            }
            
    public T GetElem(int i)
            {
                
    if (isEmpty())
                {
                    
    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
                {
                    
    return default(T);
                }
            }
            
    public int Locate(T value)
            {
                
    if (isEmpty())
                {
                    
    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 void button1_Click(object sender, EventArgs e)
            {
                
    try
                {
                    LinkList
    <string> str = new LinkList<string>();
                    str.Head 
    = new Node<string> ("A");
                    str.Append(
    "B");
                    str.Append(
    "D");
                    str.Append(
    "E");
                    str.Insert(
    "C"5);
                    
                    richTextBox1.Text 
    = str.GetElem(1+ str.GetElem(2+ str.GetElem(3+ str.GetElem(4+ str.GetElem(5);
                }
                
    catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
  • 相关阅读:
    数据结构10——最短路径
    获取JVM转储文件的Java工具类
    如何测试这个方法--性能篇
    如何测试这个方法--功能篇
    使用WireMock进行更好的集成测试
    性能测试框架第二版
    如何使用Selenium来计算自动化测试的投资回报率?
    模糊断言
    如何从测试自动化中实现价值
    如何获取JVM堆转储文件
  • 原文地址:https://www.cnblogs.com/whtydn/p/1529233.html
Copyright © 2020-2023  润新知