日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#数据结构(一)----线性表

發布時間:2024/4/17 C# 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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#数据结构(一)----线性表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。