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

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 2009-07-23 11:09  风浪  阅读(570)  评论(0编辑  收藏  举报