• C#_约束 实现可排序单链表


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    /*
     使用 约束 实现可排序单链表
     */
    namespace UsingConstraints
    {
        class Employee : IComparable<Employee>
        {
            private string name;
            public Employee(string name)
            {
                this.name = name;
            }
            public override string ToString()
            {
                return this.name;
            }
    
            //实现接口
            public int CompareTo(Employee rhs)
            {
                return this.name.CompareTo(rhs.name);
            }
            public bool Equal(Employee rhs)
            {
                return this.name == rhs.name;
            }
        }
    
        //结点必须实现T的Node的IComparable
        //使用关键字where
        //约束Node只能接受实现了IComparable接口的项
        public class Node<T> : IComparable<Node<T>> where T : IComparable<T>
        {
            private T data;
            private Node<T> next = null;
            private Node<T> prev = null;
            //构造方法
            public Node(T data)
            {
                this.data = data;
            }
    
            //属性
            public T Data { get { return this.data; } }
    
            public Node<T> Next { get { return this.next; } }
    
            public int CompareTo(Node<T> rhs)
            {
                //存在约束,所以可行
                return data.CompareTo(rhs.data);
            }
    
            public bool Equals(Node<T> rhs)
            {
                return this.data.Equals(rhs.data);
            }
    
            public Node<T> Add(Node<T> newNode)
            {
                if (this.CompareTo(newNode) > 0) //在我之前
                {
                    newNode.next = this;
    
                    //如果前面有结点,将它设为新结点,作为后续
                    if (this.prev != null)
                    {
                        this.prev.next = newNode;
                        newNode.prev = this.prev;
                    }
                    //当前结点prev指向新结点
                    this.prev = newNode;
                    //返回newNode,如果它是新的头结点
                    return newNode;
                }
                else     //在我之后
                {
                    //如果后面还有结点,一同传递比较
                    if (this.next != null)
                    {
                        this.next.Add(newNode);
                    }
                    //没有后续结点了,将新结点作为后续结点
                    else
                    {
                        this.next = newNode;
                        newNode.prev = this;
                    }
                    return this;
                }
            }
    
            public override string ToString()
            {
                string output = data.ToString();
                if (next != null)
                {
                    output += ", " + next.ToString();
                }
                return output;
            }
    
        }
    
        class LinkedList<T> where T : IComparable<T>
        {
            private Node<T> headNode = null;
            //属性索引器
            public T this[int index]
            {
                get
                {
                    int ctr = 0;
    
                    Node<T> node = headNode;
    
                    while(node != null && ctr<=index)
                    {
                        if (ctr == index)
                        {
                            return node.Data;
                        }
                        else
                        {
                            node = node.Next;
                        }
                        ++ctr;
                    }
                    throw new ArgumentOutOfRangeException();
                }
            }
    
            public LinkedList()
            {
            }
    
            public void Add(T data)
            {
                if (headNode == null)
                {
                    headNode = new Node<T>(data);
                }
                else
                {
                    headNode = headNode.Add(new Node<T>(data));
                }
            }
    
    
            public override string ToString()
            {
                if (this.headNode != null)
                {
                    return this.headNode.ToString();
                }
                else
                {
                    return string.Empty;
                }
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                Program pg = new Program();
                pg.Run();
            }
    
            public void Run()
            {
                LinkedList<int> myLinkedList = new LinkedList<int>();
                Random rand =new Random();
                Console.Write("Adding: ");
                for(int i=0;i<10;i++)
                {
                    int nextInt = rand.Next(10);
                    Console.Write("{0} ",nextInt);
                    myLinkedList.Add(nextInt);
                }
                Console.WriteLine();
                Console.WriteLine("Integer: "+myLinkedList);
    
                LinkedList<Employee> empLinkedList = new LinkedList<Employee>();
                empLinkedList.Add(new Employee("John"));
                empLinkedList.Add(new Employee("Wang"));
                empLinkedList.Add(new Employee("Lee"));
                //按顺序排序后显示
                Console.WriteLine("class: " + empLinkedList);
                Console.ReadLine();
            }
        }
    }
    


  • 相关阅读:
    mysql in like GROUP_CONCAT
    StringBuilder的常用方法
    mysql 中unionall 使用
    mysql中,数据库字段为时间戳转时间的处理方法
    一个数组储存多个对象
    Java中的substring()用法
    java思想篇1
    任务调配管理
    字符窜数组去重及各种常规用法
    自定义属性的设值
  • 原文地址:https://www.cnblogs.com/MarchThree/p/3720475.html
Copyright © 2020-2023  润新知