随笔 - 163  文章 - 2  评论 - 370  阅读 - 46万 

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

复制代码
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);
            }
        }
复制代码

 

posted on   风浪  阅读(585)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示