数据结构之单链表学习

  1using System;
  2using System.Collections.Generic;
  3using System.Text;
  4using System.Collections;
  5
  6namespace 单链表
  7ExpandedBlockStart.gifContractedBlock.gif{
  8    class Program
  9ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 10        public interface IListDS<T>
 11ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 12            int GetLength();         //获取表长度
 13            void Clear();              //清空
 14            bool IsEmpty();            //判断表是否为空
 15            void Append(T item);     //附加操作
 16            void Insert(T item, int i);  //插入
 17            T Delete(int i);      //删除
 18            T GetElem(int i);     //取表元
 19            int Locate(T value);  //按值查找
 20          
 21        }

 22        public class Node<T>
 23ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 24            private T data; //数据域
 25            private Node<T> next; //引用域
 26
 27            //构造器
 28            public Node(T val, Node<T> P)
 29ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 30                data = val;
 31                next = P;
 32            }

 33            //构造器
 34            public Node(Node<T> P)
 35ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 36                next = P;
 37            }

 38            //构造器
 39            public Node(T val)
 40ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 41                data = val;
 42                next = null;
 43            }

 44            //构造器
 45            public Node()
 46ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 47                data = default(T);
 48                next = null;
 49            }

 50
 51            //数据域属性
 52            public T Data
 53ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 54                get
 55ExpandedSubBlockStart.gifContractedSubBlock.gif                {
 56                    return data;
 57                }

 58                set
 59ExpandedSubBlockStart.gifContractedSubBlock.gif                {
 60                    data = value;
 61                }

 62            }

 63
 64            //引用域
 65            public Node<T> Next
 66ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 67                get
 68ExpandedSubBlockStart.gifContractedSubBlock.gif                {
 69                    return next;
 70                }

 71                set
 72ExpandedSubBlockStart.gifContractedSubBlock.gif                {
 73                    next = value;
 74                }

 75            }

 76
 77
 78        }

 79
 80        public class LinkList<T> : IListDS<T>
 81ExpandedSubBlockStart.gifContractedSubBlock.gif        
 82           //单链表头引用
 83            private Node<T> head;
 84            //头引用属性
 85            public Node<T> Head
 86ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 87                get
 88ExpandedSubBlockStart.gifContractedSubBlock.gif                {
 89                    return head;
 90                }

 91                set
 92ExpandedSubBlockStart.gifContractedSubBlock.gif                {
 93                    head = value;
 94                }

 95            }

 96
 97            //构造器
 98            public LinkList()
 99ExpandedSubBlockStart.gifContractedSubBlock.gif            {
100                head = null;
101            }

102
103            //求单链表长度
104            public int GetLength()
105ExpandedSubBlockStart.gifContractedSubBlock.gif            {
106                Node<T> P = head;
107                int len = 0;
108                while (P != null)
109ExpandedSubBlockStart.gifContractedSubBlock.gif                {
110                    ++len;
111                    P = P.Next;
112                    
113                }

114                return len;
115            }

116
117            //清空
118            public void Clear()
119ExpandedSubBlockStart.gifContractedSubBlock.gif            {
120                head = null;
121            }

122
123            //判断单链表是否为空
124            public bool IsEmpty()
125ExpandedSubBlockStart.gifContractedSubBlock.gif            {
126                if (head == null)
127ExpandedSubBlockStart.gifContractedSubBlock.gif                {
128                    return true;
129                }

130                else
131ExpandedSubBlockStart.gifContractedSubBlock.gif                {
132                    return false;
133                }

134            }

135
136            //插入头结点
137            public void InsertHead(T item)
138ExpandedSubBlockStart.gifContractedSubBlock.gif            {
139                head = new Node<T>(item,head);
140            }

141
142
143
144            //单链表末尾添加新元素
145            public void Append(T item)
146ExpandedSubBlockStart.gifContractedSubBlock.gif            {
147                Node<T> q = new Node<T>(item);
148                Node<T> p=new Node<T>();
149                if (head == null)
150ExpandedSubBlockStart.gifContractedSubBlock.gif                {
151                    head = q;
152                    return;
153                }

154                p = head;
155                while (p.Next != null)
156ExpandedSubBlockStart.gifContractedSubBlock.gif                {
157                    p = p.Next;
158                }

159                p.Next = q;
160
161            }

162
163            //在单链表的第i个节点的位置前插入一个值为item的节点
164            public void Insert(T item, int i)
165ExpandedSubBlockStart.gifContractedSubBlock.gif            {
166                if (IsEmpty() || i < 1)
167ExpandedSubBlockStart.gifContractedSubBlock.gif                {
168                    Console.WriteLine("表为空!");
169                    return;
170                }

171                if (i == 1)
172ExpandedSubBlockStart.gifContractedSubBlock.gif                {
173                    Node<T> q = new Node<T>(item);
174                    q.Next = head;
175                    head = q;
176                    return;
177                }

178                Node<T> p = head;
179                Node<T> r=new Node<T>();
180                int j = 1;
181                while (p.Next != null && j < i)
182ExpandedSubBlockStart.gifContractedSubBlock.gif                {
183                    r = p;
184                    p = p.Next;
185                    ++j;
186                }

187                if (j == i)
188ExpandedSubBlockStart.gifContractedSubBlock.gif                {
189                    Node<T> q = new Node<T>(item);
190                    q.Next = p;
191                    r.Next = q;
192                }

193
194            }

