zoukankan      html  css  js  c++  java
  • 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);
                }
            }
  • 相关阅读:
    Fiddler给手机设置代理并抓取https链接
    速盘下载
    多版本firefox共存
    firefox45版本与seleniumIDE
    Linux基础快捷键
    解决虚拟机centOs不能上网问题
    HDU 4893 Wow! Such Sequence!(线段树)
    UVALive 7045 Last Defence
    POJ 3544 Journey with Pigs
    POJ 2499 Binary Tree
  • 原文地址:https://www.cnblogs.com/whtydn/p/1529233.html
Copyright © 2011-2022 走看看