C#선형 테이블의 단일 체인 테이블

데이터 클래스:

namespace { /// /// /// /// public class Node { private T data; // private Node next; // ( ) public Node(T val, Node p) { data = val; next = p; } public Node(Node p) { next = p; } public Node(T val) { data = val; } public Node() { data = default(T); next = null; } public T Data { get { return data; } set { data = value; } } public Node Next { get { return next; } set { next = value; } } } }

단일 체인 테이블 구현 코드:

using System; using ; namespace { public class LinkList:IListDS { private Node head; public Node Head { get { return head; } set { head = value; } } public LinkList() { head = null; } public int GetLength() { Node p = head; int _len = 0; while (p!=null) { _len++; p = p.Next; } return _len; } public void Clear() { head = null; } public bool IsEmpty() { bool _isEmpty = head == null ? true : false; return _isEmpty; } public bool IsFull() { return false; } public void Append(T item) { Node q = new Node(item); Node p = new Node(); if (head == null) { head = q; return; } p = head; while (p.Next!=null) { p = p.Next; } p.Next = q; } /// /// /// /// /// public void Insert(T item, int index) { if (IsEmpty() || index < 0 || index >= GetLength()) { Console.WriteLine("List is empty or Position is error!"); return; } Node p = head; Node r = new Node(); int j = 0; if (index == 0) { Node q = new Node(item); q.Next = p; head = q; return; } while (p.Next != null && j < index) { r = p; p = p.Next; j++; } if (j == index) { Node q = new Node(item); q.Next = p; r.Next = q; } } /// /// /// /// /// public void InsertPost(T item, int index) { if (IsEmpty() || index < 0 || index >= GetLength()) { Console.WriteLine("List is empty or Position is error!"); return; } Node p = head; int j = 0; while (p.Next != null && j < index) { p = p.Next; j++; } if (j == index) { Node q = new Node(item); q.Next = p.Next; p.Next = q; } } public T Delete(int index) { if (IsEmpty() || index < 0 || index >= GetLength()) { Console.WriteLine("List is empty or Position is error!"); return default(T); } Node q = new Node(); Node p = head; int j = 0; if (index == 0) { q = head; head = head.Next; return q.Data; } while (p.Next != null && j < index) { q = p; p = p.Next; j++; } if (j == index) { q.Next = p.Next; return p.Data; } return default(T); } public T GetElem(int index) { Node p = new Node(); p = head; int j = 0; while (p.Next != null && j < index) { p = p.Next; j++; } if (j == index) return p.Data; return default(T); } public int Locate(T value) { Node p = new Node(); p = head; int j = 0; if (p.Data.Equals(value)) // 0, return j; while (p.Next != null) { p = p.Next; j++; if (p.Data.Equals(value)) return j; } Console.WriteLine("Position is error!"); return j; } public void Reverse() { Node p = head; Node q = new Node(); head = null; while (p != null) { q = p; p = p.Next; q.Next = head; head = q; Console.WriteLine(head.Data); } } } }

테스트 코드:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace { class LinkListOperator { static void Main(string[] args) { LinkList<int> linkLists = new LinkList<int>(); linkLists.Append(1); linkLists.Append(2); linkLists.Append(3); linkLists.Append(4); for (int i = 0; i < linkLists.GetLength(); i++) { Console.WriteLine(linkLists.GetElem(i)); } Console.WriteLine("===== Insert ====="); linkLists.Insert(888, 3); for (int i = 0; i < linkLists.GetLength(); i++) { Console.WriteLine(linkLists.GetElem(i)); } Console.WriteLine("===== InsertPost ====="); linkLists.InsertPost(777, linkLists.GetLength() - 1); for (int i = 0; i < linkLists.GetLength(); i++) { Console.WriteLine(linkLists.GetElem(i)); } Console.WriteLine("===== Delete ====="); linkLists.Delete(0); for (int i = 0; i < linkLists.GetLength(); i++) { Console.WriteLine(linkLists.GetElem(i)); } Console.WriteLine("===== Locate ====="); Console.WriteLine(linkLists.Locate(888)); //Console.WriteLine("===== CreateListHead ====="); //LinkList L = CreateListHead(); //for (int i = 0; i < L.GetLength(); i++) //{ // Console.WriteLine(L.GetElem(i)); //} //Console.WriteLine("===== CreateListTail ====="); //LinkList L1 = CreateListTail(); //for (int i = 0; i < L1.GetLength(); i++) //{ // Console.WriteLine(L1.GetElem(i)); //} //Console.WriteLine("===== Reverse ====="); //L1.Reverse(); //for (int i = 0; i < L1.GetLength(); i++) //{ // Console.WriteLine(L1.GetElem(i)); //} //Console.WriteLine("===== Merge ====="); //LinkListha=new LinkList(); //LinkListhb=new LinkList(); //ha.Append(1); //ha.Append(3); //ha.Append(5); //ha.Append(7); //hb.Append(2); //hb.Append(4); //hb.Append(8); //hb.Append(9); //LinkList hc = Merge(ha, hb); //for (int i = 0; i < hc.GetLength(); i++) //{ // Console.WriteLine(hc.GetElem(i)); //} Console.WriteLine("===== Purge ====="); LinkList<int> ha = new LinkList<int>(); ha.Append(1); ha.Append(3); ha.Append(3); ha.Append(5); ha.Append(5); ha.Append(7); ha.Append(7); ha.Append(89); LinkList<int> hb = Purge(ha); for (int i = 0; i < hb.GetLength(); i++) { Console.WriteLine(hb.GetElem(i)); } Console.ReadKey(); } /// /// /// /// static LinkList<int> CreateListHead() { int d; LinkList<int> L = new LinkList<int>(); d = Int32.Parse(Console.ReadLine()); while (d != -1) { Node<int> q = new Node<int>(d); q.Next = L.Head; L.Head = q; d = Int32.Parse(Console.ReadLine()); } return L; } /// /// /// /// static LinkList<int> CreateListTail() { int d; LinkList<int> L = new LinkList<int>(); d = Int32.Parse(Console.ReadLine()); Node<int> R = new Node<int>(); R = L.Head; while (d != -1) { Node<int> q = new Node<int>(d); if (L.Head == null) L.Head = q; else R.Next = q; R = q; d = Int32.Parse(Console.ReadLine()); } if (R != null) R.Next = null; return L; } /// /// /// /// /// /// static LinkList<int> Merge(LinkList<int> Ha, LinkList<int> Hb) { LinkList<int> Hc = new LinkList<int>(); Node<int> p = Ha.Head.Next; Node<int> q = Hb.Head; Node<int> s = new Node<int>(); Hc = Ha; Hc.Head.Next = null; //Hc 1 while (p != null && q != null) { if (p.Data < q.Data) { s = p; p = p.Next; } else { s = q; q = q.Next; } Hc.Append(s.Data); } if (p == null) { p = q; } while (p != null) { s = p; p = p.Next; Hc.Append(s.Data); } return Hc; } static LinkList<int> Merge1(LinkList<int> Ha, LinkList<int> Hb) { LinkList<int> Hc = new LinkList<int>(); Node<int> p = Ha.Head.Next; Node<int> q = Hb.Head; Node<int> s = new Node<int>(); Hc = Ha; Hc.Head.Next = null; //Hc 1 while (p != null && q != null) { if (p.Data < q.Data) { s = p; p = p.Next; } else { s = q; q = q.Next; } s.Next = Hc.Head.Next; Hc.Head.Next = s; } if (p == null) { p = q; } while (p != null) { s = p; p = p.Next; s.Next = Hc.Head.Next; Hc.Head.Next = s; } return Hc; } static LinkList<int> Purge(LinkList<int> ha) { for (int i = 0; i < ha.GetLength(); i++) { Console.WriteLine(ha.GetElem(i)); } LinkList<int> Hb = new LinkList<int>(); Node<int> p = ha.Head; Node<int> q = new Node<int>(); Node<int> s = new Node<int>(); s = p; p = p.Next; s.Next = null; Hb.Head = s; Console.WriteLine(ha.Head.Next); Hb.Head.Next = ha.Head.Next; while (p.Next != null) { s = p; p = p.Next; q = Hb.Head.Next; while (q.Next != null && q.Data != s.Data) { q = q.Next; } if (q == null) { s.Next = Hb.Head.Next; Hb.Head.Next = s; } } return Hb; } } }

좋은 웹페이지 즐겨찾기