c#第十七课

92 阅读2分钟

哈希表

Hashtable 类代表了一系列基于键的哈希代码组织起来的键/值对。它使用来访问集合中的元素。 当您使用访问元素时,则使用哈希表,而且您可以识别一个有用的键值。哈希表中的每一项都有一个键/值对。键用于访问集合中的项目。

 //哈希表
 Hashtable table = new Hashtable();
 table.Add("name","林宇隆");//哈希表键名是唯一的
 table.Add("id",123);//哈希表键名是唯一的
 table["name"] = 3;
 foreach (DictionaryEntry i in table)
 {
     Console.WriteLine(i.Key);
     Console.WriteLine(i.Value);
 }
 //遍历键
 foreach (var i in table.Keys)
 {
     Console.WriteLine(i);
 }
 //遍历值
 foreach (var i in table.Values)
 {
     Console.WriteLine(i);
 table.Remove("name");
 Console.WriteLine(table.Contains("name"));
 Console.WriteLine(table.ContainsKey("name"));
 Console.WriteLine(table.ContainsValue(123));
 table.Clear();//清空

链表

public class LinkedNode<T>
    {
        public LinkedNode<T> nextNode;//指针域
        public LinkedNode<T> perNode;//指针域
        public T value;//值
        public LinkedNode(T value)
        {
            this.value = value;
        }
    }
    
    public class LinkList<T>
    {
        //头结点 尾结点
        public LinkedNode<T> Head;
        public LinkedNode<T> Last;

        //添加结点
        public void Add(T value)
        {
            LinkedNode<T> node = new LinkedNode<T>(value);//新节点
            node.value = value;//给结点的数值域赋值
            if (Head == null)//判断头结点是否为空
            {
                Head = node;
                Last = node;
            }else//不为空时,查到尾节点之后
            {
                Last.nextNode = node;//将该节点插入到Last的后一个结点
                Last = node;  //更新尾节点
            }
        }
        //查询  输入一个值,帮我查询返回该节点
        public bool Find(T value)
        {
            LinkedNode<T> node = Head;//从头结点开始遍历
            while (node!=null)//直到节点为空
            {   
                if (node.value.Equals(value))//判断结点的值是否为我传进来的
                {
                    return true;
                }
                node = node.nextNode;   //移到下一个结点开始判断            
            }
            return false;//未找到返回空
        }

        //删除
        public void Remove(T value)//移除某个值的节点,先找到结点
        {
            LinkedNode<T> node = Head;
            while (node != null)
            { 
                if (Head.value.Equals(value))//只有一个节点
                    {
                        Head = Head.nextNode;//将头结点指向它下一个结点(空),即删除了头结点
                    }
                if (node.nextNode.value.Equals(value))//多个结点
                {
                        //有多个结点 移除头结点 
                        if (Last.value.Equals(value))//当为末尾节点的值时,即传进来的值是尾节点的值
                        {
                            node.nextNode = null;//该节点指向空
                            Last = node;
                         }
                        else//在多个节点中间时
                        {
                            node.nextNode = node.nextNode.nextNode;//将node的指针域指向node后两个结点,相当于删除了node的下一个结点
                        }
                        //有多个结点 移除最后一个结点 last的前一个结点 前一个结点的nextnode指向空
                        //有多个结点 移除中间结点 该节点的前一个结点指向下下个节点
                    return;
                }                            
                node = node.nextNode;//移到下一个结点开始下一轮判断
            }
            return;//无该节点     
        }
    }
    
    
    
    LinkList<string> list = new LinkList<string>();
    list.Add("asd");
    list.Add("asdf");
    list.Remove("asdf");
    Console.WriteLine(list.Find("asd"));
    
    LinkedList<string> list = new LinkedList<string>();
    list.AddFirst("头");//插入到头结点前面
    //Console.WriteLine(list.First.Value);//list.First找到头结点
    list.AddLast("尾节点");
    //Console.WriteLine(list.Last.Value);//list.First找到尾结点
   list.AddBefore(list.First,"新头");//在某个结点的前面插入一个新节点
   //Console.WriteLine(list.First.Value);
     list.AddAfter(list.Last, "新尾节点");//在某个结点的后面插入一个新节点为新的尾

    //找到指定结点,没找到返回空
    LinkedListNode<string> node = list.Find("尾节点");
    //Console.WriteLine(node.Value);
    //remove 移除
    list.Remove("新尾节点");
     //Console.WriteLine(list.Last.Value);
    list.RemoveLast();
    //Console.WriteLine(list.Last.Value);
    //查询该结点是否在链表中
    //Console.WriteLine(list.Contains("新头"));

    //遍历链表
    foreach (string i in list)
    {
        Console.WriteLine(i);
    }
    Console.WriteLine(list.Last.Previous.Value);