📄 multisetaslinkedlist.cs
字号:
namespace Opus6
{
using System;
using System.Collections;
[Copyright("Copyright (c) 2001 by Bruno R. Preiss, P.Eng."), Version("$Id: MultisetAsLinkedList.cs,v 1.5 2001/10/28 19:50:09 brpreiss Exp $")]
public class MultisetAsLinkedList : AbstractSet, Multiset, SearchableContainer, Container, IComparable, IEnumerable
{
public MultisetAsLinkedList(int n) : base(n)
{
this.list = new LinkedList();
}
public override void Accept(Visitor visitor)
{
for (LinkedList.Element element1 = this.list.Head; element1 != null; element1 = element1.Next)
{
visitor.Visit(element1.Datum);
if (visitor.IsDone)
{
return;
}
}
}
public override int CompareTo(object arg)
{
throw new MethodNotImplementedException();
}
public virtual Multiset Difference(Multiset set)
{
MultisetAsLinkedList list1 = (MultisetAsLinkedList) set;
if (base.universeSize != list1.universeSize)
{
throw new ArgumentException("mismatched sets");
}
MultisetAsLinkedList list2 = new MultisetAsLinkedList(base.universeSize);
LinkedList.Element element1 = this.list.Head;
LinkedList.Element element2 = list1.list.Head;
while ((element1 != null) && (element2 != null))
{
int num1 = ((int) element1.Datum) - ((int) element2.Datum);
if (num1 < 0)
{
list2.list.Append(element1.Datum);
}
if (num1 <= 0)
{
element1 = element1.Next;
}
if (num1 >= 0)
{
element2 = element2.Next;
}
}
while (element1 != null)
{
list2.list.Append(element1.Datum);
element1 = element1.Next;
}
return list2;
}
public virtual bool Equals(Multiset set)
{
MultisetAsLinkedList list1 = (MultisetAsLinkedList) set;
if (base.universeSize != list1.universeSize)
{
throw new ArgumentException("mismatched sets");
}
LinkedList.Element element1 = this.list.Head;
LinkedList.Element element2 = list1.list.Head;
while ((element1 != null) && (element2 != null))
{
if (((int) element1.Datum) != ((int) element2.Datum))
{
return false;
}
element1 = element1.Next;
element2 = element2.Next;
}
if ((element1 != null) || (element2 != null))
{
return false;
}
return true;
}
public override IEnumerator GetEnumerator()
{
return new Opus6.MultisetAsLinkedList.Enumerator(this);
}
public override void Insert(int item)
{
LinkedList.Element element2 = null;
for (LinkedList.Element element1 = this.list.Head; element1 != null; element1 = element1.Next)
{
if (((int) element1.Datum) >= item)
{
break;
}
element2 = element1;
}
if (element2 == null)
{
this.list.Prepend(item);
}
else
{
element2.InsertAfter(item);
}
}
public virtual Multiset Intersection(Multiset set)
{
MultisetAsLinkedList list1 = (MultisetAsLinkedList) set;
if (base.universeSize != list1.universeSize)
{
throw new ArgumentException("mismatched sets");
}
MultisetAsLinkedList list2 = new MultisetAsLinkedList(base.universeSize);
LinkedList.Element element1 = this.list.Head;
LinkedList.Element element2 = list1.list.Head;
while ((element1 != null) && (element2 != null))
{
int num1 = ((int) element1.Datum) - ((int) element2.Datum);
if (num1 == 0)
{
list2.list.Append(element1.Datum);
}
if (num1 <= 0)
{
element1 = element1.Next;
}
if (num1 >= 0)
{
element2 = element2.Next;
}
}
return list2;
}
public override bool IsMember(int item)
{
for (LinkedList.Element element1 = this.list.Head; element1 != null; element1 = element1.Next)
{
if (((int) element1.Datum) == item)
{
return true;
}
}
return false;
}
public virtual bool IsSubset(Multiset set)
{
MultisetAsLinkedList list1 = (MultisetAsLinkedList) set;
if (base.universeSize != list1.universeSize)
{
throw new ArgumentException("mismatched sets");
}
LinkedList.Element element1 = this.list.Head;
LinkedList.Element element2 = list1.list.Head;
while ((element1 != null) && (element2 != null))
{
int num1 = ((int) element1.Datum) - ((int) element2.Datum);
if (num1 == 0)
{
element1 = element1.Next;
element2 = element2.Next;
}
else
{
if (num1 > 0)
{
element2 = element2.Next;
continue;
}
return false;
}
}
if (element1 != null)
{
return false;
}
return true;
}
public static void Main()
{
AbstractSet.TestMultiset(new MultisetAsLinkedList(0x20), new MultisetAsLinkedList(0x20), new MultisetAsLinkedList(0x20));
}
public override void Purge()
{
this.list = new LinkedList();
}
public virtual Multiset Union(Multiset set)
{
MultisetAsLinkedList list1 = (MultisetAsLinkedList) set;
if (base.universeSize != list1.universeSize)
{
throw new ArgumentException("mismatched sets");
}
MultisetAsLinkedList list2 = new MultisetAsLinkedList(base.universeSize);
LinkedList.Element element1 = this.list.Head;
LinkedList.Element element2 = list1.list.Head;
while ((element1 != null) && (element2 != null))
{
if (((int) element1.Datum) <= ((int) element2.Datum))
{
list2.list.Append(element1.Datum);
element1 = element1.Next;
}
else
{
list2.list.Append(element2.Datum);
element2 = element2.Next;
}
}
while (element1 != null)
{
list2.list.Append(element1.Datum);
element1 = element1.Next;
}
while (element2 != null)
{
list2.list.Append(element2.Datum);
element2 = element2.Next;
}
return list2;
}
public override void Withdraw(int item)
{
for (LinkedList.Element element1 = this.list.Head; element1 != null; element1 = element1.Next)
{
if (((int) element1.Datum) == item)
{
this.list.Extract(element1);
return;
}
}
}
public override int Count
{
get
{
int num1 = 0;
for (LinkedList.Element element1 = this.list.Head; element1 != null; element1 = element1.Next)
{
num1++;
}
return num1;
}
}
protected LinkedList list;
private class Enumerator : IEnumerator
{
internal Enumerator(MultisetAsLinkedList multiset)
{
this.ptr = null;
this.multiset = multiset;
}
public bool MoveNext()
{
if (this.ptr == null)
{
this.ptr = this.multiset.list.Head;
}
else
{
this.ptr = this.ptr.Next;
}
return (this.ptr != null);
}
public void Reset()
{
this.ptr = null;
}
public object Current
{
get
{
if (this.ptr == null)
{
throw new InvalidOperationException();
}
return this.ptr.Datum;
}
}
private MultisetAsLinkedList multiset;
private LinkedList.Element ptr;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -