集合的概念
集合是由一些确定的、彼此不同的成员或者元素构成的一个整体。如果将紧密相关的数据组合到一个集合中,则能够更有效地处理这些紧密相关的数据。代替编写不同的代码来处理每一单独的对象,您可以使用相同的调用代码来处理一个集合的所有元素。

在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#数据结构之集合的实现(数组及链表两种实现)相关推荐

  1. 猴子选王c语言链表程序代码,c/c++编程题 之 猴子选大王(数组、链表两种方法)...

    题目描述 一群猴子要选新猴王.新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1-N号.从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报 ...

  2. java hashmap 去重_java数组去重的两种方法

    我们对于数组元素的使用,有时候在创建数组的初期,并没有考虑过元素的重复问题.当我们想要不重复元素的数组时,就要再进行一步去重的工作.数组的去重有两种方法可以实现,一个是循环比较,另一个是hashSet ...

  3. java数组去重方法是,java数组去重的两种方法

    我们对于数组元素的使用,有时候在创建数组的初期,并没有考虑过元素的重复问题.当我们想要不重复元素的数组时,就要再进行一步去重的工作.数组的去重有两种方法可以实现,一个是循环比较,另一个是hashSet ...

  4. c语言关于数组输入的两种方式

    今天上课的时候老师有讲到数组输入有两种方式,一种是直接赋值输入进数组,第二种是利用地址赋给数组,下面是代码: 第一种:直接输入 void model(int *p)//(int p[]){for(i= ...

  5. 多维数组存储的两种方式

    1 数组存储的要求 数组存储的要求:连续存储. 连续:数组的n个元素对应n(或n+1)个内存地址,两相邻元素的地址相邻. 相邻元素:对于一维数组来说,相邻元素没有多大的选择,就是下标差绝对值为1的两元 ...

  6. (C++)字符数组初始化的两种方法

    #include<cstdio> //字符数组的两种赋值方法 int main(){//1.方法一char str1[14] = {'I',' ','l','o','v','e',' ', ...

  7. leetcode 349. 两个数组的交集 两种方案,c语言实现

    如题: 给定两个数组,编写一个函数来计算它们的交集.示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2]示例 2: 输入: nums1 = [4,9,5 ...

  8. php 便利jq,jquery怎样遍历数组?jquery遍历数组常用的两种方式

    在jquery中,我们常用$().each和$.each()这两个方法来进行数组的遍历,$().each和$.each()这两种方法表面看起来好像差不多,但是,实际上这两个方法是有区别的,两个方法在针 ...

  9. 常见的数据结构——栈、队列、数组、链表和红黑树

    链表 链表:linked list,由一系列结点node(链表中每一个元素称为结点)组成,结点可以在运行时i动态生成. 每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指 ...

最新文章

  1. QIIME 2教程. 14数据评估和质控q2-quality-control(2021.2)
  2. 解密:依图如何一年实现语音识别指标超巨头玩家
  3. 审批政策中收入与负债核实
  4. C#_获取 SQL服务器列表
  5. Linux 进程状态【转】
  6. mRNA定位数据库mRNALocater使用指南
  7. 满满的干货!mysql技术介绍
  8. Java中null和浮点数相乘_jvm规范之浮点数 - 你知道吗,有个数字它和自身不相等...
  9. 直播系统源码开发 JavaCV实现本机摄像头画面远程直播
  10. adguard home上网慢_老毛子/Padavan设置SmartDNS提速+AdGuard Home去广告之东施效颦
  11. WIN10REALTEL高清音频管理器如何调音?调音无效怎么办?
  12. 微信开放平台Android应用签名的本质及如何获取
  13. 大一春季联赛,dfs简单题(思路)
  14. html表格去除间距,table 去掉 td之间间距
  15. redux react-redux简介
  16. 题材丰富 医药板块初露峥嵘
  17. 19级爪哇程序设计新手赛(题解)
  18. 怎样用计算机打出Abc,智能ABC输入法如何安装?win7智能ABC输入法安装步骤
  19. python 视频快速温习_传智播客python12天学会Python系列视频 177个视频教程 完整学......
  20. 投身物联网创业6个月,我是如何选择 IoT 物联网平台的?

热门文章

  1. 零基础可以学python吗-零基础可以学会python吗?python好学吗?
  2. 一个python程序员需要掌握的知识-python初学者搭建网站需要了解的基础知识
  3. python难嘛-学python难吗
  4. python可以做什么工作好-会python语言能做什么工作
  5. python常见错误-python中的错误有什么
  6. python怎样画立体图形-用python来画出高光谱遥感影像的3D立体图
  7. 如何检查电脑是否安装了python-python-如何检查安装了scikit的nltk版本?
  8. python基础语法合集-python常用语法合集
  9. python零基础实例-Python初学零基础也不怕,从0开始!
  10. 哪个版本python适用于windows-何种版本的Python适合您