线性表(原创文章非转载)

最近对算法比较感兴趣,准备把自己学习过程中的一些思考记录下来,便于以后复习查看,希望也能对各位朋友有所帮助。

 


--线性表

以下通过线性表的两种类型:顺序表和单链表来表现其基本功能,并对这两种数据结构的一些基本操作做一个简要的性能分析,

让我们理解它们的差异后,在恰当之处使用以提高程序性能。先创建解决方案,在其下创建一个LinearList项目,如下图所示:

 

 

1.IListDS.cs:定义线性表的基本行为,提供操作的接口

 

IListDS.cs
1 ///<summary>
2 /// 泛型线性表接口
3 ///</summary>
4 ///<typeparam name="T">占位符T</typeparam>
5  publicinterface IListDS<T>
6 {
7 int GetLength(); //求长度
8  
9 void Clear(); //清空操作
10  
11 bool IsEmpty(); //判断线性表是否为空
12  
13 void Append(T item); //附加操作
14  
15 void Insert(T item, int i); //插入操作
16  
17 T Delete(int i); //删除操作
18  
19 T GetElem(int i); //取表元
20
21 int Locate(T value); //按值查找
22 }

 

 

 

2.SeqList.cs:顺序表实现IListDS接口中基本操作

 

 

SeqList.cs
1 ///<summary>
2 /// 顺序表实现线性表基本操作接口
3 ///</summary>
4 ///<typeparam name="T"></typeparam>
5 publicclass SeqList<T> : IListDS<T>
6 {
7 privateint maxsize; //顺序表的容量
8 private T[] data; //数组,用于存储顺序表中的数据元素
9 privateint last; //指示顺序表最后一个元素的位置
10
11 ///<summary>
12 /// 索引器
13 ///</summary>
14 ///<param name="index"></param>
15 ///<returns></returns>
16 public T this[int index]
17 {
18 get
19 {
20 return data[index];
21 }
22 set
23 {
24 data[index] = value;
25 }
26 }
27
28 ///<summary>
29 /// 构造器-初始化容量大小,并分配相应的空间,重置游标
30 ///</summary>
31 ///<param name="size"></param>
32 public SeqList(int size)
33 {
34 data =new T[size];
35 maxsize = size;
36 last =-1;
37 }
38
39
40
41 ///<summary>
42 /// 最后一个数据元素位置索引
43 ///</summary>
44 publicint Last
45 {
46 get
47 {
48 return last;
49 }
50 }
51
52 ///<summary>
53 /// 容量属性
54 ///</summary>
55 publicint Maxsize
56 {
57 get
58 {
59 return maxsize;
60 }
61 set
62 {
63 maxsize = value;
64 }
65 }
66
67 #region IListDS<T> 成员
68 ///<summary>
69 /// 求顺序表的长度
70 ///</summary>
71 ///<returns></returns>
72 publicint GetLength()
73 {
74 return last +1;
75 }
76
77 ///<summary>
78 /// 清空顺序表
79 ///</summary>
80 publicvoid Clear()
81 {
82 last =-1;
83 }
84
85 ///<summary>
86 /// 判断顺序表是否为空
87 ///</summary>
88 ///<returns></returns>
89 publicbool IsEmpty()
90 {
91 if (last ==-1)
92 {
93 returntrue;
94 }
95 else
96 {
97 returnfalse;
98 }
99 }
100
101
102 ///<summary>
103 /// 判断顺序表是否为满
104 ///</summary>
105 ///<returns></returns>
106 publicbool IsFull()
107 {
108 if (last == maxsize-1)
109 {
110 returntrue;
111 }
112 else
113 {
114 returnfalse;
115 }
116 }
117
118 ///<summary>
119 /// 在顺序表的末尾添加新元素
120 ///</summary>
121 ///<param name="item"></param>
122 publicvoid Append(T item)
123 {
124 if(IsFull())
125 {
126 Console.WriteLine("List is full");
127 return;
128 }
129 data[++last] = item;
130 }
131
132 ///<summary>
133 /// 在顺序表的第i个数据元素的位置插入一个数据元素
134 ///</summary>
135 ///<param name="item"></param>
136 ///<param name="i"></param>
137 publicvoid Insert(T item, int i)
138 {
139 if (IsFull())
140 {
141 Console.WriteLine("List is full");
142 return;
143 }
144
145 //last + 1 代表最后一个元素-索引为 last,last + 2 代表最后一元素的后面一个位置-索引为last + 1
146 if(i<1|| i>last+2)
147 {
148 Console.WriteLine("Position is error!");
149 return;
150 }
151
152 if (i == last +2)
153 {
154 data[last+1] = item;
155 }
156 else
157 {
158
159 //从最后一元素位置last+1索引(last)开始遍历后移至要插入位置i(索引 i-1)处,腾出要插入位置的空间
160 for (int j = last; j>= i-1; --j)
161 {
162 data[j +1] = data[j];
163 }
164
165 //该处插入元素
166 data[i-1] = item;
167 }
168
169 //最后元素位置索引增加一个单位
170 ++last;
171 }
172
173
174 ///<summary>
175 /// 删除顺序表的第i个数据元素
176 ///</summary>
177 ///<param name="i"></param>
178 ///<returns></returns>
179 public T Delete(int i)
180 {
181 T tmp =default(T);
182
183 if (IsEmpty())
184 {
185 Console.WriteLine("List is empty");
186 return tmp;
187 }
188
189 if (i <1|| i > last +1)
190 {
191 Console.WriteLine("Position is error!");
192 return tmp;
193 }
194
195 if (i == last +1)
196 {
197 tmp = data[last];
198 }
199 else
200 {
201 tmp = data[i -1];
202 for (int j = i-1; j <= last; ++j)
203 {
204 data[j] = data[j +1];
205 }
206 }
207
208 --last;
209
210 return tmp;
211 }
212
213 ///<summary>
214 /// 获得顺序表的第i个数据元素
215 ///</summary>
216 ///<param name="i">i代表要获取元素的位置</param>
217 ///<returns></returns>
218 public T GetElem(int i)
219 {
220 if (IsEmpty() || (i<1) || (i>last+1))
221 {
222 Console.WriteLine("List is empty or Position is error!");
223 returndefault(T);
224 }
225 return data[i-1];
226 }
227
228
229 ///<summary>
230 /// 在顺序表中查找值为value的数据元素
231 ///</summary>
232 ///<param name="value"></param>
233 ///<returns></returns>
234 publicint Locate(T value)
235 {
236 if(IsEmpty())
237 {
238 Console.WriteLine("List is Empty!");
239 return-1;
240 }
241
242 int i =0;
243
244 for (i =0; i <= last; ++i)
245 {
246 if (value.Equals(data[i]))
247 {
248 break;
249 }
250 }
251
252 if (i > last)
253 {
254 return-1;
255 }
256
257 return i;
258 }
259
260 #endregion
261
262 }

 

3.LinkedList.cs:单链表实现IListDS接口中基本操作

 

 

LinkedList.cs
1 ///<summary>
2 /// 定义结点类
3 ///</summary>
4 ///<typeparam name="T"></typeparam>
5 class Node<T>
6 {
7 private T data; //数据域
8 private Node<T> next; //引用域
9
10 ///<summary>
11 /// 构造器
12 ///</summary>
13 ///<param name="val"></param>
14 ///<param name="p"></param>
15 public Node(T val, Node<T> p)
16 {
17 data = val;
18 next = p;
19 }
20
21 ///<summary>
22 /// 构造器
23 ///</summary>
24 ///<param name="val"></param>
25 ///<param name="p"></param>
26 public Node(Node<T> p)
27 {
28 next = p;
29 }
30
31 ///<summary>
32 /// 构造器
33 ///</summary>
34 ///<param name="val"></param>
35 ///<param name="p"></param>
36 public Node(T val)
37 {
38 data = val;
39 next =null;
40 }
41
42 ///<summary>
43 /// 构造器
44 ///</summary>
45 ///<param name="val"></param>
46 ///<param name="p"></param>
47 public Node()
48 {
49 data =default(T);
50 next =null;
51 }
52
53 ///<summary>
54 /// 数据域属性
55 ///</summary>
56 public T Data
57 {
58 get
59 {
60 return data;
61 }
62 set
63 {
64 data = value;
65 }
66 }
67
68 ///<summary>
69 /// 引用域属性
70 ///</summary>
71 public Node<T> Next
72 {
73 get
74 {
75 return next;
76 }
77 set
78 {
79 next = value;
80 }
81 }
82 }
83
84 ///<summary>
85 /// 单链表
86 ///</summary>
87 ///<typeparam name="T"></typeparam>
88 class LinkedList<T> : IListDS<T>
89 {
90
91 Node<T> head; //单链表的头引用
92
93 //头引用属性
94 public Node<T> Head
95 {
96 get
97 {
98 return head;
99 }
100 set
101 {
102 head = value;
103 }
104 }
105
106 //构造器
107 public LinkedList()
108 {
109 head =null;
110 }
111
112
113 #region IListDS<T> 成员
114
115 ///<summary>
116 /// 求单链表的长度
117 ///</summary>
118 ///<returns></returns>
119 publicint GetLength()
120 {
121 Node<T> p = head;
122
123 int len =0;
124
125 while (p !=null)
126 {
127 ++len;
128 p = p.Next;
129 }
130
131 return len;
132 }
133
134 ///<summary>
135 /// 清空单链表
136 ///</summary>
137 publicvoid Clear()
138 {
139 head =null;
140 }
141
142 ///<summary>
143 /// 判断单链表是否为空
144 ///</summary>
145 ///<returns></returns>
146 publicbool IsEmpty()
147 {
148 if (head ==null)
149 {
150 returntrue;
151 }
152 else
153 {
154 returnfalse;
155 }
156 }
157
158 ///<summary>
159 /// 在单链表的末尾添加新元素
160 ///</summary>
161 ///<param name="item"></param>
162 publicvoid Append(T item)
163 {
164 Node<T> q =new Node<T>(item);
165 Node<T> p =new Node<T>();
166
167
168 if (head ==null)
169 {
170 head = q;
171 return;
172 }
173
174 p = head;
175
176 //循环找到单链表的最后一结点,最后一结点的引用域Next为NULL
177 while (p.Next !=null)
178 {
179 p = p.Next;
180 }
181
182 p.Next = q;
183 }
184
185 ///<summary>
186 /// 前插式-在单链表的第i个结点的位置前插入一个值为item的结点
187 ///</summary>
188 ///<param name="item"></param>
189 ///<param name="i"></param>
190 publicvoid InsertFront(T item, int i)
191 {
192 if (IsEmpty() || i <1)
193 {
194 Console.WriteLine("List is empty or Position is error!");
195 return;
196 }
197
198 //第一个位置是 head 结点
199 if (i ==1)
200 {
201 Node<T> q =new Node<T>(item);
202 q.Next = head;
203 head = q;
204 return;
205 }
206
207 Node<T> p = head;
208 Node<T> r =new Node<T>();
209 int j =1;
210
211 //指头当前结点p的后继结点不为Null,才有在其前出入的可能
212 while (p.Next !=null&& j < i)
213 {
214 //存储当前结点作为后继结点的前驱结点
215 r = p;
216 p = p.Next;
217 ++j;
218 }
219
220 //p.Next == null,说明已到达最后一个结点
221
222 if (j == i)
223 {
224 Node<T> q =new Node<T>(item);
225 q.Next = p;
226 r.Next = q;
227 }
228
229 }
230
231 ///<summary>
232 /// 在单链表的第i个结点的位置后插入一个值为item的结点
233 ///</summary>
234 ///<param name="i"></param>
235 ///<returns></returns>
236 publicvoid Insert(T item, int i)
237 {
238 if (IsEmpty() || i <1)
239 {
240 Console.WriteLine("List is empty or Position is error!");
241 return;
242 }
243
244 if (i ==1)
245 {
246 Node<T> q =new Node<T>(item);
247 q.Next = head.Next;
248 head.Next = q;
249 return;
250 }
251
252 Node<T> p = head;
253 int j =1;
254 while (p !=null&& j < i)
255 {
256 p = p.Next;
257 ++j;
258 }
259
260 if (j == i)
261 {
262 Node<T> q =new Node<T>(item);
263 q.Next = p.Next;
264 p.Next = q;
265 }
266 }
267
268 ///<summary>
269 /// 删除单链表的第i个结点
270 ///</summary>
271 ///<param name="i"></param>
272 ///<returns></returns>
273 public T Delete(int i)
274 {
275 if (IsEmpty() || i <0)
276 {
277 Console.WriteLine("Link is empty or Position is error!");
278 returndefault(T);
279 }
280
281 Node<T> q =new Node<T>();
282
283 if (i ==1)
284 {
285 q = head;
286 head = head.Next;
287 return q.Data;
288 }
289
290 Node<T> p = head;
291 int j =1;
292 while (p.Next !=null&& j < i)
293 {
294 ++j;
295 q = p;
296 p = p.Next;
297 }
298
299 if (j == i)
300 {
301 q.Next = p.Next;
302 return p.Data;
303 }
304 else
305 {
306 Console.WriteLine("The ith node is not exist!");
307 returndefault(T);
308 }
309 }
310
311 ///<summary>
312 /// 获得单链表的第i个数据元素
313 ///</summary>
314 ///<param name="i"></param>
315 ///<returns></returns>
316 public T GetElem(int i)
317 {
318 if (IsEmpty())
319 {
320 Console.WriteLine("List is empty!");
321 returndefault(T);
322 }
323 Node<T> p =new Node<T>();
324
325 p = head;
326 int j =1;
327
328 while (p.Next !=null&& j < i)
329 {
330 ++j;
331 p = p.Next;
332 }
333
334 if (j == i)
335 {
336 return p.Data;
337 }
338 else
339 {
340 Console.WriteLine("The ith node is not exist!");
341 returndefault(T);
342 }
343 }
344
345 ///<summary>
346 /// 在单链表中查找值为value的结点
347 ///</summary>
348 ///<param name="value"></param>
349 ///<returns></returns>
350 publicint Locate(T value)
351 {
352 if (IsEmpty())
353 {
354 Console.WriteLine("List is Empty!");
355 return-1;
356 }
357 Node<T> p =new Node<T>();
358 p = head;
359 int i =1;
360 while (!p.Data.Equals(value) && p.Next !=null)
361 {
362 p = p.Next;
363 ++i;
364 }
365
366 if (!p.Data.Equals(value) && p.Next ==null)
367 {
368 i =-1;
369 }
370
371 return i;
372 }
373
374 #endregion
375 }
376

 

 

4.测试结果:

 

待续...

 

posted @ 2010-06-19 16:17  代码那些事  阅读(510)  评论(0)    收藏  举报