C# 实现数据结构(三)

       休整了大半个月,重新归来,继续我的数据结构之旅。

       下面是用C#语言实现数据结构中的单链表

      代码解析如下:

       1.实例化个int型的单链表,并统计出单链表的长度。

       2.定义单链表的节点

       3.定义一个单链表,实现其基本功能

       所有代码如下:

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

namespace 单链表
{
    class Program
    {
        static void Main(string[] args)
        {
            LinkList<int> d = new LinkList<int>();
            d = CreateLink();
            d.Insert(2, 5);
            Console.WriteLine("单链表的长度为{0}",d.GetLength().ToString());
        }
        //从头部插入建立单链表
        public static LinkList<int> CreateLink()
        {
            int d;
            LinkList<int> L = new LinkList<int>();
            d = Int32.Parse(Console.ReadLine());
            while (d > -1)
            {
                Node<int> p = new Node<int>(d);
                p.Next = L.Head;
                L.Head = p;
                d = Int32.Parse(Console.ReadLine());
            }
            return L;
        }
    }
    //单链表节点类
    class Node<T>
    {
        private T data; //节点的数据域
        private Node<T> next; //节点的引用,指向下一个节点
        //构造函数
        public Node(T val, Node<T> p)
        {
            data = val;
            next = p;
        }
        //构造函数
        public Node(T val)
        {
            data = val;
            next = null;
        }
        //构造函数
        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;
            }
        }
    }
    //单链表类
    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 length = 0;
            while (p != null)
            {
                ++length;
                p = p.Next;
            }

            return length;
        }
        //清空单链表
        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;
            }

            p = head;
            while (p != 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);
                    q.Next = p;
                    r.Next = q;
                    break;
                }
            }
        }
        //在单链表的第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;
            int j = 1;
            while (p != null&&j<i)
            {
                p = p.Next;
                j++;
                if (j == i)
                {
                    Node<T> q = new Node<T>(item);
                    q.Next = p.Next;
                    p.Next = q;
                    break;
                }
            }
 
        }
        //删除单链表的第i个节点
        public T Delete(int i)
        {
            if (IsEmpty() || i < 0)
            {
                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)
            {
                ++j;
                q = p;
                p = p.Next;
            }
            if (j == i)
            {
                q.Next = p.Next;
                return p.Data;
            }
            else
            {
                Console.WriteLine("所要删除的节点不存在!");
                return default(T);

            }
        }
        //获得单链表的第i个数据元素
        public T GetElem(int i)
        {
            if (IsEmpty() || i < 0)
            {
                Console.WriteLine("获取错误,请按规格填写!");
                return default(T);
            }
            Node<T> p = head;
            int j = 1;
            while (p.Next != null && j < i)
            {
                ++j;
                p = p.Next;
            }
            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 = head;
            int i = 1;
            while (p.Next != null && !p.Data.Equals(value))
            {
                p = p.Next;
                ++i;
            }
            return i;
        }

       //倒置链表
        public void RecLink(LinkList<T> H)
        {
            Node<T> p = H.Head;
            Node<T> q = new Node<T>();
            H.Head = null;
            while (p != null)
            {
                q = p;
                p = p.Next;
                q.Next = H.Head;
                H.Head = q;
            }
        }
    }

}
 

using System; using QueueDs; namespace BinaryTreeDs { public class LinkBiTree<T> { private Node<T> head; //头引用 //头引用属性 public Node<T> Head { get { return head; } set { head = value; } } //构造函数 public LinkBiTree() { head = null; } //构造函数 public LinkBiTree(T val) { Node<T> p = new Node<T>(val); head = p; } //构造函数 public LinkBiTree(T val, Node<T> lp, Node<T> rp) { Node<T> p = new Node<T>(val, lp, rp); head = p; } //判断是否是空二叉树 public bool IsEmpty() { if (head == null) { return true; } else { return false; } } //获取根结点 public Node<T> Root() { return head; } //获取结点的左孩子结点 public Node<T> GetLChild(Node<T> p) { return p.LChild; } //获取结点的右孩子结点 public Node<T> GetRChild(Node<T> p) { return p.RChild; } //将结点p的左子树插入值为val的新结点, //原来的左子树成为新结点的左子树 public void InsertL(T val, Node<T> p) { Node<T> tmp = new Node<T>(val); tmp.LChild = p.LChild; p.LChild = tmp; } //将结点p的右子树插入值为val的新结点, //原来的右子树成为新结点的右子树 public void InsertR(T val, Node<T> p) { Node<T> tmp = new Node<T>(val); tmp.RChild = p.RChild; p.RChild = tmp; } //若p非空,删除p的左子树 public Node<T> DeleteL(Node<T> p) { if ((p == null) || (p.LChild == null)) { return null; } Node<T> tmp = p.LChild; p.LChild = null; return tmp; } //若p非空,删除p的右子树 public Node<T> DeleteR(Node<T> p) { if ((p == null) || (p.RChild == null)) { return null; } Node<T> tmp = p.RChild; p.RChild = null; return tmp; } //编写算法,在二叉树中查找值为value的结点 public Node<T> Search(Node<T> root, T value) { Node<T> p = root; if (p == null) { return null; } if (!p.Data.Equals(value)) { return p; } if (p.LChild != null) { return Search(p.LChild, value); } if (p.RChild != null) { return Search(p.RChild, value); } return null; } //判断是否是叶子结点 public bool IsLeaf(Node<T> p) { if ((p != null) && (p.LChild == null) && (p.RChild == null)) { return true; } else { return false; } } //中序遍历 public void inorder(Node<T> ptr) { if (IsEmpty()) { Console.WriteLine("Tree is empty"); return; } if (ptr != null) { inorder(ptr.LChild); Console.Write(ptr.Data + " "); inorder(ptr.RChild); } } //前序遍历 public void preorder(Node<T> ptr) { if (IsEmpty()) { Console.WriteLine("Tree is empty"); return; } if (ptr != null) { Console.Write(ptr.Data + " "); preorder(ptr.LChild); preorder(ptr.RChild); } } //后序列遍历 public void postorder(Node<T> ptr) { if (IsEmpty( )) { Console.WriteLine("Tree is empty"); return; } if (ptr != null) { postorder(ptr.LChild); postorder(ptr.RChild); Console.Write(ptr.Data + " "); } } public void LevelOrder(Node<T> root) { //根结点为空 if (root == null) { return; } //设置一个队列保存层序遍历的结点 CSeqQueue<Node<T>> sq = new CSeqQueue<Node<T>>(50); //根结点入队 sq.EnQueue(root); //队列非空,结点没有处理完 while (!sq.IsEmpty()) { //结点出队 Node<T> tmp = sq.DeQueue(); //处理当前结点 Console.WriteLine("{o}", tmp); //将当前结点的左孩子结点入队 if (tmp.LChild != null) { sq.EnQueue(tmp.LChild); } if (tmp.RChild != null) { //将当前结点的右孩子结点入队 sq.EnQueue(tmp.RChild); } } } } }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值