Month01 Day12 数据结构总结

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

namespace _06.结构体
{
    class Program
    {
        static void Main(string[] args)
        {
            结构体是值类型
            //Student ss = new Student();//默认构造函数
            //Student s = new Student("尼古拉斯", 98, 12);
            //s.SayHello();
            //Student[] nums = new Student[1000];
            //int[] numss = new int[1000];
            Console.ReadKey();
        }
    }
  
    public struct Student
    {
        public static int age =10;
        //数据成员
        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        private int id;
        public int ID
        {
            get { return id; }
            set { id = value; }
        }
        public int Score { get; set; }
        //构造方法:初始化数据
        //因为结构体自带无参构造,所以你不能包含无参构造函数,
        //如果你写了构造方法,你需要结构体中的数据成员必须在构造方法中全字段赋值
        //public Student()
        //{

        //}
        //如果你写了构造方法,你需要在结构体中的数据成员必须在构造方法中全字段赋值
        //自动属性:有参的构造函数,先调用无参构造方法,为自动属性的字段赋值
        public Student(string _name, int _score, int _id) //: this()
        {
            this.name = _name;
            this.Score = _score;
            this.id = _id;
        }
        //方法成员
        public void SayHello()
        {
            Console.WriteLine("我是{0},我的分数{1},我的学号{2}",this.Name,this.Score,this.ID);
        }
        //没有析构函数
    }




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

namespace _07.ArrayList集合
{
    class Program
    {
        static void Main(string[] args)
        {
            #region ArrayList
            集合  动态数组
            数组: 长度不可变。类型单一
            集合:很多数据的一个集合  长度任意改变,类型不限
            //ArrayList list = new ArrayList();
            //list.Add(1);
            //list.Add(3);
            //list.Add(true);
            //list.Add("张望三");
            //list.AddRange(new int[] { 2,4,6,8,9,34,23,12});
            //list.Add(new Person());
            //list.AddRange(list);
            list.RemoveAt(5);//移除某个元素
            list.Clear();//清除
            list.Sort();//排序
            list.RemoveRange(2,2);//移除一定范围的方法
            list.Insert()
            list.Contains();//包含
            //for (int i = 0; i < list.Count; i++)
            //{
            //    if (list[i] is Person)
            //    {
            //        ((Person)list[i]).Test();
            //    }
            //    //else if (list[i] is int[])
            //    //{
            //    //    for (int j = 0; j < ((int[])list[i]).Length; j++)
            //    //    {
            //    //        Console.WriteLine(((int[])list[i])[j]);
            //    //    }
            //    //}
            //    else
            //        Console.WriteLine(list[i]);
            //}
            //Console.WriteLine(list.Count);//实际容纳量
            //Console.WriteLine(list.Capacity);//现在的最大容量,不断的扩容
            //写一个长度为10 的集合,要求在里面添加随机数10(0-9),但是所有的数字不能重复
            //ArrayList list1 = new ArrayList(10);
            //Random r = new Random();
            //for (int i = 0; i < 10; i++)
            //{
            //    //随机数
            //    int rNum = r.Next(0,10);
            //    //添加到集合中
            //    if (!list1.Contains(rNum))//集合中没有---添加
            //    {
            //        list1.Add(rNum);
            //    }
            //    else //集合中有----不能添加了(一旦产生了重复的,这次循环就不算数了 i--)
            //    {
            //        i--;
            //        //continue;
            //    }
            //}
            //for (int i = 0; i < list1.Count; i++)
            //{
            //    Console.WriteLine(list1[i]);
            //}




            #endregion

            #region 自定义的动态数组
            //MyArrayList myList = new MyArrayList();
            //for (int i = 0; i < 25; i++)
            //{
            //    myList.Add(i);
            //}
            //myList.Insert(3, 250);
            //myList.ReMove(5);
            //for (int i = 0; i < myList.Count; i++)
            //{
            //    Console.WriteLine(myList[i]);
            //}

            #endregion

            #region 缺点
            //ArrayList listP = new ArrayList();
            //Person p = new Person();
            //Person p1 = new Person();
            //Person p2= new Person();
            //listP.Add(p);
            //listP.Add(p1);
            //listP.Add(2);
            //foreach (Person item in listP)
            //{
            //    Console.WriteLine(item);
            //}
            #endregion


            Console.ReadKey();
            

        }
    }
    public class Person
    {
        public void Test()
        {
            Console.WriteLine("我是人类");
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _07.ArrayList集合
{
    class MyArrayList
    {
        private int allSize = 0;//总空间大小
        private int used = 0;//实际容纳量
        private object[] data;//用来存储集合中的元素
        public const int maxKuo = 10;//扩容的做大数值
        public int Capacity
        {
            get { return allSize;  }
        }
        public int Count
        {
            get { return used; }
        }

        public MyArrayList()
        {
            Realloc(maxKuo);
        }

        public MyArrayList(uint max)
        {
            Realloc((int)(max==0?maxKuo:max));
        }
        //索引器 :以数组的形式遍历类对象中的内容
        public object this[int index]
        {
            get
            {
                if (index >= used)
                    throw new Exception("越界了");
                return data[index];
            }
            set
            {
                if (index >= used)
                    throw new Exception("越界了");
                data[index] = value;
            }
        }
        //增删改查
        /// <summary>
        /// 添加元素的方法
        /// </summary>
        /// <param name="emelent">要添加的元素</param>
        public void Add(object emelent)
        {
            //如果容纳量够用 那就直接存储
            if (used < allSize)
            {
                data[used] = emelent;
            }
            else//不够 扩容  ---添加
            {
                int newSize = used + 1 + maxKuo;
                Realloc(newSize);
                data[used] = emelent;
            }
            used += 1;
        }

        /// <summary>
        /// //插入
        /// </summary>
        /// <param name="position">插入的位置</param>
        /// <param name="emelent">插入的元素</param>
        public void Insert(uint position, object emelent)
        {
            //是否越界
            if (position > used)
            {
                throw new Exception("孩子,越界了");
            }
            //恰巧原来的占有量和容纳量相等  扩容
            if (used + 1 > allSize)
            {
                int newSize = used + 1 + maxKuo;
                Realloc(newSize);
            }
            //找到位置
            for (int i = used; i>position ; i--)
            {
                data[i] = data[i - 1];
            }
            //插入
            data[position] = emelent;
            used += 1;
        }
        /// <summary>
        /// 移除某个元素
        /// </summary>
        /// <param name="position">删除的位置</param>
        public void ReMove(int position)
        {
            //判断是否越界
            if (position > used)
                throw new Exception("孩子,越界了");
            //找位置删了
            for (int i = position; i < used-1; i++)
            {
                data[i] = data[i + 1];
            }
            --used;
            //<10 扩容
            if (used < maxKuo)
            {
                Realloc(maxKuo+1);
            }
        }

        //清除
        public void Clear()
        {
            for (int i = 0; i < used; i++)
            {
                data[i] = null;
            }
            used = 0;
            Realloc(maxKuo);
        }

        //扩容
        public void Realloc(int newSize)
        {
            //把旧数组存起来
            object[] pData = data;
            //开辟新数组 将旧数组的元素存入到新数组中
            data = new object[newSize];
            //如果实际容纳量比新给的孔融空间还大,那就用你的空间,存不了的,存储失败
            int copySize = used > newSize ? newSize : used;
            for (int i = 0; i < copySize; i++)
            {
                data[i] = pData[i];
            }
            if (used > newSize)
            {
                used = newSize;
            }
            allSize = data.Length;//总容纳量就是新数组长度
        }
        

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

namespace _08.键值对集合
{ 
    class Program
    {

        private const String Fan = "啊阿埃挨哎唉哀皚癌藹矮艾礙愛隘鞍氨咹俺按暗岸胺案肮昂盎凹敖熬翱襖傲奧懊澳芭捌扒叭吧笆疤巴拔跋靶紦耙壩霸罷爸苩柏百擺佰敗拜稗斑癍搬扳般頒板蝂扮拌伴瓣半か絆邦幫梆榜膀綁棒磅蚌鎊傍謗苞胞包褒剝薄雹保堡飽寶菢報暴豹鮑爆杯碑悲卑丠輩褙贔鋇倍狽備憊焙被奔苯夲笨崩繃甭泵蹦迸逼鼻仳鄙筆彼碧蓖蔽畢斃毖幣庇痹閉敝弊必辟壁臂避陛鞭邊編貶扁便變卞辨辯辮遍標彪膘表鱉憋別癟彬斌瀕濱賓擯兵栤柄丙秉餅炳疒並箥菠播撥缽波博葧搏鉑箔伯帛舶脖膊渤泊駁捕卜哺補埠鈈咘步簿蔀怖擦猜裁材才財睬踩采彩菜蔡餐參蠶殘慚慘燦蒼艙倉滄藏操糙槽曹草廁策側冊測層蹭插叉茬茶查碴搽察岔差詫拆柴豺攙摻蟬饞讒纏鏟產闡顫昌猖場嘗瑺長償腸廠敞暢唱倡超抄鈔朝嘲潮巢吵炒車扯撤掣徹澈郴臣辰塵晨忱沉陳趁襯撐稱城橙成呈乘程懲澄誠承逞騁秤吃癡持匙池遲弛馳恥齒侈尺赤翅斥熾充沖蟲崇寵抽酬疇躊稠愁籌仇綢瞅醜臭初絀櫥廚躇鋤雛滁除楚礎儲矗搐觸處揣〣穿椽傳船喘串瘡窗幢床闖創吹炊捶錘垂春椿醇唇淳純蠢戳綽疵茨磁雌辭慈瓷詞此刺賜佽聰蔥囪匆從叢湊粗醋簇促躥篡竄摧崔催脆瘁粹淬翠村存団磋撮搓措挫諎搭達答瘩咑夶槑歹傣戴帶殆玳貸袋待逮怠耽擔丼單鄲撣膽旦氮但憚淡誕彈蜑當擋黨蕩檔刀搗蹈倒島禱導箌稻悼噵盜德嘚啲蹬燈登等瞪凳鄧堤低滴迪敵笛狄滌翟嫡抵底地蒂第渧弟遞締顛掂滇碘點典靛墊電佃甸店惦奠澱殿碉叼雕凋刁掉吊釣調跌爹碟蝶迭諜疊丁盯叮釘頂鼎錠萣訂丟東冬董懂動棟侗恫凍洞兜抖鬥陡豆逗痘都督蝳犢獨讀堵睹賭杜鍍肚喥渡妒端短鍛段斷緞堆兌隊對墩噸蹲敦頓囤鈍盾遁掇哆哆奪垛躲朵跺舵剁惰墮蛾峨鵝俄額訛娥惡厄扼遏鄂餓恩洏ㄦ聑爾餌洱②貳發罰筏伐乏閥法琺藩帆番翻樊礬釩繁凡煩反返范販犯飯泛坊芳方肪房防妨仿訪紡放菲非啡飝肥匪誹吠肺廢沸費芬酚吩氛汾紛墳焚汾粉奮份忿憤糞豐葑楓蜂峰鋒闏瘋烽逢馮縫諷奉鳳佛否夫敷膚孵扶拂輻幅氟符伏俘垺浮涪鍢袱弗甫撫輔俯釜斧脯腑府腐赴副覆賦複傅付阜父腹負富訃附婦縛咐噶嘎該改概鈣蓋溉幹咁杆柑竿肝趕感稈敢贛岡剛鋼缸肛綱崗港杠篙皋高膏羔糕搞鎬稿告哥歌擱戈鴿胳疙割革葛格蛤閣隔鉻個各給根哏耕哽庚羹埂耿梗工攻功恭龔供躬公宮弓鞏汞拱貢囲鉤勾溝苟狗垢構購夠辜菇咕箍估沽孤姑鼓古蠱骨穀股故顧固雇刮瓜剮寡掛褂乖拐怪棺關官冠觀管館罐慣灌貫咣廣逛瑰規圭矽歸龜閨軌鬼詭癸桂櫃跪圚劊輥滾棍鍋郭國果裹過囧骸駭海氦亥害駭酣憨邯韓含涵寒函喊罕翰撼捍旱憾悍焊汗漢夯杭航壕嚎豪毫郝恏耗號浩呵喝荷菏核禾囷何匼盒貉閡河涸赫褐鶴賀嘿嫼痕很狠恨哼亨橫衡恒轟哄烘虹鴻洪宏弘紅喉侯猴吼厚候後呼乎忽瑚壺葫胡蝴狐糊鍸弧虤唬護互滬戶婲嘩囮猾滑畫劃囮話槐徊懷淮壞歡環桓還緩換患喚瘓豢煥渙宦幻荒慌黃磺蝗簧瑝凰惶煌晃幌恍謊咴揮輝徽恢蛔囙毀悔慧卉惠晦賄穢茴燴彙諱誨繪葷昏婚魂渾混豁活夥吙獲戓惑霍貨禍擊圾基機畸稽積箕肌饑跡噭譏雞姬績緝吉極棘輯籍集及ゑ疾汲即嫉級擠幾脊己薊技冀季伎祭劑悸濟寄寂計記既忌際繼紀嘉枷夾佳镓加莢頰賈甲鉀假稼價架駕嫁殲監堅尖箋間煎兼肩艱奸緘繭檢柬堿鹼揀撿簡儉剪減薦檻鑒踐賤見鍵箭件健艦劍餞漸濺澗建僵薑將漿江疆蔣槳獎講匠醬降蕉椒礁焦膠交郊澆驕嬌嚼攪鉸矯僥腳狡角餃繳絞剿教酵轎較叫窖揭接皆秸街階截劫節莖聙晶鯨京驚精粳經囲警景頸靜境敬鏡徑痙靖竟競淨炯窘揪究糾玖韭久灸九酒廄救舊臼舅咎就疚鞠拘狙疽居駒菊局咀矩舉沮聚拒據巨具距踞鋸俱句懼炬劇捐鵑娟倦眷卷絹撅攫抉掘倔爵桔傑捷睫竭潔結解姐戒藉芥堺借介疥誡屆巾筋斤金紟津襟緊錦僅謹進靳晉禁近燼浸盡勁荊兢覺決訣絕均菌鈞軍君峻俊竣浚郡駿喀咖鉲咯開揩楷凱慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕顆科殼咳鈳渴克刻愙課肯啃墾懇坑吭涳恐孔控摳ロ扣寇枯哭窟苦酷庫褲誇垮挎跨胯塊筷儈快寬款匡筐狂框礦眶曠況虧盔巋窺葵奎魁傀饋愧潰坤昆捆困括擴廓闊垃拉喇蠟臘辣啦萊唻賴藍婪欄攔籃闌蘭瀾讕攬覽懶纜爛濫琅榔狼廊郎朗浪撈勞牢咾佬姥酪烙澇勒圞雷鐳蕾磊累儡壘擂肋類淚棱楞冷厘梨犁黎籬狸離漓悝李裏鯉禮莉荔吏栗麗厲勵礫曆利傈例俐痢竝粒瀝隸仂璃哩倆聯蓮連鐮廉憐漣簾斂臉鏈戀煉練糧涼梁粱良両輛量晾煷諒撩聊僚療燎寥遼潦叻撂鐐廖料列裂烮劣獵琳林磷霖臨鄰鱗淋凜賃吝拎玲菱零齡鈴伶羚淩靈陵嶺領另囹溜琉榴硫餾留劉瘤鋶柳六龖聾嚨籠窿隆壟攏隴嘍婁摟簍漏陋蘆盧顱廬爐擄鹵虜魯麓碌露蕗賂麤潞祿錄陸戮驢呂鋁侶旅履屢縷慮氯律率濾綠巒攣孿灤卵亂掠略掄輪倫侖淪綸論蘿螺羅邏鑼籮騾裸落洛駱絡媽麻瑪碼螞骉罵嘛嗎埋買麥賣邁脈瞞饅蠻滿蔓曼慢漫謾芒茫吂氓忙莽貓茅錨毛矛鉚卯茂冒帽貌貿仫玫枚梅酶黴煤莈眉媒鎂烸媄昧寐妹媚闁悶們萌蒙檬盟錳猛夢孟眯醚靡糜迷謎彌米秘覓泌蜜密冪棉眠綿冕免勉娩緬面苗描瞄藐秒渺廟妙蔑滅囻抿皿敏憫閩朙螟鳴銘名命謬摸摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌謀牟某拇牡畝姆毋墓暮幕募慕朩目睦牧穆拿哪呐鈉那娜納氖乃奶耐奈喃侽難囊撓腦惱鬧淖呢餒內嫩能妮霓倪苨胒擬伱匿膩逆溺蔫拈姩碾攆撚念娘釀茑尿捏聶孽齧鑷鎳涅您檸獰凝寧擰濘犇扭鈕紐膿濃農弄奴努怒囡暖虐瘧挪懦糯諾哦歐鷗毆藕嘔偶漚啪趴爬帕怕琶拍排牌徘湃派攀潘盤磐盼畔判叛乓龐旁耪胖拋咆刨炮袍跑泡呸胚培裴賠陪配佩沛噴盆砰抨烹澎彭蓬棚硼篷膨萠鵬捧碰坯砒霹批披劈琵毗啤脾疲皮匹痞僻屁譬篇偏爿騙飄漂瓢票撇瞥拼頻貧品聘乒坪蘋萍平憑瓶評屏坡潑頗嘙破魄迫粕剖撲鋪仆莆葡菩蒲埔樸圃普浦譜曝瀑期欺棲戚妻七淒漆柒沏其棋奇歧畦崎臍齊旗祈祁騎起豈乞企啟契砌器気迄棄汽泣訖掐洽牽扡釺鉛芉遷簽仟謙乾黔錢鉗前潛遣淺譴塹嵌欠歉槍嗆腔羌牆薔強搶橇鍬敲悄橋瞧喬僑巧鞘撬翹峭俏竅切茄且怯竊欽侵儭秦琴勤芹擒禽寢沁圊輕氫傾卿清擎晴氰情頃請慶瓊窮秋丘邱浗求囚酋泅趨區蛆曲軀屈驅渠取娶齲趣去圈顴權醛灥铨痊拳猋券勸缺炔瘸卻鵲榷確雀裙群然燃冉染瓤壤攘嚷讓饒擾繞惹熱壬仁囚忍韌任認刃妊紉扔仍ㄖ戎茸蓉榮融熔溶容絨冗揉柔禸茹蠕儒孺洳辱乳汝入褥軟阮蕊瑞銳閏潤若弱撒灑薩腮鰓塞賽三三傘散桑嗓喪搔騷掃嫂瑟銫澀森僧莎砂殺刹沙紗儍啥煞篩曬珊苫杉屾刪煽衫閃陝擅贍膳善汕扇繕墒傷商賞晌仩尚裳梢捎稍燒芍勺韶尐哨邵紹奢賒蛇舌舍赦攝射懾涉社設砷申呻伸身深娠紳神沈審嬸甚腎慎滲聲苼甥牲升繩渻盛剩勝聖師夨獅施濕詩屍虱┿石拾塒什喰蝕實識史矢使屎駛始式示壵卋柿倳拭誓逝勢昰嗜噬適仕侍釋飾氏市恃室視試收掱首垨壽授售受瘦獸蔬樞梳殊抒輸菽舒淑疏圕贖孰熟薯暑曙署蜀黍鼠屬術述樹束戍豎墅庶數漱恕刷耍摔衰甩帥栓拴霜雙爽誰沝睡稅吮瞬順舜詤碩朔爍斯撕嘶思私司絲迉肆寺嗣四伺似飼巳松聳慫頌送宋訟誦搜艘擻嗽蘇酥俗素速粟僳塑溯宿訴肅酸蒜算雖隋隨綏髓誶歲穗遂隧祟孫損筍蓑梭唆縮瑣索鎖所塌彵咜她塔獺撻蹋踏胎苔抬囼泰酞呔態汰坍攤貪癱灘壇檀痰潭譚談坦毯袒碳探歎炭湯塘搪堂棠膛唐糖倘躺淌趟燙掏濤滔絛萄桃逃淘陶討套特藤騰疼謄梯剔踢銻提題蹄啼體替嚏惕涕剃屜兲添填畾憇恬舔腆挑條迢眺跳貼鐵帖廳聽烴汀廷停亭庭挺艇通桐酮瞳哃銅彤童桶捅筒統痛偷投頭透凸禿突圖徒途塗屠汢吐兔湍團推穨腿蛻褪退吞屯臀拖托脫鴕陀馱駝橢妥拓唾挖哇蛙窪娃瓦襪歪外豌彎灣玩頑丸烷完碗挽晚皖惋宛婉萬腕汪迋亡枉網往旺望莣妄威巍微危韋違桅圍唯惟為濰維葦萎委偉偽尾緯未蔚菋畏胃喂魏位渭謂尉慰衛瘟溫蚊攵聞紋吻穩紊問嗡翁甕撾蝸渦窩莪斡臥握沃莁嗚鎢烏汙誣屋無蕪梧吾吳毋武五捂午舞伍侮塢戊霧晤粅勿務悟誤昔熙析覀硒矽晰嘻吸錫犧稀息希悉膝夕惜熄烯溪汐犀檄襲席習媳囍銑洗系隙戲細瞎蝦匣霞轄暇峽俠狹丅廈夏嚇掀鍁先仙鮮纖鹹賢銜舷閑涎弦嫌顯險哯獻縣腺餡羨憲陷限線相廂鑲馫箱襄湘鄉翔祥詳想響享項巷橡像姠潒蕭硝霄削哮囂銷消宵淆曉曉孝校肖嘯笑效楔些歇蠍鞋協挾攜邪斜脅諧寫械卸蟹懈泄瀉謝屑薪芯鋅欣辛噺忻惢信釁煋腥猩惺興刑型形邢荇醒圉杏性姓兄凶胸匈洶雄熊休修羞朽嗅鏽秀袖繡墟戌需虛噓須徐許蓄酗敘旭序畜恤絮婿緒續軒喧宣懸旋玄選癬眩絢靴薛學穴雪血勳熏循旬詢尋馴巡殉汛訓訊遜迅壓押鴉鴨吖丫芽牙蚜崖衙涯雅啞亜訝焉咽閹煙淹鹽嚴研蜒岩延訁顏閻燚沿奄掩眼衍演豔堰燕厭硯雁唁彥焰宴諺驗殃央鴦秧楊揚佯瘍羴洋陽氧仰癢養樣漾邀腰妖瑤搖堯遙窯謠姚咬舀藥偠耀椰噎耶爺野冶吔頁掖業旪曳腋夜液┅壹醫揖銥依伊衤頤夷遺移儀胰疑沂宜姨彝椅蟻倚巳乙矣鉯藝抑噫邑屹億役臆逸肄疫亦裔意毅憶図益溢詣議誼譯異翼翌繹茵蔭因殷喑陰姻吟銀淫寅飲尹引隱茚英櫻嬰鷹應纓瑩螢營熒蠅迎贏盈影穎硬映喲擁傭臃癰庸雍踴蛹詠泳湧詠恿勇鼡幽優悠憂尤由郵鈾猶油遊酉洧伖右佑釉誘又呦迂淤於盂榆虞愚輿餘俞逾鱻愉渝漁隅予娛雨與嶼禹宇語羽玊域芋鬱籲遇喻峪禦愈欲獄育譽浴寓裕預豫馭鴛淵冤え垣袁原援轅園員圓猿源緣遠苑願怨院曰約越躍鑰嶽粵仴悅閱耘雲鄖勻隕尣運蘊醞暈韻孕匝砸雜栽哉災宰載洅茬咱攢暫贊贓贓葬遭糟鑿藻棗早澡蚤躁噪造皂灶燥責擇則澤賊怎增憎曾贈紮喳渣劄軋鍘閘眨柵榨咋乍炸詐摘齋宅窄債寨瞻氈詹粘沾盞斬輾嶄展蘸棧占戰站湛綻樟嶂彰漳涨掌漲杖丈帳賬仗脹瘴障招昭找沼趙照罩兆肇召遮折哲蟄轍者鍺蔗這浙珍斟眞甄砧臻貞針偵枕疹診震振鎮陣蒸掙睜征猙爭怔整拯㊣政幀症鄭證芝枝支吱蜘知肢脂汁の織職直植殖執徝侄址指止趾呮旨紙志摯擲至致置幟峙制智秩稚質炙痔滯治窒ф盅忠鍾衷終種腫重仲眾舟周州洲謅粥軸肘帚咒皺宙晝驟珠株蛛朱豬諸誅逐竹燭煮拄矚囑主著柱助蛀貯鑄築住紸祝駐抓爪拽專磚轉撰賺篆樁莊裝妝撞壯狀椎錐縋贅墜綴諄准捉拙卓桌琢茁酌啄著灼濁茲咨資姿滋淄孜紫仔籽滓孓自漬芓鬃棕蹤宗綜總縱鄒赱奏揍租足卒族祖詛阻組鑽纂嘴醉朂罪尊遵昨咗佐柞做作唑座";
        private const String Jian = "啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳病并玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳捕卜哺补埠不布步簿部怖擦猜裁材才财睬踩采彩菜蔡餐参蚕残惭惨灿苍舱仓沧藏操糙槽曹草厕策侧册测层蹭插叉茬茶查碴搽察岔差诧拆柴豺搀掺蝉馋谗缠铲产阐颤昌猖场尝常长偿肠厂敞畅唱倡超抄钞朝嘲潮巢吵炒车扯撤掣彻澈郴臣辰尘晨忱沉陈趁衬撑称城橙成呈乘程惩澄诚承逞骋秤吃痴持匙池迟弛驰耻齿侈尺赤翅斥炽充冲虫崇宠抽酬畴踌稠愁筹仇绸瞅丑臭初出橱厨躇锄雏滁除楚础储矗搐触处揣川穿椽传船喘串疮窗幢床闯创吹炊捶锤垂春椿醇唇淳纯蠢戳绰疵茨磁雌辞慈瓷词此刺赐次聪葱囱匆从丛凑粗醋簇促蹿篡窜摧崔催脆瘁粹淬翠村存寸磋撮搓措挫错搭达答瘩打大呆歹傣戴带殆代贷袋待逮怠耽担丹单郸掸胆旦氮但惮淡诞弹蛋当挡党荡档刀捣蹈倒岛祷导到稻悼道盗德得的蹬灯登等瞪凳邓堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔颠掂滇碘点典靛垫电佃甸店惦奠淀殿碉叼雕凋刁掉吊钓调跌爹碟蝶迭谍叠丁盯叮钉顶鼎锭定订丢东冬董懂动栋侗恫冻洞兜抖斗陡豆逗痘都督毒犊独读堵睹赌杜镀肚度渡妒端短锻段断缎堆兑队对墩吨蹲敦顿囤钝盾遁掇哆多夺垛躲朵跺舵剁惰堕蛾峨鹅俄额讹娥恶厄扼遏鄂饿恩而儿耳尔饵洱二贰发罚筏伐乏阀法珐藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛坊芳方肪房防妨仿访纺放菲非啡飞肥匪诽吠肺废沸费芬酚吩氛分纷坟焚汾粉奋份忿愤粪丰封枫蜂峰锋风疯烽逢冯缝讽奉凤佛否夫敷肤孵扶拂辐幅氟符伏俘服浮涪福袱弗甫抚辅俯釜斧脯腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐噶嘎该改概钙盖溉干甘杆柑竿肝赶感秆敢赣冈刚钢缸肛纲岗港杠篙皋高膏羔糕搞镐稿告哥歌搁戈鸽胳疙割革葛格蛤阁隔铬个各给根跟耕更庚羹埂耿梗工攻功恭龚供躬公宫弓巩汞拱贡共钩勾沟苟狗垢构购够辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇刮瓜剐寡挂褂乖拐怪棺关官冠观管馆罐惯灌贯光广逛瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚棍锅郭国果裹过哈骸孩海氦亥害骇酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉夯杭航壕嚎豪毫郝好耗号浩呵喝荷菏核禾和何合盒貉阂河涸赫褐鹤贺嘿黑痕很狠恨哼亨横衡恒轰哄烘虹鸿洪宏弘红喉侯猴吼厚候后呼乎忽瑚壶葫胡蝴狐糊湖弧虎唬护互沪户花哗华猾滑画划化话槐徊怀淮坏欢环桓还缓换患唤痪豢焕涣宦幻荒慌黄磺蝗簧皇凰惶煌晃幌恍谎灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘荤昏婚魂浑混豁活伙火获或惑霍货祸击圾基机畸稽积箕肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际继纪嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁歼监坚尖笺间煎兼肩艰奸缄茧检柬碱硷拣捡简俭剪减荐槛鉴践贱见键箭件健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲匠酱降蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖揭接皆秸街阶截劫节茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净炯窘揪究纠玖韭久灸九酒厩救旧臼舅咎就疚鞠拘狙疽居驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧捐鹃娟倦眷卷绢撅攫抉掘倔爵桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸尽劲荆兢觉决诀绝均菌钧军君峻俊竣浚郡骏喀咖卡咯开揩楷凯慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕颗科壳咳可渴克刻客课肯啃垦恳坑吭空恐孔控抠口扣寇枯哭窟苦酷库裤夸垮挎跨胯块筷侩快宽款匡筐狂框矿眶旷况亏盔岿窥葵奎魁傀馈愧溃坤昆捆困括扩廓阔垃拉喇蜡腊辣啦莱来赖蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥琅榔狼廊郎朗浪捞劳牢老佬姥酪烙涝勒乐雷镭蕾磊累儡垒擂肋类泪棱楞冷厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利傈例俐痢立粒沥隶力璃哩俩联莲连镰廉怜涟帘敛脸链恋炼练粮凉梁粱良两辆量晾亮谅撩聊僚疗燎寥辽潦了撂镣廖料列裂烈劣猎琳林磷霖临邻鳞淋凛赁吝拎玲菱零龄铃伶羚凌灵陵岭领另令溜琉榴硫馏留刘瘤流柳六龙聋咙笼窿隆垄拢陇楼娄搂篓漏陋芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮驴吕铝侣旅履屡缕虑氯律率滤绿峦挛孪滦卵乱掠略抡轮伦仑沦纶论萝螺罗逻锣箩骡裸落洛骆络妈麻玛码蚂马骂嘛吗埋买麦卖迈脉瞒馒蛮满蔓曼慢漫谩芒茫盲氓忙莽猫茅锚毛矛铆卯茂冒帽貌贸么玫枚梅酶霉煤没眉媒镁每美昧寐妹媚门闷们萌蒙檬盟锰猛梦孟眯醚靡糜迷谜弥米秘觅泌蜜密幂棉眠绵冕免勉娩缅面苗描瞄藐秒渺庙妙蔑灭民抿皿敏悯闽明螟鸣铭名命谬摸摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谋牟某拇牡亩姆母墓暮幕募慕木目睦牧穆拿哪呐钠那娜纳氖乃奶耐奈南男难囊挠脑恼闹淖呢馁内嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵捻念娘酿鸟尿捏聂孽啮镊镍涅您柠狞凝宁拧泞牛扭钮纽脓浓农弄奴努怒女暖虐疟挪懦糯诺哦欧鸥殴藕呕偶沤啪趴爬帕怕琶拍排牌徘湃派攀潘盘磐盼畔判叛乓庞旁耪胖抛咆刨炮袍跑泡呸胚培裴赔陪配佩沛喷盆砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰坯砒霹批披劈琵毗啤脾疲皮匹痞僻屁譬篇偏片骗飘漂瓢票撇瞥拼频贫品聘乒坪苹萍平凭瓶评屏坡泼颇婆破魄迫粕剖扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫掐洽牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍切茄且怯窃钦侵亲秦琴勤芹擒禽寝沁青轻氢倾卿清擎晴氰情顷请庆琼穷秋丘邱球求囚酋泅趋区蛆曲躯屈驱渠取娶龋趣去圈颧权醛泉全痊拳犬券劝缺炔瘸却鹊榷确雀裙群然燃冉染瓤壤攘嚷让饶扰绕惹热壬仁人忍韧任认刃妊纫扔仍日戎茸蓉荣融熔溶容绒冗揉柔肉茹蠕儒孺如辱乳汝入褥软阮蕊瑞锐闰润若弱撒洒萨腮鳃塞赛三叁伞散桑嗓丧搔骚扫嫂瑟色涩森僧莎砂杀刹沙纱傻啥煞筛晒珊苫杉山删煽衫闪陕擅赡膳善汕扇缮墒伤商赏晌上尚裳梢捎稍烧芍勺韶少哨邵绍奢赊蛇舌舍赦摄射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲升绳省盛剩胜圣师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试收手首守寿授售受瘦兽蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱恕刷耍摔衰甩帅栓拴霜双爽谁水睡税吮瞬顺舜说硕朔烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟僳塑溯宿诉肃酸蒜算虽隋随绥髓碎岁穗遂隧祟孙损笋蓑梭唆缩琐索锁所塌他它她塔獭挞蹋踏胎苔抬台泰酞太态汰坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭汤塘搪堂棠膛唐糖倘躺淌趟烫掏涛滔绦萄桃逃淘陶讨套特藤腾疼誊梯剔踢锑提题蹄啼体替嚏惕涕剃屉天添填田甜恬舔腆挑条迢眺跳贴铁帖厅听烃汀廷停亭庭挺艇通桐酮瞳同铜彤童桶捅筒统痛偷投头透凸秃突图徒途涂屠土吐兔湍团推颓腿蜕褪退吞屯臀拖托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄威巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫瘟温蚊文闻纹吻稳紊问嗡翁瓮挝蜗涡窝我斡卧握沃巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误昔熙析西硒矽晰嘻吸锡牺稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细瞎虾匣霞辖暇峡侠狭下厦夏吓掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象萧硝霄削哮嚣销消宵淆晓小孝校肖啸笑效楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑薪芯锌欣辛新忻心信衅星腥猩惺兴刑型形邢行醒幸杏性姓兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须徐许蓄酗叙旭序畜恤絮婿绪续轩喧宣悬旋玄选癣眩绚靴薛学穴雪血勋熏循旬询寻驯巡殉汛训讯逊迅压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾邀腰妖瑶摇尧遥窑谣姚咬舀药要耀椰噎耶爷野冶也页掖业叶曳腋夜液一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎茵荫因殷音阴姻吟银淫寅饮尹引隐印英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映哟拥佣臃痈庸雍踊蛹咏泳涌永恿勇用幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁吁遇喻峪御愈欲狱育誉浴寓裕预豫驭鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨允运蕴酝晕韵孕匝砸杂栽哉灾宰载再在咱攒暂赞赃脏葬遭糟凿藻枣早澡蚤躁噪造皂灶燥责择则泽贼怎增憎曾赠扎喳渣札轧铡闸眨栅榨咋乍炸诈摘斋宅窄债寨瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛绽樟章彰漳张掌涨杖丈帐账仗胀瘴障招昭找沼赵照罩兆肇召遮折哲蛰辙者锗蔗这浙珍斟真甄砧臻贞针侦枕疹诊震振镇阵蒸挣睁征狰争怔整拯正政帧症郑证芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终种肿重仲众舟周州洲诌粥轴肘帚咒皱宙昼骤珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑住注祝驻抓爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘坠缀谆准捉拙卓桌琢茁酌啄着灼浊兹咨资姿滋淄孜紫仔籽滓子自渍字鬃棕踪宗综总纵邹走奏揍租足卒族祖诅阻组钻纂嘴醉最罪尊遵昨左佐柞做作坐座";
        static void Main(string[] args)
        {
           
            #region    //键值对集合 Hashtable
            Hashtable hash = new Hashtable();
            hash.Add(1, "张三");
            hash.Add(2, "李四");
            hash.Add(true, "正确的");
            hash.Add(3, '女');
            hash[1] = "西西";//把张三 干掉
            //hash[5] = 90;//这也是一种添加数据的方式
            //if (!hash.ContainsKey(1))
            //{
            //    hash[1] = "哈哈哈哈,屁噔噔";
            //}
            //else
            //{
            //    Console.WriteLine(hash[1]);
            //}
            //Console.WriteLine(hash[true]);

            foreach (var item in hash.Keys)
            {
                Console.WriteLine("键是{0}。。。。。。。。值{1}", item, hash[item]);
            }
            #endregion

            //Hashtable ht = new Hashtable();
            将繁体字和简体字存到hash中
            //for (int i = 0; i < Jian.Length; i++)
            //{
            //    ht.Add(Jian[i],Fan[i]);
            //}
            //Console.WriteLine("请输入");
            //string input = Console.ReadLine();
            //for (int i = 0; i < input.Length; i++)
            //{
            //    //如果键值对集合中有转换称繁体字
            //    if (ht.ContainsKey(input[i]))
            //    {
            //        Console.Write(ht[input[i]]);
            //    }
            //    else//否则 原来的简体字输出
            //    {
            //        Console.Write(input[i]);
            //    }
            //}

            Console.ReadKey();
        }
        

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

namespace _09.list泛型集合
{
    class Program
    {
        //泛型就是一种逻辑应用到不同类型的机制
        static void Main(string[] args)
        {
            
            //list存储数据,类型由调用者决定
            List<int> list = new List<int>();
            list.Add(3);
            list.Add(5);
            for (int i = 1; i <= 10; i++)
            {
                //list[i] = i;//不能直接赋值 只能是再添加了元素之后再修改
                list.Add(i);//没有元素的时候只能用add方法添加元素
            }
            list.RemoveAt(3);//根据你传的下标移除相应的元素
            //for (int i = 0; i < list.Count; i++)
            //{
            //    list.RemoveAt(i);//移除一定注意尽量不放在for循环中,放了那循环条件一定是小于集合的长度的list.Count
            //}
            //list.Remove(5);//移除元素第一个相对应的元素

            //list.Insert(5,99);//在相应的位置上插入元素

            //list.IndexOf(99);//从前往后找指定的元素
            //list.LastIndexOf(99);//从后往前找特定的元素
            //list.Sort();//排序
            //list.Remove();//反转
            //list.Contains();//包含
            //集合可以转数组 ,数组也可以转集合
           int[] nums = list.ToArray();//集合转换成数组
            //数组转换成集合
            string[] strs = new string[5] { "q","q","1","2","3",};
            List<string> listS = strs.ToList();    //数组转换成集合
            listS.Add("qwe");
            for (int i = 0; i < list.Count; i++)
            {
                Console.WriteLine("对应的下标{0}--------对应的元素{1}",i,list[i]);
            }
            //两个集合 存储{abcde}{defghi} 将两个集合重复的去掉合成一个集合
            Console.ReadKey();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _01.DataSttuct
{
    class Program
    {
        static void Main(string[] args)
        {

            
            #region 单向链表
            //LinkedList
            //MyLinkList<int> list = new MyLinkList<int>();
            //for (int i = 0; i < 15; i++)
            //{
            //    list.Add(i);
            //}
            //list.InsertForward(1999,4);
            //list.InsertBack(1999,8);
            //list.ReMoveAt(3);
            //for (int i = 0; i < list.Count; i++)
            //{
            //    int num = list.GetData((uint)i).Data;
            //    Console.WriteLine(num);
            //}
            #endregion

            #region 双向链表
            //DoubleLinkList<int> dList = new DoubleLinkList<int>();
            //for (int i = 0; i < 15; i++)
            //{
            //    //if (i == 0)
            //    //    dList.AddFirst(i);//添加头节点
            //    //else
            //        dList.InsertBack(i, i);//头节点以外的节点用后插的方式添加
            //}
            //dList.InsertForward(0, 1999999);
            //dList.ReMoveAt(10);
            //for (int i = 0; i < dList.Count; i++)
            //{
            //    Console.WriteLine("(" + i + ")" + "-----------" + dList.GetNode(i).Data);
            //}
            #endregion

            #region 栈
            //C# 自带的栈    Stack
            //MyStack<int> stack = new MyStack<int>();
            //for (int i = 0; i < 5; i++)
            //{
            //    stack.Puch(i);
            //}
            Console.WriteLine("请输入1个10以内的数字");
            int num = Convert.ToInt32(Console.ReadLine());
            while (num > 0)//循环添加
            {
                stack.Puch(num%2);
                num = num >> 2;
            }
            //while (!stack.Isempty)
            //{
            //    Console.WriteLine(stack.Pop().ToString());
            //}
            #endregion

            #region 队列
            //MyQueue<int> queue = new MyQueue<int>();
            //for (int i = 0; i < 10; i++)
            //{
            //    queue.EQueue(i);
            //}
            //Console.WriteLine("队列数量:"+queue.Count);
            //for (; !queue.IsEmpty; )
            //{
            //    Console.WriteLine("队列数据:"+queue.DQueue().ToString());
            //}
            //Console.WriteLine("队列数量:" + queue.Count);
            #endregion
            //判断字符串是否是回文
            string str = "ABCDEDCBA";
            MyStack<char> s = new MyStack<char>();
            MyQueue<char> q = new MyQueue<char>();
            for (int i = 0; i < str.Length; i++)//将字符串中的所有字符存到栈中和队列中
            {
                char strNode = str[i];
                s.Puch(strNode);//入栈
                q.EQueue(strNode);//入队
            }
            bool isP = false; //是否是回文
            for (int i = 0; i < str.Length; i++)//判定字符串中的每一个元素是否是回文
            {
                if (s.Pop() == q.DQueue())//将出栈的元素和出队的元素进行比较
                {
                    isP = true;
                }
                else
                    isP = false;
            }
            if(isP)
                Console.WriteLine("字符串是回文");
            else
                Console.WriteLine("字符串不是回文");

            Console.ReadKey();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _01.DataSttuct
{
    /// <summary>
    /// 表示链表的节点
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class MyNode<T>
    {
        //数据
        private T pData;//数据元素
        private MyNode<T> _next;//直接后继
        private MyNode<T> _front;//直接前驱
        //属性
        public T Data
        {
            get { return pData; }
            set { pData = value; }
        }
        public MyNode<T> Next
        {
            get { return _next; }
            set { _next = value; }
        }
        public MyNode<T> Front
        {
            get { return _front; }
            set { _front = value; }
        }
        //构造方法
        public MyNode()
        {
            pData = default(T);
            _front = _next = null;
        }
        public MyNode(T data)
        {
            pData = data;
            _front = _next = null;
        }
        public MyNode(T data, MyNode<T> next)
        {
            pData = data;
            _front = null;
            _next = next;
        }
    }
    /// <summary>
    /// 处理链表的操作
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class MyLinkList<T>
    {
        uint size = 0;//数量
        MyNode<T> head;//表头
        MyNode<T> end;//表尾

        //属性
        public uint Count
        {
            get { return size; }
        }
        //判断链表是否为空
        public bool IsEmpty { get { return head == null ? true : false; } }
        
        //链表的数据处理及存储

        /// <summary>
        /// 往链表中添加元素
        /// </summary>
        /// <param name="data">添加的元素</param>
        public void Add(T data)
        {
            //将别人添加的元素变成节点(元素+引用)
            MyNode<T> newNode = new MyNode<T>(data);
            //链表是空的,你添加的元素是表头
            if (IsEmpty)
            {
                head = newNode;//因为链表为空,所以新添加的元素是头结点
            }
            else//链表不是空的,你添加的元素是表尾
            {
                end.Next = newNode;//原来尾巴节点的后继变成了新添加的节点
            }
            end = newNode;//新添加的元素变成了尾巴节点
            //数量++
            ++size;
        }
        /// <summary>
        /// 前插元素
        /// </summary>
        /// <param name="data">插入的元素</param>
        /// <param name="postion">插入的位置</param>
        public bool InsertForward(T data,uint postion)
        {
            string str = "";
            bool isRet = false;
            do
            {
                //插入失败
                //链表为空
                if (IsEmpty)
                {
                    str = ("这是一个空链表,不可以插入哦");
                    isRet = false;
                    break;
                }
                else if (postion >= size)//位置大于等于实际容纳量
                {
                    str = ("娃娃,位置越界了,不可以插入哦");
                    isRet = false;
                    break;
                }
                //插入成功
                //将别人添加的元素变成节点(元素+引用)
                MyNode<T> newNode = new MyNode<T>(data);
                if (postion == 0)//1,插在头前面
                {
                    newNode.Next = head;//原来的头结点变成了新插入节点的后继
                    head = newNode;//新插入的节点变成了新的头
                    isRet = true;
                }
                else//2,插在中间位置
                {
                    //找到相对应的元素节点
                    // MyNode<T> tempNode = head;//临时节点,为了寻找被插的元素
                    //MyNode<T> tempFront = new MyNode<T>();//临时变量记录前驱
                    //uint temoIndex = 1;
                    //while (tempNode.Next != null && temoIndex <= postion)//循环找到被插的元素
                    //{
                    //    tempFront = tempNode;//记录前驱
                    //    tempNode = tempNode.Next;//根据后继依次寻找下去
                    //    ++temoIndex;
                    //}
                    MyNode<T> tempNode = GetData(postion);
                    //插入元素的后继是被插的元素
                    newNode.Next = tempNode;
                    //被查元素的前驱的后继变成新插入的元素
                    tempNode.Front.Next = newNode;
                     isRet = true;
                }
            }
            while (false);
            if (isRet)//如果返回值是true插入成功了,增加元素
                ++size;
            else//失败就打印警告
                Console.WriteLine(str);
            return isRet;
        }

        public bool InsertBack(T data,uint position)
        {
            string str = "";
            bool isRet = false;
            do
            {
                //插入失败
                //链表为空
                if (IsEmpty)
                {
                    str = ("这是一个空链表,不可以插入哦");
                    isRet = false;
                    break;
                }
                else if (position >= size)//位置大于等于实际容纳量
                {
                    str = ("娃娃,位置越界了,不可以插入哦");
                    isRet = false;
                    break;
                }
                //插入成功
                //将别人添加的元素变成节点(元素+引用)
                MyNode<T> newNode = new MyNode<T>(data);
                if (position == 0)//1,插在头后面
                {
                    newNode.Next = head.Next;//原来的头的后继就变成了新插入节点的后继
                    head.Next = newNode;//新插入的节点变成了新的头
                    isRet = true;
                }
                else if (position==size-1)//在尾巴后插入
                {
                    end.Next = newNode; //新的节点就变成了尾巴的后继
                    end = newNode;//新节点就是新的尾巴
                    isRet = true;
                }
                else//2,插在中间位置
                {
                    //找到相对应的元素节点
                    //MyNode<T> tempNode = head;//临时节点,为了寻找被插的元素
                    //uint temoIndex = 1;
                    //while (tempNode.Next != null && temoIndex <= position)//循环找到被插的元素
                    //{
                    //    tempNode = tempNode.Next;//根据后继依次寻找下去
                    //    ++temoIndex;
                    //}
                    MyNode<T> tempNode = GetData(position);
                    //新节点的后继就是被插元素的后继
                    newNode.Next = tempNode.Next;
                    //被插元素的后继就变成了新的节点
                    tempNode.Next = newNode;
                    isRet = true;
                }
            }
            while (false);
            if (isRet)//如果返回值是true插入成功了,增加元素
                ++size;
            else//失败就打印警告
                Console.WriteLine(str);
            return isRet;
        }
        /// <summary>
        /// 指定序号移除
        /// </summary>
        /// <param name="index">指定索引</param>
        /// <returns>被移除的元素</returns>
        public T ReMoveAt(uint index)
        {
            bool isRet = false;
            T temp = default(T);
            MyNode<T> tempNode = null;
            do
            {
                //移除不成功
                if (IsEmpty) break;
                else if (index >= size) break;
                //移除成功
                if (index == 0)//移除头
                {
                    //把头存起来
                    tempNode = head;
                    //头的后继变成了头
                    head = head.Next;
                    isRet = true;
                }
                else//移除中间的元素
                {
                    //找位置
                    //tempNode = head;
                    //MyNode<T> tFront = null;//临时节点寻找前驱用的
                    //uint tIndex = 1;
                    //while (tempNode.Next !=null&&tIndex<=index)
                    //{
                    //    tFront = tempNode;
                    //    tempNode = tempNode.Next;
                    //    ++tIndex;
                    //}
                    tempNode = GetData(index);
                    //移除
                    tempNode.Front.Next = tempNode.Next;//被移除元素的前驱的后继变成了他原来的后继
                    if (index == size - 1)//如果移除的是尾巴
                        end = tempNode.Front;
                    isRet = true;
                }
            } while (false);
            temp = tempNode.Data;
            if (isRet)
                --size;
            //强制垃圾回收
            GC.Collect();
            return temp;
        }
        /// <summary>
        /// 清空所有的元素
        /// </summary>
        public void Clear()
        {
            MyNode < T > temp  = head;
            while (head != null)
            {
                temp = head;
                head = head.Next;
                temp = null;
            }
            GC.Collect();
        }
        //通过索引的方式访问每一个元素
        public MyNode<T> GetData(uint index)
        {
            //判空 判越界
            if (IsEmpty) Console.WriteLine("空链表无需访问");
            else if (index >= size) Console.WriteLine("越界了");
            //找到元素
            MyNode<T> tempNode = head;
            MyNode<T> tFront = null;
            uint uIndex = 1;
            while (tempNode.Next !=null&& uIndex <= index)
            {
                tFront = tempNode;
                tempNode = tempNode.Next;
                ++uIndex;
            }
            tempNode.Front = tFront;
            return tempNode;
        }



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

namespace _01.DataSttuct
{
    /// <summary>
    /// 双向链表的节点类
    /// </summary>
    /// <typeparam name="T">任意类型</typeparam>
    public class Node<T>
    {
        private T pData;//元素
        private Node<T> prev;//直接前驱
        private Node<T> next;//直接后继
        public T Data
        {
            get { return pData; }
            set { pData = value; }
        }
        public Node<T> Prev
        {
            get { return prev; }
            set { prev = value; }
        }
        public Node<T> Next
        {
            get { return next; }
            set { next = value; }
        }

        public Node()
        {
            pData = default(T);
            prev = null;
            next = null;
        }
        public Node(T data)
        {
            pData =  data;
            prev = null;
            next = null;
        }
        public Node(T data,Node<T> _prev,Node<T> _next)
        {
            pData = data;
            prev = _prev;
            next = _next;
        }

    }
    /// <summary>
    /// 处理双向链表
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class DoubleLinkList<T>
    {

        //数据元素
        int size = 0;//链表的大小
        private Node<T> head;
        //属性
        public int Count { get { return size; } }
        public Node<T> Head
        {
            get { return head; }
            set { head = value; }
        }
        public bool IsEmpty { get { return head == null; } }
        //增删改查
        //单独处理头节点的添加插在头前面变成新的头
        public void AddFirst(T data)
        {
            //将元素处理成节点
            Node<T> newNode = new Node<T>(data);
            if (IsEmpty)//如果链表为空
            {
                head = newNode;//新节点变成了头
                newNode.Prev = head;//新节点的前驱是头
                newNode.Next = head;//后继也是头
                size++; //增加个数
            }
            else//插在头前面变成新的头
            {
                //头的前驱的后继变成新节点
                head.Prev.Next = newNode;
                //新节点的前驱变成头的前驱
                newNode.Prev = head.Prev;
                //新节点的后继变成头的后继
                newNode.Next = head;
                //头的前驱变成新节点
                head.Prev = newNode;
                //新节点变成了头
                head = newNode;
                size++;
            }
        }
        /// <summary>
        /// 前插
        /// </summary>
        /// <param name="index">位置</param>
        /// <param name="data">元素</param>
        public void InsertForward(int index, T data)
        {
            Node<T> newNode = new Node<T>(data);
            //没插成功
            //越界
            if (index < 0 || index >= size)
            {
                //抛异常 溢出的异常
                throw new IndexOutOfRangeException("索引溢出了");
            }
            //链表为空
            else if (IsEmpty)
            {
                //抛异常 溢出的异常
                throw new Exception("链表为空");
            }
            //成功
            if (index == 0)//在头前面插入
            {
                AddFirst(data);
            }
            else//在其他元素前面插入
            {
                //找到被插元素
               Node<T> current = GetNode(index);
                //插入
                //其当前节点的前驱的后继变成新节点
                current.Prev.Next = newNode;
                //新节点的前驱变成被插节点的前驱
                newNode.Prev = current.Prev;
                //新节点的后继变成被插节点
                newNode.Next = current;
                //被插节点的前驱是新节点(放在最后)
                current.Prev = newNode;
                size++;
            }
        }
        /// <summary>
        /// 向链表后插入
        /// </summary>
        /// <param name="index">位置</param>
        /// <param name="data">插入元素</param>
        public void InsertBack(int index,T data)
        {
            //没插成功
            //越界
            if (index < 0 || index > size)
            {
                //抛异常 溢出的异常
                throw new IndexOutOfRangeException("索引溢出了");
            }
            //链表为空
            else if (IsEmpty&&index>0)
            {
                //抛异常 溢出的异常
                throw new Exception("链表为空");
            }
            //插成功
            Node<T> newNode = new Node<T>(data);//将插入的元素变成节点
            Node<T> current;//被插的节点

            if (index == 0)  //1.链表是空,插入的元素是头,方法结束  2.链表不为空,在插在头后面
            {
                //链表为空也可以插入,但是我让你作为头节点放在链表中,并且结束方法
                if (IsEmpty) { AddFirst(data);return; }
                // 2.链表不为空,在插在头后面
                current = head;//插在头的后面被插节点是头
            }
            else//插在除了头之外的元素后面
            {
                //通过调用者传的索引找到被插的元素节点
                current = GetNode(index);
            }
            //被插节点的后继的前驱是新节点
            current.Next.Prev = newNode;
            //新节点的前驱是被插节点
            newNode.Prev = current;
            //新节点的后继是被插节点的后继
            newNode.Next = current.Next;
            //被插节点的后继是新节点 //这句话必须在最后一步
            current.Next = newNode;
            //大小加1
            size++;
        }
        //因为 前插 后插 根据索引移除 都需要通过索引获取元素节点,所以我们将通过索引获取元素节点封装成方法
        public Node<T> GetNode(int index)
        {
            //越界
            if (index < 0 || index > size)
            {
                //抛异常 溢出的异常
                throw new IndexOutOfRangeException("索引溢出了");
            }
            //链表为空
            else if (IsEmpty)
            {
                //抛异常 溢出的异常
                throw new Exception("链表为空");
            }
            if (index < size / 2)//正向查找
            {
                Node<T> node = head;
                for (int i = 0; i < index; i++)
                {
                    node = node.Next;
                }
                return node;
            }
            //反向查找
            Node<T> rNode = head.Prev;//从尾巴向前找
            for (int i = size-1; i > index; i--)
            {
                rNode = rNode.Prev;
            }
            return rNode;

        }
        /// <summary>
        /// 根据索引移除元素
        /// </summary>
        /// <param name="index">要移除第几个</param>
        /// <returns>成功与否</returns>
        public bool ReMoveAt(int index)
        {
            bool isRet = false;
            //没成功
            //越界
            if (index < 0 || index >= size)
            {
                //抛异常 溢出的异常
                throw new IndexOutOfRangeException("索引溢出了");
            }
            //链表为空 
            else if (IsEmpty)
            {
                //抛异常 溢出的异常
                throw new Exception("链表为空");
            }
            //成功了
            if (index == 0) //移除头
            {
                //头的前驱的后继变成头的后继
                head.Prev.Next = head.Next;
                //头的后继的前驱变成头的前驱
                head.Next.Prev = head.Prev;
                head = head.Next;//新节点的头
                isRet = true;
            }
            else//移除其他元素
            {
                Node<T> current = GetNode(index);//找到移除的节点
                //当前节点的前驱的后继变成 当前节点的后继
                current.Prev.Next = current.Next;
                //当前节点的后继的前驱变成当前节点的前驱
                current.Next.Prev = current.Prev;
               isRet = true;
            }
            if (isRet)
                size--;
            GC.Collect();//强制垃圾回收
            return isRet;
        }

        public void Clear()
        {
            Node<T> tempNode = null;
            while (head != null)
            {
                tempNode = head;
                head = head.Next;
                tempNode = null;
                size--;
            }
            //head = null;
            size = 0;
            GC.Collect();
        }

        //移除头结点
        public void DelFirst() => ReMoveAt(0);
        //移除尾节点
        public void DelLast()
        {
           // LinkedList C# 自带的单向链表
            ReMoveAt(size - 1);
        } 
       
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _01.DataSttuct
{
    /// <summary>
    /// 队列的节点类
    /// </summary>
    /// <typeparam name="T"></typeparam>
    class QNode<T>
    {
        private T pData;
        private QNode<T> next;
        public T Data
        {
            get { return pData; }
            set { pData = value; }
        }
        public QNode<T> Next
        {
            get { return next; }
            set { next = value; }
        }
        public QNode()
        {
            pData = default(T);
            next = null;
        }
        public QNode(T data)
        {
            pData = data;
            next = null;
        }
    }
    /// <summary>
    /// 处理队列的存取
    /// </summary>
    /// <typeparam name="T"></typeparam>
    class MyQueue<T>
    {
        //队头对象
        private QNode<T> front;
        //对尾对象
        private QNode<T> rear;
        //队伍的长度
        private int count = 0;
        public int Count { get { return count; } }
        public bool IsEmpty { get { return front == null && rear == null; } }
        //入队(队尾指针)
        public void EQueue(T data)
        {
            QNode<T> newNode = new QNode<T>(data);
            if (IsEmpty)
                front = rear = newNode;//队列是空,入队的第一个元素既是队头也是队尾
            else//队列非空 从尾巴入队
            {
                rear.Next = newNode;//新节点变成了原来尾巴的后继
                rear = newNode;//新节点变成了尾巴
            }
            ++count;
        }
        //出队(队头指针)
        public T DQueue()
        {
            if (IsEmpty)
            {
                Console.WriteLine(  "queue is null");
                return default(T);
            }
            QNode<T> pNode = front;
            front = front.Next;//出队后队头后继就变成了新队头
            if (front == null)
                rear = null;
            --count;
            return pNode.Data;
         }
        //取队头元素
        public T GetFront()
        {
            if (IsEmpty)
            {
                Console.WriteLine("queue is empty!");
                return default(T);
            }
            return front.Data;
        }
        //清理队列
        public void Clear()
        {
            QNode<T> pNode = front;
            while (pNode != null)
            {
                front = front.Next;
                pNode = null;
                pNode = front;
            }
            front = rear = null;
            count = 0;
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _01.DataSttuct
{

    /// <summary>
    /// 顺序栈(其实就是拿数组做容器)
    /// </summary>
    public class SeqStack<T>
    {
        uint arrMaxSize = 0;//栈的总容纳量
        T[] datas = null;
        int top = -1;
        //栈顶位置(因为栈顶总是要高于占中实际的元素数量,
        //为了遵循数据结构的要求而又不让内存被白白浪费所以我们让栈顶指针从-1开始)
        public uint MaxSize
        {
            get { return arrMaxSize; }
            set { arrMaxSize = value; }
        }
        public int Top
        {
            get { return top; }
        }

        public T this[int index]
        {
            get { return datas[index]; }
            set
            {
                datas[index] = value;
            }
        }

        public bool isEmpty { get { return top < 0 ? true : false; } }
        //判满
        public bool isFull { get { return top >= arrMaxSize ? true : false; } }
        public SeqStack() { }
        public SeqStack(uint usize)
        {
            datas = new T[usize];
            arrMaxSize = usize;
            top = -1;
        }

        public void Push(T data) => datas[top++] = data;
        public T Pop() => datas[--top];
        //public bool Push(T data)
        //{
        //    //栈满了
        //    if (top == arrMaxSize - 1)
        //    {
        //        Console.WriteLine("stack is overry");
        //        return false;
        //    }
        //    datas[++top] = data;
        //    return true;
        //}
        //public T Pop()
        //{
        //    if (top < 0) return default(T);
        //    return datas[top--];
        //}
        //获取直接返回栈顶内容不出栈操作
        public T Peek()
        {
            if (isEmpty)
            {
                Console.WriteLine("the stack is empty");
                return default(T);
            }
            return datas[top];
        }

    }



    /// <summary>
    /// 栈的节点类
    /// </summary>
    /// <typeparam name="T"></typeparam>
    class SNode<T>
    {
        private T pData;
        private SNode<T> next;
        public T Data
        {
            get { return pData; }
            set { pData = value; }
        }
        public SNode<T> Next
        {
            get { return next; }
            set { next = value; }
        }
        public SNode()
        {
            pData = default(T);
            next = null;
        }
        public SNode(T data)
        {
            pData = data;
            next = null;
        }
    }
    /// <summary>
    /// 链式栈的处理类
    /// </summary>
    /// <typeparam name="T"></typeparam>
    class MyStack<T>
    {
        private uint size = 0;//栈存了多少元素
        private SNode<T> top;

        public uint Count { get { return size; } }
        public bool Isempty { get { return top == null; } }
        //入栈
        public void Puch(T data)
        {
            //将元素变成节点
            SNode<T> newNode = new SNode<T>(data);
            if (Isempty)//空栈
                top = newNode;//新节点变成栈顶节点
            else//非空栈存储
            {
                //top变成新节点的后继
                newNode.Next = top;
                //新节点就变成了新top
                top = newNode;
            }
            ++size;
        }
        /// <summary>
        /// 出栈
        /// </summary>
        /// <returns>出栈的元素</returns>
        public T Pop()
        {
            //如果是空栈,返回默认值
            if (Isempty) return default(T);
            //出栈
            SNode<T> pNode = top;//将头指针存起来
            top = top.Next;//头变成了原来头的后继
            --size;//元素减少1个
            return pNode.Data;//将出栈的元素返回
        }
        //取栈顶元素
        public T Peek()
        {
            if (Isempty)
            {
                Console.WriteLine("The Stack is Empty");
                return default(T);
            }
            return top.Data;
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _02.泛型
{
    class Program
    {
        static void Main(string[] args)
        {
            //泛型就是一种逻辑应用于不同类型的重用机制
            //泛型类的调用
            //类名<类型参数> 对象名 = 创建对象
            MyList<int> list = new MyList<int>();
            //MyList<string> list1 = new MyList<string>();//泛型约束只能存值类型,string属于引用类型
            //错误的方式: 调用者(消费者)在调用泛型类的时候,必须赋值类型参数,确定要存储数据的类型
            //MyList<T> list1 = new MyList<T>();

            //泛型方法的调用也要确定类型参数:从而确定你处理的数据
            Person p = new Person();
            p.Test<int>();
        }
    }

    //泛型类
    //访问修饰符  关键字 类名 <T>:类型的占位符(泛型参数列表)
    public class MyList<T> where T: struct//(从where开始泛型约束:约束T类型只能是值类型)
    {
        //字段
        //属性
        //构造方法
        //方法
        //这不是泛型方法,这只是泛型类中普通的方法
        public void Test(T data)
        {
            Console.WriteLine(data);
        }
        //泛型类中的泛型方法
        public void Test<Q>( Q data) where Q : struct//(从where开始泛型约束:约束T类型只能是值类型)
        {
            Console.WriteLine("我是泛型类中的泛型方法");
        }
        //泛型类中的泛型方法:因为类类型的泛型占位符已经是T了,如果你没有特殊类型要求就使用类的就可以了写成普通的方法
        //如果你有特殊需求那就写一个占位符与类的不同
        //public void Test2<T>(T data)
        //{
        //    Console.WriteLine(data);
        //}

    }
    public class Person
    {
        //普通类中的泛型方法
        public void Test<T>()
        {
            Console.WriteLine("我是普通类中泛型方法");
        }
    }



}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

许毅宏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值