⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chainedscattertable.cs

📁 Data Structures and Algorithms with Object-Oriented Design Patterns in C# 这本书的范例代码dll自己反编译的source
💻 CS
字号:
namespace Opus6
{
    using System;
    using System.Collections;
    using System.Runtime.InteropServices;

    [Copyright("Copyright (c) 2001 by Bruno R. Preiss, P.Eng."), Version("$Id: ChainedScatterTable.cs,v 1.5 2001/10/28 19:50:09 brpreiss Exp $")]
    public class ChainedScatterTable : AbstractHashTable
    {
        public ChainedScatterTable(int length)
        {
            this.array = new Opus6.ChainedScatterTable.Entry[length];
            for (int num1 = 0; num1 < length; num1++)
            {
                this.array[num1] = new Opus6.ChainedScatterTable.Entry(null, -1);
            }
        }

        public override void Accept(Visitor visitor)
        {
            for (int num1 = 0; num1 < this.Length; num1++)
            {
                if (this.array[num1].obj != null)
                {
                    visitor.Visit(this.array[num1].obj);
                    if (visitor.IsDone)
                    {
                        return;
                    }
                }
            }
        }

        public override int CompareTo(object arg)
        {
            throw new MethodNotImplementedException();
        }

        public override ComparableObject Find(ComparableObject obj)
        {
            for (int num1 = base.H(obj); num1 != -1; num1 = this.array[num1].next)
            {
                if (obj == this.array[num1].obj)
                {
                    return this.array[num1].obj;
                }
            }
            return null;
        }

        public override IEnumerator GetEnumerator()
        {
            return new Opus6.ChainedScatterTable.Enumerator(this);
        }

        public override void Insert(ComparableObject obj)
        {
            if (base.count == this.Length)
            {
                throw new ContainerFullException();
            }
            int num1 = base.H(obj);
            if (this.array[num1].obj != null)
            {
                while (this.array[num1].next != -1)
                {
                    num1 = this.array[num1].next;
                }
                int num2 = num1;
                num1 = (num1 + 1) % this.Length;
                while (this.array[num1].obj != null)
                {
                    num1 = (num1 + 1) % this.Length;
                }
                this.array[num2].next = num1;
            }
            this.array[num1] = new Opus6.ChainedScatterTable.Entry(obj, -1);
            base.count++;
        }

        public override bool IsMember(ComparableObject obj)
        {
            for (int num1 = base.H(obj); num1 != -1; num1 = this.array[num1].next)
            {
                if (obj == this.array[num1].obj)
                {
                    return true;
                }
            }
            return false;
        }

        public static void Main()
        {
            Opus6.Console.WriteLine("ChainedScatterTable Test");
            HashTable table1 = new ChainedScatterTable(0x39);
            AbstractHashTable.TestHashTable(table1);
        }

        public override void Purge()
        {
            for (int num1 = 0; num1 < this.Length; num1++)
            {
                this.array[num1] = new Opus6.ChainedScatterTable.Entry(null, -1);
            }
            base.count = 0;
        }

        public override void Withdraw(ComparableObject obj)
        {
            int num2;
            if (base.count == 0)
            {
                throw new ContainerEmptyException();
            }
            int num1 = base.H(obj);
            while ((num1 != -1) && (obj != this.array[num1].obj))
            {
                num1 = this.array[num1].next;
            }
            if (num1 == -1)
            {
                throw new ArgumentException("obj not found");
            }
        Label_0056:
            num2 = this.array[num1].next;
            while (num2 != -1)
            {
                int num3 = base.H(this.array[num2].obj);
                bool flag1 = false;
                for (int num4 = this.array[num1].next; (num4 != this.array[num2].next) && !flag1; num4 = this.array[num4].next)
                {
                    if (num4 == num3)
                    {
                        flag1 = true;
                    }
                }
                if (!flag1)
                {
                    break;
                }
                num2 = this.array[num2].next;
            }
            if (num2 != -1)
            {
                this.array[num1].obj = this.array[num2].obj;
                num1 = num2;
                goto Label_0056;
            }
            this.array[num1] = new Opus6.ChainedScatterTable.Entry(null, -1);
            for (int num5 = ((num1 + this.Length) - 1) % this.Length; num5 != num1; num5 = ((num5 + this.Length) - 1) % this.Length)
            {
                if (this.array[num5].next == num1)
                {
                    this.array[num5].next = -1;
                    break;
                }
            }
            base.count--;
        }


        public override bool IsFull
        {
            get
            {
                return (base.count == this.Length);
            }
        }

        public override int Length
        {
            get
            {
                return this.array.Length;
            }
        }


        protected Opus6.ChainedScatterTable.Entry[] array;
        private const int NULL = -1;


        [StructLayout(LayoutKind.Sequential)]
        protected struct Entry
        {
            internal ComparableObject obj;
            internal int next;
            internal Entry(ComparableObject obj, int next)
            {
                this.obj = obj;
                this.next = next;
            }

        }

        private class Enumerator : IEnumerator
        {
            internal Enumerator(ChainedScatterTable table)
            {
                this.position = -1;
                this.table = table;
            }

            public bool MoveNext()
            {
                this.position++;
                while (this.position < this.table.Length)
                {
                    if (this.table.array[this.position].obj != null)
                    {
                        break;
                    }
                    this.position++;
                }
                if (this.position == this.table.Length)
                {
                    this.position = -1;
                }
                return (this.position >= 0);
            }

            public void Reset()
            {
                this.position = -1;
            }


            public object Current
            {
                get
                {
                    if (this.position < 0)
                    {
                        throw new InvalidOperationException();
                    }
                    return this.table.array[this.position].obj;
                }
            }


            private int position;
            private ChainedScatterTable table;
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -