huakaiyueluo

导航

用c#实现单链表(程序代码已经验证,完全正确)

 

1.程序的大致结构如下图:

2.下面依次列出各个类的代码

①ILISTDs.cs  这是一个接口类,列出单链表的方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 单链表
{
   public interface IListDs<T>
    {
       int GetLength();//求长度
       void Clear();//清空操作
       bool IsEmpty();//判断线性表是否为空
       void Append(T item);//附加操作
       void Insert(T item,int i);//插入操作
       T Delete(int i);//删除操作
       T GetElem(int i);//取表元
       int Locate(T value);//按值查找
    }
}

②LinkList.cs 单链表的实现类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 单链表
{
    public class LinkList<T> : IListDs<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)
            {
                p = p.Next;
                len++;
            }
            return len;
        }
        //清空单链表
        public void Clear()
        {
            head = null;
        }
        //判断是否为空
        public bool IsEmpty()
        {
          return head==null;    
}
//在单链表的末尾添加新元素 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; } //在单链表第i个位置前面插入一个值为item的节点 public void Insert(T item, int i) { if (IsEmpty() || i < 1) { Console.WriteLine("链表为空或者位置错误"); return; } 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); Node<T> m = r.Next; r.Next = q; q.Next = m; } } //在单链表第i个位置后面插入一个值为item的节点 public void InsertPost(T item, int i) { if (IsEmpty() || i < 1) { Console.WriteLine("链表为空或者位置错误"); return; } if (i == 1) { Node<T> q = new Node<T>(item); q.Next = head.Next; head.Next = 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+1) { Node<T> q = new Node<T>(item); Node<T> m = r.Next; r.Next = q; q.Next = m; } else { Console.WriteLine("插入位置过大,error"); } } public T Delete(int i) { if (IsEmpty() || i < 1) { Console.WriteLine("链表为空或者位置错误"); return default(T); } 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) { q = p; p = p.Next; j++; } if (j == i) { q.Next = p.Next; return p.Data; } else { Console.WriteLine("位置不正确"); return default(T); } } //获得单链表第i个元素 public T GetElem(int i) { if (IsEmpty()) { Console.WriteLine("链表是空链表"); return default(T); } Node<T> p = new Node<T>(); p = head; int j=1; while(p.Next!=null&&j<i) { p = p.Next; j++; } if (j == i) { return p.Data; } else { Console.WriteLine("位置不正确!"); } return default(T); } //在单链表中查找值为value的节点 public int Locate(T value) { if (IsEmpty()) { Console.WriteLine("链表是空链表!"); return -1; } Node<T> p = new Node<T>(); p = head; int i = 1; while (((p.Next!=null)&&(!p.Data.Equals(value)))) { p = p.Next; i++; } if (p == null) { Console.WriteLine("不存在这样的节点。"); return -1; } else { return i; } } } }

 

③ Node.cs   节点类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 单链表
{
    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;
            }
        }
    }
}

④Program.cs     主程序

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 单链表
{
    class Program
    {
        static void Main(string[] args)
        {
            LinkList<string> link = new LinkList<string>();
            link.Append("123");
            link.Append("567");
            link.Append("jqk");
            link.Insert("abc",2);
            link.InsertPost("def",2);
            int length = link.GetLength();
            int k=link.Locate("567");
            string m=link.GetElem(3);
            Console.WriteLine("567的位置为"+k);
            Console.WriteLine("位置为3的值为"+m);
            Console.WriteLine("链表的长度为"+length);
            Node<string> n = link.Head;
            while (n != null)
            {
                Console.WriteLine(n.Data);
                n = n.Next;
            }
        }
    }
}

 

⑤运行结果如下图,和预测结果完全一致

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2013-11-14 23:58  huakaiyueluo  阅读(11725)  评论(13编辑  收藏  举报