195
196
197
198            //在单链表的第i个节点的位置后插入一个值为item的节点
199            public void InsertPost(T item, int i)
200ExpandedSubBlockStart.gifContractedSubBlock.gif            {
201                if (IsEmpty() || i < 1)
202ExpandedSubBlockStart.gifContractedSubBlock.gif                {
203                    Console.WriteLine("表为空!");
204                    return;
205                }

206                if (i == 1)
207ExpandedSubBlockStart.gifContractedSubBlock.gif                {
208                    Node<T> q = new Node<T>(item);
209                    q.Next = head.Next;
210                    head.Next = q;
211                    return;
212                }

213                Node<T> p = head;
214                int j = 1;
215                while (p != null && j < i)
216ExpandedSubBlockStart.gifContractedSubBlock.gif                {
217                    p = p.Next;
218                    ++j;
219                }

220                if (j == i)
221ExpandedSubBlockStart.gifContractedSubBlock.gif                {
222                    Node<T> q = new Node<T>(item);
223                    q.Next = p.Next;
224                    p.Next = q;
225                }

226            }

227
228            //删除单链表第i个节点
229            public T Delete(int i)
230ExpandedSubBlockStart.gifContractedSubBlock.gif            {
231                if (IsEmpty() || i < 1)
232ExpandedSubBlockStart.gifContractedSubBlock.gif                {
233                    Console.WriteLine("表为空!");
234                    return default(T);
235                }

236                Node<T> q = new Node<T>();
237                if (i == 1)
238ExpandedSubBlockStart.gifContractedSubBlock.gif                {
239                    q = head;
240                    head = head.Next;
241                    return q.Data;
242
243                }

244                Node<T> p = head;
245                int j = 1;
246                while (p.Next != null && j < i)
247ExpandedSubBlockStart.gifContractedSubBlock.gif                {
248                    ++j;
249                    q = p;
250                    p = p.Next;
251                }

252                if (j == i)
253ExpandedSubBlockStart.gifContractedSubBlock.gif                {
254                    q.Next = p.Next;
255                    return p.Data;
256                }

257                else
258ExpandedSubBlockStart.gifContractedSubBlock.gif                {
259                    Console.WriteLine("这个节点不存在!");
260                    return default(T);
261                }

262
263            }

264
265            //获得单链表第i个数据元素
266            public T GetElem(int i)
267ExpandedSubBlockStart.gifContractedSubBlock.gif            {
268                if (IsEmpty() || i < 1)
269ExpandedSubBlockStart.gifContractedSubBlock.gif                {
270                    Console.WriteLine("表为空!");
271                    return default(T);
272                }

273                Node<T> p = new Node<T>();
274                p = head;
275                int j = 1;
276                while (p.Next != null && j < i)
277ExpandedSubBlockStart.gifContractedSubBlock.gif                {
278                    ++j;
279                    p = p.Next;
280                }

281
282                if (j == i)
283ExpandedSubBlockStart.gifContractedSubBlock.gif                {
284                    return p.Data;
285                }

286                else
287ExpandedSubBlockStart.gifContractedSubBlock.gif                {
288                    Console.WriteLine("这个节点不存在!");
289                    return default(T);
290
291                }

292
293            }

294
295            //在单链表中查找值为value的元素
296            public int Locate(T value)
297ExpandedSubBlockStart.gifContractedSubBlock.gif            {
298                
299                if (IsEmpty())
300ExpandedSubBlockStart.gifContractedSubBlock.gif                {
301                    Console.WriteLine("表为空!");
302                    return -1;
303                }

304                Node<T> p = new Node<T>();
305                p = head;
306                int i = 1;
307                while (!p.Data.Equals(value) && p.Next != null)
308ExpandedSubBlockStart.gifContractedSubBlock.gif                {
309                    p = p.Next;
310                    ++i;
311                }

312                return i;
313
314            }

315           
316                
317            
318
319        }

320
321        static void Main(string[] args)
322ExpandedSubBlockStart.gifContractedSubBlock.gif        {
323            //创建firstnode,secnode,thirdnode三个结点,并赋予对应的值
324            Node<int> firstnode=new Node<int>(1);
325            Node<int> secnode = new Node<int>(2);
326            Node<int> thirdnode = new Node<int>(3);
327            //指定结点之间的连接顺序
328            firstnode.Next = secnode;
329            secnode.Next = thirdnode;
330            thirdnode.Next = null;
331            //实例化LinkList
332            LinkList<int> list = new LinkList<int>();
333            //指定头Head
334            list.Head = firstnode;
335            //在第3个元素之前插入值4
336            list.Insert(4,3);
337            //在第4个元素之后插入值5
338            list.InsertPost(5,4);
339            //末尾插入值6
340            list.Append(6);
341            //输出单链表中的数据域
342            Node<int> current = new Node<int>();
343            current =list.Head;
344            while (current != null)
345ExpandedSubBlockStart.gifContractedSubBlock.gif            {
346                Console.WriteLine(current.Data);
347                current = current.Next;
348            }

349
350            //查找值为5的位置
351            Console.WriteLine(list.Locate(5));
352            
353
354        }

355    }

356}

357

按照例子敲的过程中,对泛型类的实例化花了点功夫,对泛型有了初步认识,在输出单链表时候没有写成方法,希望博友提出改进意见。

 

 

转载于:https://www.cnblogs.com/zhangq0309/archive/2009/03/05/1404108.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值