码迷,mamicode.com
首页 > Windows程序 > 详细

C# 单链表

时间:2016-02-26 06:54:09      阅读:261      评论:0      收藏:0      [点我收藏+]

标签:

  1 class Program
  2     {
  3         static void Main(string[] args)
  4         {
  5             LinkedList<int> list = new LinkedList<int>();
  6             for (int i = 0; i < 100; i++)
  7             {
  8                 list.Append(i);
  9             }
 10             list.PrintAllNode();
 11         }
 12     }
 13     public class Node<T>
 14     {
 15         public T Data;//当前值
 16         public Node<T> Next;//下一个节点
 17         public Node(T item)
 18         {
 19             this.Data = item;
 20         }
 21         public Node()
 22         {
 23             // this.val = item;
 24         }
 25     }
 26 
 27     // 定义一个泛型单链表类
 28     public class LinkedList<T> /*: IListDS<T>*/
 29     {
 30         #region 字段
 31         private Node<T> head; // 单链表头结点
 32         #endregion
 33 
 34         #region 属性
 35         // 头结点
 36         public Node<T> Head
 37         {
 38             get
 39             {
 40                 return head;
 41             }
 42             set
 43             {
 44                 head = value;
 45             }
 46         }
 47         #endregion
 48 
 49         #region 基本操作
 50         // 构造方法
 51         public LinkedList()
 52         {
 53             head = null;
 54         }
 55 
 56         // 获取单链表的长度
 57         public int GetLength()
 58         {
 59             // 设置指针指向头结点
 60             Node<T> p = head;
 61 
 62             // 定义存储数据的变量
 63             int len = 0;
 64 
 65             // 当当前指针指向的地址不是为null时表示存在该结点
 66             while (p != null)
 67             {
 68                 len++;
 69                 p = p.Next; // 指针继续指向引用域所指向的结点
 70             }
 71 
 72             return len;
 73         }
 74 
 75         // 清空单链表
 76         // 此处只是将头结点的引用域设置为null的逻辑清空,在内存中数据依旧存在
 77         // 但是.NET的垃圾回收器会为我们回收这部分垃圾
 78         public void Clear()
 79         {
 80             head = null;
 81         }
 82 
 83         // 判断单链表是否为空
 84         public bool IsEmpty()
 85         {
 86             // 根据头结点的引用域是否为null判断是否为空
 87             if (head == null)
 88             {
 89                 return true;
 90             }
 91             else
 92             {
 93                 return false;
 94             }
 95         }
 96 
 97         // 在单链表尾部追加数据元素
 98         public bool Append(T item)
 99         {
100             Node<T> node = new Node<T>(item);
101             Node<T> p = new Node<T>();
102 
103             // 判断此时是否为空表,是则直接修改头结点的引用域
104             if (head == null)
105             {
106                 head = node;
107             }
108             // 不是则遍历结点,找到最后最后一个结点
109             else
110             {
111                 p = head;
112                 while (p.Next != null)
113                 {
114                     p = p.Next;
115                 }
116 
117                 // 设置最后一个结点的引用域为追加数据元素的地址
118                 p.Next = node;
119             }
120 
121             return true;
122         }
123 
124         // 在单链表的第i个结点的位置前插入一个值为item的结点
125         public bool Insert(T item, int i)
126         {
127             // 判断是否为空表
128             if (IsEmpty())
129             {
130                 Console.WriteLine("单链表中不存在数据元素,无法执行插入操作,操作失败!");
131                 return false;
132             }
133             // 判断用户指定的插入位置是否合理
134             else if (i < 1)
135             {
136                 Console.WriteLine("插入元素的位置不正确,无法执行插入操作,操作失败!");
137                 return false;
138             }
139             // 判断是否操作第一个结点
140             else if (i == 1)
141             {
142                 // 操作第一个结点
143                 Node<T> node = new Node<T>(item);
144                 node.Next = head;
145                 head = node;
146                 return true;
147             }
148             // 执行一般插入操作
149             else
150             {
151                 Node<T> p = head;
152                 Node<T> pre = new Node<T>();
153                 int j = 1;
154 
155                 // 遍历直到当前结点的位置为i
156                 // 如果插入位置超过单链表长度,则插入失败
157                 while (p.Next != null && j < i)
158                 {
159                     pre = p;
160                     p = p.Next;
161                     j++;
162                 }
163 
164                 if (j == i)
165                 {
166                     Node<T> node = new Node<T>(item);
167                     node.Next = p;
168                     pre.Next = node;
169                     return true;
170                 }
171                 else
172                 {
173                     Console.WriteLine("插入元素的位置不正确,无法执行插入操作,操作失败!");
174                     return false;
175                 }
176             }
177         }
178 
179 
180         // 在单链表的第i个结点的位置后插入一个值为item的结点
181         public bool InsertPost(T item, int i)
182         {
183             // 判断是否为空表
184             if (IsEmpty())
185             {
186                 Console.WriteLine("单链表中不存在数据元素,无法执行插入操作,操作失败!");
187                 return false;
188             }
189             // 判断用户指定的插入位置是否合理
190             else if (i < 1)
191             {
192                 Console.WriteLine("插入元素的位置不正确,无法执行插入操作,操作失败!");
193                 return false;
194             }
195             // 判断是否操作第一个结点
196             else if (i == 1)
197             {
198                 // 操作第一个结点
199                 Node<T> node = new Node<T>(item);
200                 node.Next = head;
201                 head = node;
202                 return true;
203             }
204             // 执行一般插入操作
205             else
206             {
207                 Node<T> p = head;
208                 Node<T> pre = new Node<T>();
209                 int j = 1;
210 
211                 // 遍历直到当前结点的位置为i
212                 // 如果插入位置超过单链表长度,则插入失败
213                 while (p.Next != null && j < i)
214                 {
215                     pre = p;
216                     p = p.Next;
217                     j++;
218                 }
219 
220                 if (j == i)
221                 {
222                     Node<T> node = new Node<T>(item);
223                     node.Next = p.Next;
224                     p.Next = node;
225                     return true;
226                 }
227                 else
228                 {
229                     Console.WriteLine("插入元素的位置不正确,无法执行插入操作,操作失败!");
230                     return false;
231                 }
232             }
233         }
234 
235         // 删除单链表的第i个结点,只是修改引用域,逻辑上的删除,由垃圾回收器回收
236         public T Delete(int i)
237         {
238             // 定义要返回的元素,并赋初值
239             T tmp = default(T);
240 
241             // 判断是否为空表
242             if (IsEmpty())
243             {
244                 Console.WriteLine("单链表中不存在数据元素,无法执行删除操作,操作失败!");
245             }
246             // 判断用户指定的删除位置是否合理
247             else if (i < 1)
248             {
249                 Console.WriteLine("删除元素的位置不正确,无法执行删除操作,操作失败!");
250             }
251             // 判断是否操作第一个结点
252             else if (i == 1)
253             {
254                 // 操作第一个结点
255                 Node<T> node = head;
256                 head = head.Next;
257                 tmp = node.Data;
258             }
259             // 执行一般删除操作
260             else
261             {
262                 Node<T> node = new Node<T>();
263                 Node<T> p = head;
264                 int j = 1;
265 
266                 while (p.Next != null && j < i)
267                 {
268                     node = p;
269                     p = p.Next;
270                     j++;
271                 }
272 
273                 if (j == i)
274                 {
275                     node.Next = p.Next;
276                     tmp = p.Data;
277                 }
278                 else
279                 {
280                     Console.WriteLine("删除元素的位置不正确,无法执行删除操作,操作失败!");
281                 }
282             }
283 
284             // 返回被操作的元素(或默认值)
285             return tmp;
286         }
287 
288         // 获得单链表中第i个数据元素
289         public T GetElem(int i)
290         {
291             // 定义要返回的元素,并赋初值
292             T tmp = default(T);
293 
294             // 判断是否为空表
295             if (IsEmpty())
296             {
297                 Console.WriteLine("单链表表中不存在数据元素,无法执行获取操作,操作失败!");
298             }
299             // 判断用户指定的获取位置是否合理
300             else if (i < 1)
301             {
302                 Console.WriteLine("获取元素的位置不正确,无法执行获取操作,操作失败!");
303             }
304             // 执行获取操作,如果位置超过单链表长度,则获得到的为最后一个结点的值
305             else
306             {
307                 Node<T> p = new Node<T>();
308                 p = head;
309                 int j = 1;
310 
311                 while (p.Next != null && j < i)
312                 {
313                     p = p.Next;
314                     j++;
315                 }
316 
317                 tmp = p.Data;
318             }
319 
320             // 返回被操作的元素(或默认值)
321             return tmp;
322         }
323 
324         // 在单链表中查找值为value的结点
325         public int Locate(T value)
326         {
327             // 定义要返回的索引,-1表示未找到或查找失败【注意:此处i表示是索引,而非位置!】
328             int i;
329 
330             // 判断是否为空表
331             if (IsEmpty())
332             {
333                 Console.WriteLine("单链表表中不存在数据元素,无法执行查找操作,操作失败!");
334                 i = -1;
335             }
336             // 执行查找操作
337             else
338             {
339                 Node<T> p = new Node<T>();
340                 p = head;
341                 i = 0;
342                 while (!p.Data.Equals(value) && p.Next != null)
343                 {
344                     p = p.Next;
345                     i++;
346                 }
347             }
348 
349             // 返回查找到的索引(或默认值)
350             return i;
351         }
352         #endregion
353 
354         #region 高级操作
355         // 打印单链表所有结点
356         public void PrintAllNode()
357         {
358             // 判断是否为空表
359             if (IsEmpty())
360             {
361                 Console.WriteLine("单链表表中不存在数据元素,无法执行打印操作,操作失败!");
362             }
363             // 执行打印操作
364             else
365             {
366                 Console.WriteLine("打印单链表中的数据元素:\n");
367                 Node<T> p = new Node<T>();
368                 p = head;
369                 while (p.Next != null)
370                 {
371                     Console.Write(p.Data + "\t");
372                     p = p.Next;
373                 }
374 
375                 // 打印最后一个结点
376                 Console.Write(p.Data + "\t");
377 
378                 Console.WriteLine();
379             }
380         }
381         #endregion
382     }

 

C# 单链表

标签:

原文地址:http://www.cnblogs.com/strony/p/5218917.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!