数据结构(C#版本)_基本概念及线性表
推薦閱讀:
- ?我的CSDN
- ?我的博客園
- ?QQ群:704621321
1.常見的4類數據結構: 1.集合。 2.線性結構。3.樹形結構。4.圖狀結構。
2.數據結構(Data Structure)簡記為 DS,是一個二元組,DS = (D,R)
其中:D 是數據元素的有限集合,R 是數據元素之間關系的有限集合。
3.數據的存儲結構包括順序存儲結構和鏈式存儲結構兩種。C#語言中用數組來實現順序存儲結構。
4.算法的5個重要特征: 1.有窮性。2.確定性。3.可行性。4.輸入。5.輸出。
5.線性表:存在一對一的線性關系,一對一的關系指的是數據元素之間的位置關系
特點:
(1)除第一個位置的數據 元素外,其它數據元素位置的前面都只有一個數據元素
(2)除最后一個位置的 數據元素外,其它數據元素位置的后面都只有一個元素
6.線性表(List)是由 n(n≥0)個相同類型的數據元素構成的有限序列。線性表通常記為:L=(a1,a2,…,ai-1,ai, ai+1,…,an),a1是線性 表中第一個位置的數據元素。an是線性表中最后一個位置 的數據元素,。n為線性表的表長,n=0 時的線性表被稱 為空表(Empty List)。
線性表的接口如下所示:
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); //按值查找 }7.線性表的順序存儲是指在內存中用一塊地址連續的空間依次存放線性表的數據元素, 用這種方式存儲的線性表叫順序表(Sequence List)。
順序表的特點是:表中相鄰的數據元素在內存中存儲位置也相鄰。數據元素占w個存儲單元,設第i個數據元素的存儲地址為Loc(ai),則有:Loc(ai)= Loc(a1)+(i-1)*w 1≤i≤n。
由于計算順序表中每個數據元素存儲地址的時間相同,所以順序表 具有隨機存取的特點。數組具有表示順序表的數據存儲區域的特 性。
last 表示順序 表中最后一個數據元素在數組中的位置。如果順序表中有數據元素時,last 的變 化范圍是 0 到 maxsize-1,如果順序表為空,last=-1
8.順序表類 SeqList的實現說明如下所示:
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()){System.Console.WriteLine("滿了");return;}data[++last] = item;}//在順序表的第i位置插入一個數據元素public void Insert(T item, int i){if (IsFull()){System.Console.WriteLine("滿了");return;}if (i < 1 || i> last+2){System.Console.WriteLine("越界");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;} }9.順序表的倒置
算法思路:把第一個元素與最后一個元素交換,把第二個元素與倒數第二個元素交換。一般地,把第 i 個元素與第 n-i 個元素交換,i 的取值范圍是 0 到 n/2(n 為順序表的長度)。
算法實現如下:
10按升序合并兩個表
算法思路:依次掃描 La 和 Lb 的數據元素,比較 La 和 Lb 當前數據元素的 值,將較小值的數據元素賦給 Lc,如此直到一個順序表被掃描完,然后將未完 的那個順序表中余下的數據元素賦給 Lc 即可。Lc 的容量要能夠容納 La 和 Lb 兩個表相加的長度。
C#實現如下:
11已知一個存儲整數的順序表 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);//將a表中的第1個數據元素賦給b表 Lb.Append(La[0]);//依次處理a表中的數據元素for (int i=1; i<=La.GetLength()-1; ++i){int j = 0;//查看b表中有無與a表中相同的數據元素for (j = 0; j<=Lb.GetLength()-1; ++j){//有相同的數據元素if (La[i].CompareTo(Lb[j]) == 0){break;}}//沒有相同的數據元素,將a表中的數據元素附加到b表的末尾。if(j>Lb.GetLength()-1){Lb.Append(La[i]);}}return Lb; }鏈表進行插入 和刪除時不需要移動數據元素,但同時也失去了順序表可隨機存儲的優點
12單鏈表結點類的實現:
public class Node<T> {private T data; //數據域private Node<T> next; //引用域//構造器public Node(T val, Node<T> p){data = val;next = p;}//構造器public Node(Node<T> p){next = p;}//構造器public Node(T val){data = val;next = null;}//構造器public Node(){data = default(T);next = null;}//數據域屬性public T Data{get{return data;}set{ data = value; }}//引用域屬性public Node<T> Next{get { return next; }set { next = value; }} }13單鏈表類 LinkList的實現
public class LinkList<T> : IListDS<T> {private Node<T> head; //單鏈表的頭引用//頭引用屬性public Node<T> Head{get{ return head; }set{ head = value; }}//構造器public LinkList(){head = null;}//求單鏈表的長度public int GetLength(){Node<T> p = head;int len = 0;while (p != null){++len;p = p.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;while (p.Next != null){p = p.Next;}p.Next = q;}//在單鏈表的第i個結點的位置前插入一個值為item的結點public void Insert(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; 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;}}//在單鏈表的第i個結點的位置后插入一個值為item的結點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 != null&& j < i){p = p.Next;++j;}if (j == i){Node<T> q = new Node<T>(item);q.Next = p.Next;p.Next = q;}}//刪除單鏈表的第i個結點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);}}//獲得單鏈表的第i個數據元素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);}}//在單鏈表中查找值為value的結點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;} }總結
以上是生活随笔為你收集整理的数据结构(C#版本)_基本概念及线性表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于 ASP.NET 内存缓存你需要知道
- 下一篇: c#中常用集合类和集合接口之集合类系列