C#数据结构(一)----线性表
?
最近要給一個打算學.net的朋友準備些資料,同時自己在數據結構方面也有些薄弱,所以打算從頭看看。
弄了一個電子版的C#數據結構,把書里的代碼敲了敲,頗有收益。打算整理一下,如果您也跟我一樣有空不妨跟著再學學。
線性表是最簡單、最基本、最常用的數據結構。
線性結構的特點是結構中的數據元素之間存在一對一的線性關系。
這種一對一的關系指的是數據元素之間的位置關系,即:
(1)除第一個位置的數據元素外,其它數據元素位置的前面都只有一個數據元素;
(2)除最后一個位置的數據元素外,其它數據元素位置的后面都只有一個元素。
1、線性表
?
????///?<summary>????///?1、線性表???
????///?線性表的接口表示
????///?</summary>
????public?interface?IlistDS<T>
????{
????????int?GetLength();?????????????//求長度?
????????void?Clear();????????????????//清空操作
????????bool?IsEmpty();??????????????//判斷線性表是否為空?
????????void?Append(T?item);?????????//附加操作
????????void?Insert(T?item,?int?i);??//插入操作
????????T?Delete(int?i);?????????????//刪除操作
????????T?GetElem(int?i);????????????//取表元?
????????int?Locate(T?value);?????????//按值查找?
????????//---補充
????????void?Reverse();??????????????//倒置(任何線性表都可以倒置)
????}
2、順序表
順序表?///?<summary>
????///?2、順序表???
????///?線性表的順序存儲是指在內存中用一塊地址連續的空間依次存放線性表的數據元素,
????///?用這種方式存儲的線性表叫順序表(Sequence?List)
????///?</summary>
????///?<typeparam?name="T"></typeparam>
????public?class?SeqList<T>?:?IlistDS<T>
????{
????????private?int?maxsize;?????????//順序表的容量?
????????private?T[]?data;????????????//數組,用于存儲順序表中的數據元素?
????????private?int?last;????????????//指示順序表最后一個元素的位置
????????//索引器?
????????public?T?this[int?index]
????????{
????????????get
????????????{
????????????????return?data[index];
????????????}
????????????set
????????????{
????????????????data[index]?=?value;
????????????}
????????}
????????//最后一個數據元素位置屬性?
????????public?int?Last
????????{
????????????get
????????????{
????????????????return?last;
????????????}
????????}
????????//容量屬性?
????????public?int?Maxsize
????????{
????????????get
????????????{
????????????????return?maxsize;
????????????}
????????????set
????????????{
????????????????maxsize?=?value;
????????????}
????????}
????????//構造器?
????????public?SeqList(int?size)
????????{
????????????data?=?new?T[size];
????????????maxsize?=?size;
????????????last?=?-1;
????????}
????????//求順序表的長度?
????????public?int?GetLength()
????????{
????????????return?last?+?1;
????????}
????????//清空順序表?
????????public?void?Clear()
????????{
????????????last?=?-1;
????????}
????????//判斷順序表是否為空?
????????public?bool?IsEmpty()
????????{
????????????if?(last?==?-1)
????????????{
????????????????return?true;
????????????}
????????????else
????????????{
????????????????return?false;
????????????}
????????}
????????//判斷順序表是否為滿?
????????public?bool?IsFull()
????????{
????????????if?(last?==?maxsize?-?1)
????????????{
????????????????return?true;
????????????}
????????????else
????????????{
????????????????return?false;
????????????}
????????}
????????//在順序表的末尾添加新元素?
????????public?void?Append(T?item)
????????{
????????????if?(IsFull())
????????????{
????????????????Console.WriteLine("List?is?full");
????????????????return;
????????????}
????????????data[++last]?=?item;
????????}
????????//在順序表的第i個數據元素的位置插入一個數據元素?
????????public?void?Insert(T?item,?int?i)
????????{
????????????if?(IsFull())
????????????{
????????????????Console.WriteLine("List?is?full");
????????????????return;
????????????}
????????????if?(i?<?1?||?i?>?last?+?2)
????????????{
????????????????Console.WriteLine("Position?is?error!");
????????????????return;
????????????}
????????????if?(i?==?last?+?2)
????????????{
????????????????data[last?+?1]?=?item;
????????????}
????????????else
????????????{
????????????????for?(int?j?=?last;?j?>=?i?-?1;?--j)
????????????????{
????????????????????data[j?+?1]?=?data[j];
????????????????}
????????????????data[i?-?1]?=?item;
????????????}
????????????++last;
????????}
????????//刪除順序表的第i個數據元素?
????????public?T?Delete(int?i)
????????{
????????????T?tmp?=?default(T);
????????????if?(IsEmpty())
????????????{
????????????????Console.WriteLine("List?is?empty");
????????????????return?tmp;
????????????}
????????????if?(i?<?1?||?i?>?last?+?1)
????????????{
????????????????Console.WriteLine("Position?is?error!");
????????????????return?tmp;
????????????}
????????????if?(i?==?last?+?1)
????????????{
????????????????tmp?=?data[last--];
????????????}
????????????else
????????????{
????????????????tmp?=?data[i?-?1];
????????????????for?(int?j?=?i;?j?<=?last;?++j)
????????????????{
????????????????????data[j]?=?data[j?+?1];
????????????????}
????????????}
????????????--last;
????????????return?tmp;
????????}
????????//獲得順序表的第i個數據元素?
????????public?T?GetElem(int?i)
????????{
????????????if?(IsEmpty()?||?(i?<?1)?||?(i?>?last?+?1))
????????????{
????????????????Console.WriteLine("List?is?empty?or?Position?is?error!");
????????????????return?default(T);
????????????}
????????????return?data[i?-?1];
????????}
????????//在順序表中查找值為value的數據元素?
????????public?int?Locate(T?value)
????????{
????????????if?(IsEmpty())
????????????{
????????????????Console.WriteLine("List?is?Empty!");
????????????????return?-1;
????????????}
????????????int?i?=?0;
????????????for?(i?=?0;?i?<=?last;?++i)
????????????{
????????????????if?(value.Equals(data[i]))
????????????????{
????????????????????break;
????????????????}
????????????}
????????????if?(i?>?last)
????????????{
????????????????return?-1;
????????????}
????????????return?i;
????????}
????????//倒置
????????public?void?Reverse()
????????{
????????????T?tmp?=?default(T);
????????????int?len?=?GetLength();
????????????for?(int?i?=?0;?i?<?len?/?2;?i++)
????????????{
????????????????tmp?=?data[i];
????????????????data[i]?=?data[len?-?1?-?i];
????????????????data[len?-?1?-?i]?=?tmp;
????????????}
????????}
????}
?? ?順序表的幾個例子
順序表的幾個例子??///?<summary>
????///?順序表的幾個例子
????///?</summary>
????public?class?OpSeqList
????{
????????//順序表倒置
????????//算法思路:把第一個元素與最后一個元素交換,把第二個元素與倒數第二個元素交換。一般地,把第?i?個元素與第?n-i?個元素交換,i?的取值范圍是?0?到?n/2
????????public?void?ReversSeqList(SeqList<int>?L)
????????{
????????????int?tmp?=?0;
????????????int?len?=?L.GetLength();
????????????for?(int?i?=?0;?i?<?len?/?2;?i++)
????????????{
????????????????tmp?=?L[i];
????????????????L[i]?=?L[len?-?1?-?i];
????????????????L[len?-?1?-?i]?=?tmp;
????????????}
????????}
????????//有數據類型為整型的順序表?La?和?Lb,其數據元素均按從小到大的升
????????//序排列,編寫一個算法將它們合并成一個表?Lc,要求?Lc?中數據元素也按升序排列。?
????????//算法思路:依次掃描?La?和?Lb?的數據元素,比較?La?和?Lb?當前數據元素的值,將較小值的數據元素賦給?Lc,如此直到一個順序表被掃描完,然后將未完
????????//的那個順序表中余下的數據元素賦給?Lc?即可。Lc?的容量要能夠容納?La?和?Lb兩個表相加的長度。
????????public?SeqList<int>?Merge(SeqList<int>?La,?SeqList<int>?Lb)
????????{
????????????SeqList<int>?Lc?=?new?SeqList<int>(La.Maxsize?+?Lb.Maxsize);
????????????int?i?=?0;
????????????int?j?=?0;
????????????int?k?=?0;
????????????//La?和?Lb都有元素
????????????while?((i?<=?(La.GetLength()?-?1))?&&?(j?<=?(Lb.GetLength()?-?1)))
????????????{
????????????????if?(La[i]?<?Lb[j])
????????????????{
????????????????????Lc.Append(La[i++]);
????????????????}
????????????????else
????????????????{
????????????????????Lc.Append(Lb[j++]);
????????????????}
????????????}
????????????//La中還有數據元素
????????????while?(i?<?(La.GetLength()?-?1))
????????????{
????????????????Lc.Append(La[i++]);
????????????}
????????????//Lb中還有數據元素
????????????while?(j?<?(Lb.GetLength()?-?1))
????????????{
????????????????Lc.Append(Lb[j++]);
????????????}
????????????return?Lc;
????????}
????????//已知一個存儲整數的順序表La,試構造順序表?Lb,要求順序表?Lb中只包含順序表?La?中所有值不相同的數據元素
????????//算法思路:先把順序表?La?的第?1?個元素賦給順序表?Lb,然后從順序表?La的第?2?個元素起,每一個元素與順序表Lb中的每一個元素進行比較,如果不相同,則把該元素附加到順序表?Lb的末尾。?
????????public?SeqList<int>?Purge(SeqList<int>?La)
????????{
????????????SeqList<int>?Lb?=?new?SeqList<int>(La.Maxsize);
????????????Lb.Append(La[0]);
????????????for?(int?i?=?1;?i?<?La.GetLength();?i++)
????????????{
????????????????int?j?=?0;
????????????????for?(j?=?0;?j?<?Lb.GetLength();?j++)
????????????????{
????????????????????if?(La[i].CompareTo(Lb[j])?==?0)
????????????????????{
????????????????????????break;
????????????????????}
????????????????}
????????????????//沒有相同的數據元素,將a表中的數據元素附加到b表的末尾。
????????????????if?(j?>?Lb.GetLength()?-?1)
????????????????{
????????????????????Lb.Append(La[i]);
????????????????}
????????????}
????????????return?Lb;
????????}
????????//
????????public?void?Run()
????????{
????????????/*
????????????SeqList<int>?L?=?new?SeqList<int>(5);
????????????L.Append(10);
????????????L.Append(20);
????????????L.Append(30);
????????????L.Append(40);
????????????L.Append(50);
????????????//?L.Delete(2);
????????????//L.Insert(60,?2);
????????????for?(int?i=0;i<L.GetLength();i++)
????????????{
????????????????Console.WriteLine(L[i]);
????????????}
????????????Console.WriteLine("**************");
????????????//ReversSeqList(L);
????????????L.Reverse();
????????????for?(int?i?=?0;?i?<?L.GetLength();?i++)
????????????{
????????????????Console.WriteLine(L[i]);
????????????}
????????????*/
????????????/*
????????????SeqList<int>?La?=?new?SeqList<int>(50);
????????????for?(int?i?=?0;?i?<?50;?i++)
????????????{
????????????????La.Append(i);
????????????}
????????????SeqList<int>?Lb?=?new?SeqList<int>(30);
????????????for?(int?i?=?0;?i?<?30;?i++)
????????????{
????????????????Lb.Append(i?+?10000);
????????????}
????????????SeqList<int>?Lc?=?Merge(La,?Lb);
????????????for?(int?i?=?0;?i?<?Lc.GetLength();?i++)
????????????{
????????????????Console.WriteLine(Lc[i]);
????????????}
?????????????*/
????????????SeqList<int>?La?=?new?SeqList<int>(5);
????????????La.Append(1);
????????????La.Append(2);
????????????La.Append(3);
????????????La.Append(2);
????????????La.Append(3);
????????????SeqList<int>?Lb?=?Purge(La);
????????????for?(int?i?=?0;?i?<?Lb.GetLength();?i++)
????????????{
????????????????Console.WriteLine(Lb[i]);
????????????}
????????}
????}
3、單鏈表
單鏈表????///?<summary>
????///?3、單鏈表??
????///?鏈表是用一組任意的存儲單元來存儲線性表中的數據元素(這組存儲單元可
????///?以是連續的,也可以是不連續的)?。那么,怎么表示兩個數據元素邏輯上的相鄰
????///?關系呢?即如何表示數據元素之間的線性關系呢?為此,在存儲數據元素時,除
????///?了存儲數據元素本身的信息外,還要存儲與它相鄰的數據元素的存儲地址信息。
????///?</summary>
????public?class?LinkList<T>?:?IlistDS<T>
????{
????????private?Node<T>?head;
????????public?Node<T>?Head
????????{
????????????get?{?return?head;?}
????????????set?{?this.head?=?value;?}
????????}
????????public?Node<T>?Next
????????{
????????????get?{?return?head.Next;?}
????????????set?{?head.Next?=?value;?}
????????}
????????public?LinkList()
????????{
????????????head?=?null;
????????}
????????public?int?GetLength()?//思路:最后一個節點的next為null
????????{
????????????int?len?=?0;
????????????Node<T>?Node?=?head;
????????????while?(Node?!=?null)
????????????{
????????????????len++;
????????????????Node?=?Node.Next;
????????????}
????????????return?len;
????????}
????????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;
????????????????return;
????????????}
????????????//不為空,找到最后一個
????????????p?=?head;
????????????if?(p.Next?!=?null)
????????????{
????????????????p?=?p.Next;
????????????}
????????????p.Next?=?q;
????????}
????????//前插操作
????????public?void?Insert(T?item,?int?i)
????????{
????????????if?(IsEmpty()?||?i?<?0)
????????????{
????????????????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;
????????????}
????????????else
????????????{
????????????????Console.WriteLine("Position?is?error!");
????????????}
????????????return;
????????}
????????//后插操作
????????public?void?InsertPost(T?item,?int?i)
????????{
????????????if?(IsEmpty()?||?i?<?1)
????????????{
????????????????Console.WriteLine("List?is?empty?or?Position?is?error!");
????????????????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.Next?!=?null?&&?j?<?i)
????????????{
????????????????p?=?p.Next;
????????????????++j;
????????????}
????????????if?(j?==?i)
????????????{
????????????????Node<T>?q?=?new?Node<T>(item);
????????????????q.Next?=?p.Next;//核心
????????????????p.Next?=?q;//核心
????????????}
????????????else
????????????{
????????????????Console.WriteLine("Position?is?error!");
????????????}
????????????return;
????????}
????????public?T?Delete(int?i)
????????{
????????????if?(IsEmpty()?||?i?<?0)
????????????{
????????????????Console.WriteLine("Link?is?empty?or?Position?is?error!");
????????????????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("The?ith?node?is?not?exist!");
????????????????return?default(T);
????????????}
????????}
????????public?T?GetElem(int?i)
????????{
????????????if?(IsEmpty())
????????????{
????????????????Console.WriteLine("List?is?empty!");
????????????????return?default(T);
????????????}
????????????Node<T>?p?=?new?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("The?ith?node?is?not?exist!");
????????????????return?default(T);
????????????}
????????}
????????public?int?Locate(T?value)
????????{
????????????if?(IsEmpty())
????????????{
????????????????Console.WriteLine("List?is?Empty!");
????????????????return?-1;
????????????}
????????????Node<T>?p?=?new?Node<T>();
????????????p?=?head;
????????????int?i?=?1;
????????????while?(!p.Data.Equals(value)?&&?p.Next?!=?null)
????????????{
????????????????p??=?p.Next;
????????????????++i;
????????????}
????????????return?i;
????????}
????????//在頭部插入結點建立單鏈表的算法如下:?
????????public?LinkList<int>?CreateLListHead()
????????{
????????????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;
????????}
????????//在尾部插入結點建立單鏈表的算法如下:?
????????public?LinkList<int>?CreateListTail()
????????{
????????????Node<int>?R?=?new?Node<int>();
????????????int?d;
????????????LinkList<int>?L?=?new?LinkList<int>();
????????????R?=?L.Head;
????????????d?=?Int32.Parse(Console.ReadLine());
????????????while?(d?!=?-1)
????????????{
????????????????Node<int>?p?=?new?Node<int>(d);
????????????????if?(L.Head?==?null)
????????????????{
????????????????????L.Head?=?p;
????????????????}
????????????????else
????????????????{
????????????????????R.Next?=?p;
????????????????}
????????????????R?=?p;
????????????????d?=?Int32.Parse(Console.ReadLine());
????????????}
????????????if?(R?!=?null)
????????????{
????????????????R.Next?=?null;
????????????}
????????????return?L;
????????}
????????public?void?Reverse()
????????{
????????????Node<T>?p?=?head.Next;
????????????Node<T>?q?=?new?Node<T>();
????????????head.Next?=?null;
????????????while?(p?!=?null)
????????????{
????????????????q?=?p;
????????????????p?=?p.Next;
????????????????q.Next?=?head.Next;
????????????????head.Next?=?q;
????????????}
????????}
????}
?
單鏈表節點????///?<summary>
????///?單鏈表節點
????///?</summary>
????///?<typeparam?name="T"></typeparam>
????public?class?Node<T>
????????{
????????????private?T?data;?????????//數據域
????????????private?Node<T>?next;???//引用域
????????????public?Node(T?t,?Node<T>?p)
????????????{
????????????????this.data?=?t;
????????????????this.next?=?p;
????????????}
????????????public?Node(T?t)
????????????{
????????????????this.data?=?t;
????????????????this.next?=?null;
????????????}
????????????public?Node(Node<T>?p)
????????????{
????????????????this.next?=?p;
????????????}
????????????public?Node()
????????????{
????????????????this.data?=?default(T);
????????????????this.next?=?null;
????????????}
????????????public?T?Data
????????????{
????????????????get?{?return?data;?}
????????????????set?{?data?=?value;?}
????????????}
????????????public?Node<T>?Next
????????????{
????????????????get?{?return?next;?}
????????????????set?{?next?=?value;?}
????????????}
????????}
?
單鏈表的幾個例子????///?<summary>
????///?單鏈表的幾個例子
????///?</summary>
????public?class?OpLinkList
????{
????????//單鏈表的倒置
????????public?void?ReversLinkList(LinkList<int>?H)
????????{
????????????Node<int>?p?=?H.Next;
????????????Node<int>?q?=?new?Node<int>();
????????????H.Next?=?null;
????????????while?(p?!=?null)
????????????{
????????????????q?=?p;
????????????????p?=?p.Next;
????????????????q.Next?=?H.Next;
????????????????H.Next?=?q;
????????????}
????????}?
????}
?
?
??C#中的線性表
??非泛型Ilist接口繼承自ICollection和IEnumerable,是所有線性表的基接口。
??ArrayList(順序表)、ListDictionary、StringCollection、StringDictionary繼承自Ilist。
??泛型Ilist<T>接口繼承自ICollection<T>、IEnumerable<T>、IEnumerable。是所有泛型線性表的基接口。
??List<T>等一些集合類實現了Ilist<T>。
??List<T>是 ArrayList 在泛型中的替代品。List<T>的性能比 ArrayList 有很大改變。
??1、ArrayList 默認的 Capacity 是 16,而 List<T>的默認 Capacity是 4;
??2、List<T>的方法不是虛擬方法(ArrayList 的方法是虛擬方法) ,這樣可以利用函數內聯來提高性能(虛函數不可以被內聯);
?
--
C#數據結構下載:CSharp數據結構(2.0版)電子書.rar
?
?
?
?
?
轉載于:https://www.cnblogs.com/tenghoo/archive/2009/07/02/Data_Structures_List.html
總結
以上是生活随笔為你收集整理的C#数据结构(一)----线性表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html visibility 替代服务
- 下一篇: c# char unsigned_dll