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动态生成. 每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指 ...
最新文章
- QIIME 2教程. 14数据评估和质控q2-quality-control(2021.2)
- 解密:依图如何一年实现语音识别指标超巨头玩家
- 审批政策中收入与负债核实
- C#_获取 SQL服务器列表
- Linux 进程状态【转】
- mRNA定位数据库mRNALocater使用指南
- 满满的干货!mysql技术介绍
- Java中null和浮点数相乘_jvm规范之浮点数 - 你知道吗,有个数字它和自身不相等...
- 直播系统源码开发 JavaCV实现本机摄像头画面远程直播
- adguard home上网慢_老毛子/Padavan设置SmartDNS提速+AdGuard Home去广告之东施效颦
- WIN10REALTEL高清音频管理器如何调音?调音无效怎么办?
- 微信开放平台Android应用签名的本质及如何获取
- 大一春季联赛,dfs简单题(思路)
- html表格去除间距,table 去掉 td之间间距
- redux react-redux简介
- 题材丰富 医药板块初露峥嵘
- 19级爪哇程序设计新手赛(题解)
- 怎样用计算机打出Abc,智能ABC输入法如何安装?win7智能ABC输入法安装步骤
- python 视频快速温习_传智播客python12天学会Python系列视频 177个视频教程 完整学......
- 投身物联网创业6个月,我是如何选择 IoT 物联网平台的?
热门文章
- 零基础可以学python吗-零基础可以学会python吗?python好学吗?
- 一个python程序员需要掌握的知识-python初学者搭建网站需要了解的基础知识
- python难嘛-学python难吗
- python可以做什么工作好-会python语言能做什么工作
- python常见错误-python中的错误有什么
- python怎样画立体图形-用python来画出高光谱遥感影像的3D立体图
- 如何检查电脑是否安装了python-python-如何检查安装了scikit的nltk版本?
- python基础语法合集-python常用语法合集
- python零基础实例-Python初学零基础也不怕,从0开始!
- 哪个版本python适用于windows-何种版本的Python适合您