zoukankan      html  css  js  c++  java
  • 用C#学习数据结构之链表

    单链表的定义

      链表是用一组任意的存储单元来存储线性表中的数据元素(这组存储单元可以是连续的,也可以是不连续的)。那么,怎么表示两个数据元素逻辑上的相邻关系呢?即如何表示数据元素之间的线性关系呢?为此,在存储数据元素时,除了存储数据元素本身的信息外,还要存储与它相邻的数据元素的存储地址信息。这两部分信息组成该数据元素的存储映像(Image),称为结点(Node)。把存储据元素本身信息的域叫结点的数据域(Data Domain),把存储与它相邻的数据元素的存储地址信息的域叫结点的引用域(Reference Domain)。因此,线性表通过每个结点的引用域形成了一根“链条”,这就是“链表”名称的由来。
    如果结点的引用域只存储该结点直接后继结点的存储地址,则该链表叫单链表(Singly Linked List)。把该引用域叫next。单链表结点的结构如图所示,图中data表示结点的数据域。

    单链表的结点结构


    单链表结点类的实现

     1 public class Node<T>
     2     {
     3         private T data; //数据域
     4         private Node<T> next; //引用域
     5         //构造器
     6         public Node(T val, Node<T> p)
     7         {
     8             data = val;
     9             next = p;
    10         }
    11         //构造器
    12         public Node(Node<T> p)
    13         {
    14             next = p;
    15         }
    16         //构造器
    17         public Node(T val)
    18         {
    19             data = val;
    20             next = null;
    21         }
    22         //构造器
    23         public Node()
    24         {
    25             data = default(T);
    26             next = null;
    27         }
    28 
    29         //数据域属性
    30         public T Data
    31         {
    32             get
    33             {
    34                 return data;
    35             }
    36             set
    37             {
    38                 data = value;
    39             }
    40         }
    41         //引用域属性
    42         public Node<T> Next
    43         {
    44             get
    45             {
    46                 return next;
    47             }
    48             set
    49             {
    50                 next = value;
    51             }
    52         }
    53     }

    链式存储结构

    通常,我们把链表画成用箭头相连接的结点的序列,结点间的箭头表示引用域中存储的地址


    单链表类LinkList<T>的实现说明如下所示

      

      1 public class LinkList<T> : IListDS<T>
      2     {
      3         private Node<T> head; //单链表的头引用
      4         //头引用属性
      5         public Node<T> Head
      6         {
      7             get
      8             {
      9                 return head;
     10             }
     11             set
     12             {
     13                 head = value;
     14             }
     15         }
     16         //构造器
     17         public LinkList()
     18         {
     19             head = null;
     20         }
     21         //求单链表的长度
     22         public int GetLength()
     23         {
     24             Node<T> p = head;
     25             int len = 0;
     26             while (p != null)
     27             {
     28                 ++len;
     29                 p = p.Next;
     30             }
     31             return len;
     32         }
     33 
     34         //清空单链表
     35         public void Clear()
     36         {
     37             head = null;
     38         }
     39         //判断单链表是否为空
     40         public bool IsEmpty()
     41         {
     42             if (head == null)
     43             {
     44                 return true;
     45             }
     46             else
     47             {
     48                 return false;
     49             }
     50         }
     51         //在单链表的末尾添加新元素
     52         public void Append(T item)
     53         {
     54             Node<T> q = new Node<T>(item);
     55             Node<T> p = new Node<T>();
     56             if (head == null)
     57             {
     58                 head = q;
     59                 return;
     60             }
     61             p = head;
     62             while (p.Next != null)
     63             {
     64                 p = p.Next;
     65             }
     66             p.Next = q;
     67         }
     68         //在单链表的第i个结点的位置前插入一个值为item的结点
     69         public void Insert(T item, int i)
     70         {
     71             if (IsEmpty() || i < 1)
     72             {
     73                 Console.WriteLine("List is empty or Position is error!");
     74                 return;
     75             }
     76             if (i == 1)
     77             {
     78                 Node<T> q = new Node<T>(item);
     79                 q.Next = head;
     80                 head = q;
     81                 return;
     82             }
     83             Node<T> p = head;
     84             Node<T> r = new Node<T>();
     85             int j = 1;
     86             while (p.Next != null && j < i)
     87             {
     88                 r = p;
     89                 p = p.Next;
     90                 ++j;
     91             }
     92             if (j == i)
     93             {
     94                 Node<T> q = new Node<T>(item);
     95                 q.Next = p;
     96                 r.Next = q;
     97             }
     98         }
     99         //在单链表的第i个结点的位置后插入一个值为item的结点
    100         public void InsertPost(T item, int i)
    101         {
    102             if (IsEmpty() || i < 1)
    103             {
    104                 Console.WriteLine("List is empty or Position is error!");
    105                 return;
    106             }
    107             if (i == 1)
    108             {
    109                 Node<T> q = new Node<T>(item);
    110                 q.Next = head.Next;
    111                 head.Next = q;
    112                 return;
    113             }
    114             Node<T> p = head;
    115             int j = 1;
    116             while (p != null && j < i)
    117             {
    118                 p = p.Next;
    119                 ++j;
    120             }
    121             if (j == i)
    122             {
    123                 Node<T> q = new Node<T>(item);
    124                 q.Next = p.Next;
    125                 p.Next = q;
    126             }
    127         }
    128         //删除单链表的第i个结点
    129         public T Delete(int i)
    130         {
    131             if (IsEmpty() || i < 0)
    132             {
    133                 Console.WriteLine("Link is empty or Position is error!");
    134                 return default(T);
    135             }
    136             Node<T> q = new Node<T>();
    137             if (i == 1)
    138             {
    139                 q = head;
    140                 head = head.Next;
    141                 return q.Data;
    142             }
    143             Node<T> p = head;
    144             int j = 1;
    145             while (p.Next != null && j < i)
    146             {
    147                 ++j;
    148                 q = p;
    149                 p = p.Next;
    150             }
    151             if (j == i)
    152             {
    153                 q.Next = p.Next;
    154                 return p.Data;
    155             }
    156             else
    157             {
    158                 Console.WriteLine("The ith node is not exist!");
    159                 return default(T);
    160             }
    161         }
    162         //获得单链表的第i个数据元素
    163         public T GetElem(int i)
    164         {
    165             if (IsEmpty())
    166             {
    167                 Console.WriteLine("List is empty!");
    168                 return default(T);
    169             }
    170             Node<T> p = new Node<T>();
    171             p = head;
    172             int j = 1;
    173             while (p.Next != null && j < i)
    174             {
    175                 ++j;
    176                 p = p.Next;
    177             }
    178             if (j == i)
    179             {
    180                 return p.Data;
    181             }
    182             else
    183             {
    184                 Console.WriteLine("The ith node is not exist!");
    185                 return default(T);
    186             }
    187         }
    188 
    189         //在单链表中查找值为value的结点
    190         public int Locate(T value)
    191         {
    192             if (IsEmpty())
    193             {
    194                 Console.WriteLine("List is Empty!");
    195                 return -1;
    196             }
    197             Node<T> p = new Node<T>();
    198             p = head;
    199             int i = 1;
    200             while (!p.Data.Equals(value) && p.Next != null)
    201             {
    202                 p = p.Next;
    203                 ++i;
    204             }
    205             return i;
    206         }
    207     }
  • 相关阅读:
    JAVA编程心得-JAVA实现CRC-CCITT(XMODEM)算法
    自学PHP 环境搭建
    Postfix+Amavisd-new+Spamassassin+ClamAV整合安装
    安装Apache Felix OSGI Framework小记
    C#多线程
    使用maven进行测试设置断点调试的方法
    2016第33周四
    Spring配置文件头及xsd文件版本
    2016第33周二
    web中的重定向与转发
  • 原文地址:https://www.cnblogs.com/lizhizhang/p/5303930.html
Copyright © 2011-2022 走看看