using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace hashChain { public partial class Form1 : Form { public struct NumberListData { public int Data; public int Pointer; } public const int AREASIZE = 50; public const int HASHSIZE = 16; public int ErasePointer; public static NumberListData[] NumberList = new NumberListData[AREASIZE]; public int[] Bucket = new int[HASHSIZE]; public void BucketInitialize() { for (int i = 0; i < Bucket.Length; i++) Bucket[i] = -1; } public void AreaInitialize() { int i; for (i = 0; i < NumberList.Length; i++) NumberList[i].Pointer = i + 1; NumberList[NumberList.Length - 1].Pointer = -1; ErasePointer = 0; } public int GetArea() { if (ErasePointer < 0) return -1; int P = ErasePointer; ErasePointer = NumberList[ErasePointer].Pointer; return P; } public void FreeArea(int P) { NumberList[P].Pointer = ErasePointer; ErasePointer = P; } public int replaca(int P, int A) { NumberList[P].Data = A; return P; } public int replacd(int P, int A) { NumberList[P].Pointer = A; return A; } public int car(int P) { return NumberList[P].Data; } public int cdr(int P) { return NumberList[P].Pointer; } public int cons(int A, int B) { int P = GetArea(); if (P < 0) return -1; NumberList[P].Data = A; NumberList[P].Pointer = B; return P; } public Form1() { InitializeComponent(); } private void Form1_Load(object sender, System.EventArgs e) { BucketInitialize(); AreaInitialize(); ポインタ部の表示(); } private void ポインタ部の表示() { listBox1.Items.Clear(); listBox1.Items.Add("Erase Pointer=" + ErasePointer.ToString()); listBox1.Items.Add("(ポインタ部のみ)"); int i = ErasePointer; while (i >= 0) { i = cdr(i); listBox1.Items.Add(i.ToString()); } } private void button1_Click(object sender, System.EventArgs e) { int P = GetArea(); string PS = P.ToString(); textBox1.Text = PS; ポインタ部の表示(); MessageBox.Show(PS); } private void button2_Click(object sender, System.EventArgs e) { FreeArea(int.Parse(textBox1.Text)); ポインタ部の表示(); } private void ハッシュ表示() { string S; int P; listBox1.Items.Clear(); for (int i = 0; i < Bucket.Length; i++) { S = i.ToString() + " "; P = Bucket[i]; if (P >= 0) { while (P >= 0) { S += " " + car(P).ToString(); P = cdr(P); } listBox1.Items.Add(S); } else listBox1.Items.Add(S + "(空)"); } } private int SearchKey(int Key, int P) { int PP = P; while (PP >= 0) { if (car(PP) == Key) return PP; PP = cdr(PP); } return -1; } private void ハッシュ設定(int Key, int Mod) { int ID = Key % Mod; if (SearchKey(Key, Bucket[ID]) < 0) Bucket[ID] = cons(Key, Bucket[ID]); } private void button3_Click(object sender, System.EventArgs e) { int Mod = Bucket.Length; int Key = int.Parse(textBox1.Text); ハッシュ設定(Key, Mod); ハッシュ表示(); } private int ハッシュ探索(int Key, int Mod) { int ID = Key % Mod; return SearchKey(Key, Bucket[ID]); } private void button4_Click(object sender, System.EventArgs e) { int Mod = Bucket.Length; int Key = int.Parse(textBox1.Text); int P = ハッシュ探索(Key, Mod); MessageBox.Show(P.ToString()); } private int ハッシュ削除(int Key, int Mod) { int ID = Key % Mod; int Befor = -1; int P = Bucket[ID]; if (P < 0) return -1; while (P >= 0) { if (car(P) == Key) break; Befor = P; P = cdr(P); } int After = cdr(P); FreeArea(P); if (Befor < 0) Bucket[ID] = After; else replacd(Befor, After); return After; } private void button5_Click(object sender, System.EventArgs e) { int Mod = Bucket.Length; int Key = int.Parse(textBox1.Text); int P = ハッシュ削除(Key, Mod); ハッシュ表示(); } } }