C# 线性表之单链表

数据类:

namespace 单链表
{
    /// <summary>
    /// 结点
    /// </summary>
    /// <typeparam name="T"></typeparam>
    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; }
        } 
    }
}

单链表具体实现代码:

using System;
using 线性表;

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)
            {
                _len++;
                p = p.Next;
            }

            return _len;
        }

        public void Clear()
        {
            head = null;
        }

        public bool IsEmpty()
        {
            bool _isEmpty = head == null ? true : false;
            return _isEmpty;
        }

        public bool IsFull()
        {
            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;
        }

        /// <summary>
        /// 在单链表前插入
        /// </summary>
        /// <param name="item"></param>
        /// <param name="index"></param>
        public void Insert(T item, int index)
        {
            if (IsEmpty() || index < 0 || index >= GetLength())
            {
                Console.WriteLine("List is empty or Position is error!");
                return;
            }

            Node<T> p = head;
            Node<T> r = new Node<T>();
            int j = 0;

            if (index == 0)
            {
                Node<T> q = new Node<T>(item);
                q.Next = p;
                head = q;
                return;
            }

            while (p.Next != null && j < index)
            {
                r = p;
                p = p.Next;
                j++;
            }
            if (j == index)
            {
                Node<T> q = new Node<T>(item);
                q.Next = p;
                r.Next = q;
            }
        }
        /// <summary>
        /// 后插入
        /// </summary>
        /// <param name="item"></param>
        /// <param name="index"></param>
        public void InsertPost(T item, int index)
        {
            if (IsEmpty() || index < 0 || index >= GetLength())
            {
                Console.WriteLine("List is empty or Position is error!");
                return;
            }

            Node<T> p = head;
            int j = 0;

            while (p.Next != null && j < index)
            {
                p = p.Next;
                j++;
            }
            if (j == index)
            {
                Node<T> q = new Node<T>(item);
                q.Next = p.Next;
                p.Next = q;
            }
        }

        public T Delete(int index)
        {
            if (IsEmpty() || index < 0 || index >= GetLength())
            {
                Console.WriteLine("List is empty or Position is error!");
                return default(T);
            }

            Node<T> q = new Node<T>();
            Node<T> p = head;
            int j = 0;

            if (index == 0)
            {
                q = head;
                head = head.Next;
                return q.Data;
            }

            while (p.Next != null && j < index)
            {
                q = p;
                p = p.Next;
                j++;
            }
            if (j == index)
            {
                q.Next = p.Next;
                return p.Data;
            }

            return default(T);
        }

        public T GetElem(int index)
        {
            Node<T> p = new Node<T>();
            p = head;
            int j = 0;

            while (p.Next != null && j < index)
            {
                p = p.Next;
                j++;
            }
            if (j == index)
                return p.Data;

            return default(T);
        }

        public int Locate(T value)
        {
            Node<T> p = new Node<T>();
            p = head;
            int j = 0;

            if (p.Data.Equals(value)) //要查找的值在索引0,
                return j;

            while (p.Next != null)
            {
                p = p.Next;
                j++;

                if (p.Data.Equals(value))
                    return j;
            }
            Console.WriteLine("Position is error!");
            return j;
        }

        public void Reverse()
        {
            Node<T> p = head;
            Node<T> q = new Node<T>();
            head = null;
            while (p != null)
            {
                q = p;
                p = p.Next;
                q.Next = head;
                head = q;
                Console.WriteLine(head.Data);
            }
        }
    }
}

测试代码:

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

namespace 单链表
{
    class LinkListOperator
    {
        static void Main(string[] args)
        {
            LinkList<int> linkLists = new LinkList<int>();
            linkLists.Append(1);
            linkLists.Append(2);
            linkLists.Append(3);
            linkLists.Append(4);

            for (int i = 0; i < linkLists.GetLength(); i++)
            {
                Console.WriteLine(linkLists.GetElem(i));
            }

            Console.WriteLine("===== Insert =====");
            linkLists.Insert(888, 3);

            for (int i = 0; i < linkLists.GetLength(); i++)
            {
                Console.WriteLine(linkLists.GetElem(i));
            }

            Console.WriteLine("===== InsertPost =====");
            linkLists.InsertPost(777, linkLists.GetLength() - 1);

            for (int i = 0; i < linkLists.GetLength(); i++)
            {
                Console.WriteLine(linkLists.GetElem(i));
            }

            Console.WriteLine("===== Delete =====");
            linkLists.Delete(0);

            for (int i = 0; i < linkLists.GetLength(); i++)
            {
                Console.WriteLine(linkLists.GetElem(i));
            }

            Console.WriteLine("===== Locate =====");
            Console.WriteLine(linkLists.Locate(888));


            //Console.WriteLine("===== CreateListHead 输入要添加的值 =====");
            //LinkList<int> L = CreateListHead();
            //for (int i = 0; i < L.GetLength(); i++)
            //{
            //    Console.WriteLine(L.GetElem(i));
            //}



            //Console.WriteLine("===== CreateListTail 输入要添加的值 =====");
            //LinkList<int> L1 = CreateListTail();
            //for (int i = 0; i < L1.GetLength(); i++)
            //{
            //    Console.WriteLine(L1.GetElem(i));
            //}

            //Console.WriteLine("===== Reverse  =====");
            //L1.Reverse();
            //for (int i = 0; i < L1.GetLength(); i++)
            //{
            //    Console.WriteLine(L1.GetElem(i));
            //}
            //Console.WriteLine("===== Merge  =====");
            //LinkList<int>ha=new LinkList<int>();
            //LinkList<int>hb=new LinkList<int>();
            //ha.Append(1);
            //ha.Append(3);
            //ha.Append(5);
            //ha.Append(7);
            //hb.Append(2);
            //hb.Append(4);
            //hb.Append(8);
            //hb.Append(9);

            //LinkList<int> hc = Merge(ha, hb);
            //for (int i = 0; i < hc.GetLength(); i++)
            //{
            //    Console.WriteLine(hc.GetElem(i));
            //}
            Console.WriteLine("===== Purge  =====");
            LinkList<int> ha = new LinkList<int>();
            ha.Append(1);
            ha.Append(3);
            ha.Append(3);
            ha.Append(5);
            ha.Append(5);
            ha.Append(7);
            ha.Append(7);
            ha.Append(89);
            LinkList<int> hb = Purge(ha);
            for (int i = 0; i < hb.GetLength(); i++)
            {
                Console.WriteLine(hb.GetElem(i));
            }


            Console.ReadKey();
        }

