c#数据结构之集合的实现(数组及链表两种实现)
集合的概念
集合是由一些确定的、彼此不同的成员或者元素构成的一个整体。如果将紧密相关的数据组合到一个集合中,则能够更有效地处理这些紧密相关的数据。代替编写不同的代码来处理每一单独的对象,您可以使用相同的调用代码来处理一个集合的所有元素。
在c#中可以使用 Array 类和 System.Collections 类添加、移除和修改集合中的个别元素或某一范围内的元素。甚至可以将整个集合复制到另一个集合中。在 .NET Framework 2.0 版中,泛型集合类提供了新功能,并使得创建强类型集合变得容易。
虽然c#中提供了多种集合类可供我们选择,但为了加深对这种数据类型的理解,构造自己的集合类无疑是最好的选择。下面给出了基于数组及链表两种实现的集合类。
1//集合的接口,定义了集合类中应实现的所有方法
2 public interface IBag:IEnumerable
3 {
4
void Add(object element);//添加一个对象到集合中
5 void AddAll(IBag bag);//把一个集合中的所有对象添加到另一个集合中
6 int Size
{get;}//获得集合的大小
7 bool IsEmpty();//检查集合是否为空
8 object RemoveRandom();//随机从集合中删除一个对象
9 object Remove(object target);//删除指定的元素
10 IBag Union(IBag bag);//合并两个集合中的元素,得到一个新的集合
11 bool Contains(object target);检查指定对象是否在集合中
12 }
13
14
15//集合的数组实现
16
17 public class ArrayBag:IBag
18
{
19 int DEDAULT_CAPACITY = 1000;
20 Random random = new Random();
21 int count=0;
22 object[] contents;
23
24 public ArrayBag()
25
{
26 contents = new object[DEDAULT_CAPACITY];
27 //count = 0;
28 }
29 public ArrayBag(int initialCapacity)
30
{
31 contents = new object[initialCapacity];
32 // count = 0;
33 }
34 IBag 成员#region IBag 成员
35
36 public void Add(object element)
37
{
38 if (Size == contents.Length)
39
{
40 ExpandCapacity();
41 }
42 contents[count] = element;
43 count++;
44 }
45 private void ExpandCapacity()
46
{
47 object[] temp = new object[contents.Length * 2];
48 for (int index = 0; index < contents.Length; index++)
49
{
50 temp[index] = contents[index];
51 }
52 contents = temp;
53 }
54
55 public void AddAll(IBag bag)
56
{
57 foreach (object o in bag)
58
{
59 Add(o);
60 }
61 }
62
63 public int Size
64
{
65 get
{ return count; }
66 }
67
68 public bool IsEmpty()
69
{
70 return (count==0);
71 }
72
73 public object RemoveRandom()
74
{
75 if (IsEmpty())
76
{
77 throw new Exception("this colleciton is empty!");
78 }
79 int choice = random.Next(count);
80
81 object result = contents[choice];
82 contents[choice] = contents[count - 1];
83 contents[count - 1] = null;
84 count--;
85 return result;
86 }
87
88 public object Remove(object target)
89
{
90 if (IsEmpty())
91
{
92 throw new Exception("the collection is empty");
93 }
94 int index = Find(target);
95 if (index == -1)
96
{
97 throw new Exception("not found!");
98 }
99 else
100
{
101 object result = contents[index];
102 contents[index] = contents[count - 1];
103 contents[count - 1] = null;
104 count--;
105 return result;
106 }
107 }
108
109 private int Find(object target)
110
{
111 for (int i = 0; i < count; i++)
112
{
113 if (contents[i].Equals(target))
114 return i;
115 }
116 return -1;
117 }
118
119 public IBag Union(IBag bag)
120
{
121 ArrayBag both = new ArrayBag();
122 for (int index = 0; index < count; index++)
123
{
124 both.Add(contents[index]);
125 }
126 foreach (object o in bag)
127
{
128 both.Add(o);
129 }
130 return both;
131 }
132
133 public bool Contains(object target)
134
{
135 if (Find(target) != -1)
136
{
137 return true;
138 }
139 else
140
{
141 return false;
142 }
143 }
144
145
146 public IEnumerator GetEnumerator()
147
{
148 for (int index = 0; index < count; index++)
149
{
150 yield return contents[index];
151 }
152 }
153
154 #endregion
155
156 public override string ToString()
157
{
158 StringBuilder sb = new StringBuilder();
159 for (int i = 0; i < count; i++)
160
{
161 sb.Append(contents[i] + " ");
162 }
163 return sb.ToString();
164 }
165
166 }
167}
168
169//集合的链表实现
170 public class LinkNode
171
{
172 object element;
173
174 public object Element
175
{
176 get
{ return element; }
177 set
{ element = value; }
178 }
179 LinkNode next;
180
181 public LinkNode Next
182
{
183 get
{ return next; }
184 set
{ next = value; }
185 }
186 public LinkNode(object element)
187
{
188 this.element = element;
189 next = null;
190 }
191 public LinkNode()
192
{
193 }
194
195 }
196 public class LinkedBag:IBag
197
{
198 IBag 成员#region IBag 成员
199
200 LinkNode contents;
201 int count;
202 Random r = new Random();
203
204 public void Add(object element)
205
{
206 LinkNode node = new LinkNode(element);
207 node.Next = contents;
208 contents = node;
209 count++;
210 }
211
212 public void AddAll(IBag bag)
213
{
214 foreach (object o in bag)
215
{
216 Add(o);
217 }
218 }
219
220 public int Size
221
{
222 get
{ return count; }
223 }
224
225 public bool IsEmpty()
226
{
227 return (count==0);
228 }
229
230 public object RemoveRandom()
231
{
232 object result = null;
233 LinkNode previous, current;
234 if (IsEmpty())
235
{
236 throw new Exception("collection is empty!");
237 }
238 int choice = r.Next(count);
239 if (choice == 0)
240
{
241 result = contents.Element;
242 contents = contents.Next;
243 }
244 else
245
{
246 previous = contents;
247 for (int i = 1; i < choice; i++)
248
{
249 previous = previous.Next;
250 }
251 current = previous.Next;
252 result = current.Element;
253 previous.Next = current.Next;
254 }
255 count--;
256 return result;
257 }
258
259 public object Remove(object target)
260
{
261 bool found = false;
262 LinkNode previous, current;
263 object result = null;
264 if (IsEmpty())
265
{
266 throw new Exception("collection is empty!");
267 }
268 if (contents.Element.Equals(target))
269
{
270 result = contents.Element;
271 contents = contents.Next;
272 }
273 else
274
{
275 previous = contents;
276 current = previous.Next;
277 for(int i=1;i<count&&!found;i++)
278
{
279 if (current.Element.Equals(target))
280
{
281 found = true;
282 }
283 previous = current;
284 current = previous.Next;
285 }
286 if (!found)
287
{
288 throw new Exception("Elements not found!");
289 }
290 result = current.Next;
291 previous.Next = current.Next;
292 }
293 count--;
294 return result;
295 }
296
297 public IBag Union(IBag bag)
298
{
299 LinkedBag both = new LinkedBag();
300 foreach (LinkNode node in this)
301
{
302 both.Add(node.Element);
303 }
304 foreach (LinkNode node in bag)
305
{
306 both.Add(node.Element);
307 }
308 return both;
309 }
310
311 public bool Contains(object target)
312
{
313 bool found = false;
314 LinkNode current = contents;
315 while (current != null && !found)
316
{
317 if (current.Element.Equals(target))
318
{
319 found = true;
320 }
321 current = current.Next;
322 }
323 return found;
324 }
325
326 #endregion
327
328 IEnumerable 成员#region IEnumerable 成员
329
330 public System.Collections.IEnumerator GetEnumerator()
331
{
332 LinkNode current = contents;
333 while (current != null)
334
{
335 yield return current;
336 current = current.Next;
337 }
338 }
339
340 #endregion
341
342 public override string ToString()
343
{
344 StringBuilder sb = new StringBuilder();
345 foreach (LinkNode node in this)
346 sb.Append(node.Element.ToString() + " ");
347 return sb.ToString();
348 }
349 }
转载于:https://www.cnblogs.com/healer_zll/archive/2008/11/22/1338809.html
c#数据结构之集合的实现(数组及链表两种实现)相关推荐
- 猴子选王c语言链表程序代码,c/c++编程题 之 猴子选大王(数组、链表两种方法)...
题目描述 一群猴子要选新猴王.新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1-N号.从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报 ...
- java hashmap 去重_java数组去重的两种方法
我们对于数组元素的使用,有时候在创建数组的初期,并没有考虑过元素的重复问题.当我们想要不重复元素的数组时,就要再进行一步去重的工作.数组的去重有两种方法可以实现,一个是循环比较,另一个是hashSet ...
- java数组去重方法是,java数组去重的两种方法
我们对于数组元素的使用,有时候在创建数组的初期,并没有考虑过元素的重复问题.当我们想要不重复元素的数组时,就要再进行一步去重的工作.数组的去重有两种方法可以实现,一个是循环比较,另一个是hashSet ...
- c语言关于数组输入的两种方式
今天上课的时候老师有讲到数组输入有两种方式,一种是直接赋值输入进数组,第二种是利用地址赋给数组,下面是代码: 第一种:直接输入 void model(int *p)//(int p[]){for(i= ...
- 多维数组存储的两种方式
1 数组存储的要求 数组存储的要求:连续存储. 连续:数组的n个元素对应n(或n+1)个内存地址,两相邻元素的地址相邻. 相邻元素:对于一维数组来说,相邻元素没有多大的选择,就是下标差绝对值为1的两元 ...
- (C++)字符数组初始化的两种方法
#include<cstdio> //字符数组的两种赋值方法 int main(){//1.方法一char str1[14] = {'I',' ','l','o','v','e',' ', ...
- leetcode 349. 两个数组的交集 两种方案,c语言实现
如题: 给定两个数组,编写一个函数来计算它们的交集.示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2]示例 2: 输入: nums1 = [4,9,5 ...
- php 便利jq,jquery怎样遍历数组?jquery遍历数组常用的两种方式
在jquery中,我们常用$().each和$.each()这两个方法来进行数组的遍历,$().each和$.each()这两种方法表面看起来好像差不多,但是,实际上这两个方法是有区别的,两个方法在针 ...
- 常见的数据结构——栈、队列、数组、链表和红黑树
链表 链表:linked list,由一系列结点node(链表中每一个元素称为结点)组成,结点可以在运行时i动态生成. 每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指 ...
最新文章
- 2022-2028年中国刨花板市场投资分析及前景预测报告(全卷)
- python: c_char_p指向的bitmap图像数据,通过c_char_Array最终赋值给PIL的Image对象
- 0xBenchmark中垃圾回收测试模块的分析及改进
- 算法的威力:法国人用台式机打破由超级计算机创造的圆周率运算世界记录
- arm-none-eabi-gcc install
- mysql语法学习(一)__Instances__表
- 如何在JUnit 5中替换规则
- php多站点共享用户表,php – Zend_Auth:允许用户登录到多个表/身份
- RedHat Enterprise Linux Server 5 在VMware Workstation 6.5的详细安装过程(2)
- mysql 性能优化 20 条建议
- Java 如何优雅的导出 Excel
- python: 上下文管理器(context manager)
- 知识图谱构建技术一览
- wav音频文件转换为sbc音频文件
- android eclipse ddms 查看线程,android ddms中查看线程释疑
- php ccbsign.rsasig,Maven整合SSM和建行龙支付
- Java实现消息队列服务
- 2022年最新谷歌商店上架_Google Play 上架全流程附图
- FR-报表应用-分组报表-动态显示N个分组
- 渗透测试-----ARP攻击
热门文章
- python 在地图上的散点图-Matplotlib中的散点图等高线
- 学python需要多久-零基础学习python,要多久才可以学好并且找到工作?
- python笔记基础-Python学习笔记(基础)
- 精通python网络爬虫-精通Python网络爬虫 PDF 高清版
- 我在学python-你们以为我在学C++?其实我在学Python!人生苦短!
- python可以干什么-Python可以用来做什么 为你揭开python神秘面纱
- python面试-10个Python面试常问的问题(小结)
- python使用教程pandas-Python之Pandas使用教程
- python3下载文件-使用Python 3从网上下载文件
- 学python需要什么文化基础-中国文化走的是()的路线。