理論基礎:
線性表是最簡單、最基本、最常用的數據結構。線性表是線性結構的抽象(Abstract),線性結構的特點是結構中的數據元素之間存在一對一的線性關系。這種一對一的關系指的是數據元素之間的位置關系,即:
(1)除第一個位置的數據元素外,其它數據元素位置的前面都只有一個數據元素;
(2)除最後一個位置的數據元素外,其它數據元素位置的後面都只有一個元素。
也就是說,數據元素是一個接一個的排列。因此,可以把線性表想象為一種數據元素序列的數據結構。
線性表(List)是由n(n≥0)個相同類型的數據元素構成的有限序列.
注意:“有限”,指的是線性表中的數據元素的個數是有限的,線性表中的每一個數據元素都有自己的位置(Position)。本書不討論數據元素個數無限的線性表。
“相同類型”,指的是線性表中的數據元素都屬於同一種類型。
C#實現:
1接口
由於現在只考慮線性表的基本操作,所以以C#接口的形式表示線性表,接口中的方法成員表示基本操作。並且,為了使線性表對任何數據類型都適用,數據元素的類型使用泛型的類型參數。在實際創建線性表時,元素的實際類型可以用應用程序中任何方便的數據類型來代替,比如用簡單的整型或者用戶自定義的更復雜的類型來代替。
線性表的接口如下所示。
Code
[copy to clipboard]
CODE:
1 public interface IListDS<T>
2 {
3 /**//// <summary>
4 /// 獲取長度
5 /// </summary>
6 /// <returns></returns>
7 int GetLength();
8
9 /**//// <summary>
10 /// 清空操作
11 /// </summary>
12 void Clear();
13
14 /**//// <summary>
15 /// 判斷線性表是否為空
16 /// </summary>
17 /// <returns></returns>
18 bool IsEmpay();
19
20 /**//// <summary>
21 /// 附加操作,線性表未滿,將值為item的新元素添加到末尾
22 /// </summary>
23 /// <param name="item"></param>
24 void Append(T item);
25
26 /**//// <summary>
27 /// 插入操作
28 /// </summary>
29 /// <param name="item"></param>
30 /// <param name="i"></param>
31 void Insert(T item,int i);
32
33 /**//// <summary>
34 /// 刪除操作
35 /// </summary>
36 /// <param name="i"></param>
37 /// <returns></returns>
38 T Delete(int i);
39
40 /**//// <summary>
41 /// 去表元
42 /// </summary>
43 /// <param name="i"></param>
44 /// <returns></returns>
45 T GetElem(int i);
46
47 /**//// <summary>
48 /// 按值查找
49 /// </summary>
50 /// <param name="value"></param>
51 /// <returns></returns>
52 int Locate(T value);
53 }
2 實現
實現過程中,算法時間復雜度沒有做過多的考慮和計算,有興趣的朋友可以完成
Code
[copy to clipboard]
CODE:
1/**//// <summary>
2 /// 線性表
3 /// </summary>
4 /// <typeparam name="T"></typeparam>
5 public class SeqList<T> : IListDS<T>
6 {
7 private int maxsize; //順序表的容量
8 private T[] data; //數組,用於存儲順序表中的數據元素
9 private int last; //指示順序表最後一個元素的位置
10
11 //索引器
12 public T this[int index]
13 {
14 get
15 {
16 return data[index];
17 }
18 set
19 {
20 data[index] = value;
21 }
22 }
23
24 //最後一個數據元素的位置屬性
25 public int List
26 {
27 get
28 {
29 return last;
30 }
31 }
32
33 //容量屬性
34 public int MaxSize
35 {
36 get
37 {
38 return maxsize;
39
40 }
41 set
42 {
43 maxsize = value;
44 }
45 }
46
47 //構造函數
48 public SeqList(int size)
49 {
50 data = new T[size];
51 maxsize = size;
52 last = -1;
53 }
54 /**//// <summary>
55 /// 獲取長度
56 /// </summary>
57 /// <returns></returns>
58 public int GetLength()
59 {
60 return last + 1;
61 }
62
63 /**//// <summary>
64 /// 清空操作
65 /// </summary>
66 public void Clear()
67 {
68 last = -1;
69 }
70
71
72 /**//// <summary>
73 /// 判斷線性表是否為空
74 /// </summary>
75 /// <returns></returns>
76 public bool IsEmpay()
77 {
78 if (last == -1)
79 {
80 return true;
81 }
82 else
83 {
84 return false;
85 }
86 }
87
88 /**//// <summary>
89 /// 判斷線性表是否已滿
90 /// </summary>
91 /// <returns></returns>
92 public bool IsFull()
93 {
94 if (last == maxsize - 1)
95 {
96 return true;
97 }
98 else
99 {
100 return false;
101 }
102 }
103
104 /**//// <summary>
105 /// 附加操作,線性表未滿,將值為item的新元素添加到末尾
106 /// </summary>
107 /// <param name="item"></param>
108 public void Append(T item)
109 {
110 if (IsFull())
111 {
112 Console.Write("list is full");
113 return;
114 }
115
116 data[++last] = item;
117 }
118
119 /**//// <summary>
120 /// 插入操作
121 /// </summary>
122 /// <param name="item"></param>
123 /// <param name="i"></param>
124 public void Insert(T item, int i)
125 {
126 if (IsFull())
127 {
128 Console.Write("List is full");
129 return;
130 }
131
132 if (i < 1 || i > last + 2)
133 {
134 Console.Write("Posotion is error");
135 return;
136 }
137
138 if (i == last + 2)
139 {
140 data[last + 1] = item;
141 }
142 else
143 {
144 for (int j = last; j >= i - 1; --j)
145 {
146 data[j + 1] = data[j];
147 }
148 data[i - 1] = item;
149 }
150 ++last;
151 }
152
153 /**//// <summary>
154 /// 刪除操作
155 /// </summary>
156 /// <param name="i"></param>
157 /// <returns></returns>
158 public T Delete(int i)
159 {
160 T t = default(T);
161 if (IsEmpay())
162 {
163 Console.Write("List is empty!");
164 return t;
165 }
166 if (i < 1 || i > last + 1)
167 {
168 Console.Write("Position is Error");
169 return t;
170 }
171 if (i == last + 1)
172 {
173 t = data[last--];
174
175 }
176 else
177 {
178 t = data[i - 1];
179 for (int j = i; j <= last; j++)
180 {
181 data[j] = data[j + 1];
182 }
183 }
184 --last;
185 return t;
186
187 }
188
189 /**//// <summary>
190 /// 取表元
191 /// </summary>
192 /// <param name="i"></param>
193 /// <returns></returns>
194 public T GetElem(int i)
195 {
196 T t = default(T);
197 if (IsEmpay())
198 {
199 Console.Write("List is Empty");
200 return t;
201 }
202
203 if (i < 1 || i > last + 1)
204 {
205 Console.Write("Position is error");
206 return t;
207 }
208 return data[i - 1];
209
210 }
211
212 /**//// <summary>
213 /// 按值查找
214 /// </summary>
215 /// <param name="value"></param>
216 /// <returns></returns>
217 public int Locate(T value)
218 {
219 if (IsEmpay())
220 {
221 Console.Write("List is empty");
222 return -1;
223 }
224
225 int i = 0;
226 for ( i = 0; i <= last; ++i)
227 {
228 if (value.Equals(data))
229 {
230 break;
231 }
232 }
233 if (i > last)
234 {
235 return -1;
236 }
237 return i;
238 }
239 }
以上代碼用C#實現了線性表的操作,具體的測試沒有做,有興趣的朋友,可以寫一個簡單的測試程序。