        /// <summary>
        /// 在头部插入结点建立单链表的算法
        /// </summary>
        /// <returns></returns>
        static LinkList<int> CreateListHead()
        {
            int d;
            LinkList<int> L = new LinkList<int>();

            d = Int32.Parse(Console.ReadLine());

            while (d != -1)
            {
                Node<int> q = new Node<int>(d);
                q.Next = L.Head;
                L.Head = q;
                d = Int32.Parse(Console.ReadLine());
            }

            return L;
        }

        /// <summary>
        /// 在尾部插入结点建立单链表的算法
        /// </summary>
        /// <returns></returns>
        static LinkList<int> CreateListTail()
        {
            int d;
            LinkList<int> L = new LinkList<int>();

            d = Int32.Parse(Console.ReadLine());
            Node<int> R = new Node<int>();
            R = L.Head;

            while (d != -1)
            {
                Node<int> q = new Node<int>(d);
                if (L.Head == null)
                    L.Head = q;
                else
                    R.Next = q;

                R = q;
                d = Int32.Parse(Console.ReadLine());
            }

            if (R != null)
                R.Next = null;

            return L;
        }

        /// <summary>
        /// 合并已经排序的单链表,并且再进行排序
        /// </summary>
        /// <param name="Ha"></param>
        /// <param name="Hb"></param>
        /// <returns></returns>
        static LinkList<int> Merge(LinkList<int> Ha, LinkList<int> Hb)
        {
            LinkList<int> Hc = new LinkList<int>();
            Node<int> p = Ha.Head.Next;
            Node<int> q = Hb.Head;
            Node<int> s = new Node<int>();

            Hc = Ha;
            Hc.Head.Next = null; //Hc为1

            while (p != null && q != null)
            {
                if (p.Data < q.Data)
                {
                    s = p;
                    p = p.Next;
                }
                else
                {
                    s = q;
                    q = q.Next;
                }
                Hc.Append(s.Data);
            }
            if (p == null)
            {
                p = q;
            } while (p != null)
            {
                s = p;
                p = p.Next;
                Hc.Append(s.Data);
            }
            return Hc;
        }
        static LinkList<int> Merge1(LinkList<int> Ha, LinkList<int> Hb)
        {
            LinkList<int> Hc = new LinkList<int>();
            Node<int> p = Ha.Head.Next;
            Node<int> q = Hb.Head;
            Node<int> s = new Node<int>();

            Hc = Ha;
            Hc.Head.Next = null; //Hc为1

            while (p != null && q != null)
            {
                if (p.Data < q.Data)
                {
                    s = p;
                    p = p.Next;
                }
                else
                {
                    s = q;
                    q = q.Next;
                }
                s.Next = Hc.Head.Next;
                Hc.Head.Next = s;
            }
            if (p == null)
            {
                p = q;
            } while (p != null)
            {
                s = p;
                p = p.Next;
                s.Next = Hc.Head.Next;
                Hc.Head.Next = s;
            }
            return Hc;
        }

        static LinkList<int> Purge(LinkList<int> ha)
        {
            for (int i = 0; i < ha.GetLength(); i++)
            {
                Console.WriteLine(ha.GetElem(i));
            }
            LinkList<int> Hb = new LinkList<int>();
            Node<int> p = ha.Head;
            Node<int> q = new Node<int>();
            Node<int> s = new Node<int>();
            s = p;
            p = p.Next;
            s.Next = null;
            Hb.Head = s;
            Console.WriteLine(ha.Head.Next);
            Hb.Head.Next = ha.Head.Next;
            while (p.Next != null)
            {
                s = p;
                p = p.Next;
                q = Hb.Head.Next;
                while (q.Next != null && q.Data != s.Data)
                {
                    q = q.Next;
                }
                if (q == null)
                {
                    s.Next = Hb.Head.Next;
                    Hb.Head.Next = s;
                }
            }

            return Hb;
        }
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值