C# 링크드리스트

C# 라이브러리에는 링크드리스트, 큐, 스택등 다양한 자료구조가 존재하지만 실제로 구현해보고 내부 동작과정을 이해하는 것이 중요하기 때문에 실제로 구현해본다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
using System;

namespace C_
{
    class Node{ //node 정의
        public int key;
        public Node next;
        public Node(int _key){
            key = _key;
            next = null;
        }
    }
    class LinkedList{
        private Node head;

        public void addHead(int key){
            Node newnode = new Node(key);
            newnode.next = head;
            head = newnode;
        }

        public int getHead(){
            if(head == null)
                return -1;
            return head.key;
        }

        public void deleteHaed(){
            head = head.next;
        }

        public void addTail(int key){
            Node newnode = new Node(key);
            if(head == null){
                head = newnode;
                return;
            }
            Node ptr;
            ptr = head;
            while(ptr.next != null){
                ptr = ptr.next;
            }
            ptr.next = newnode;
        }

        public int getTail(){
            Node ptr;
            ptr = head;
            while(ptr.next != null){
                ptr = ptr.next;
            }
            return ptr.key;
        }

        public void deleteTail(){
            Node ptr, prev;
            ptr = head;
            prev = ptr;
            while(ptr.next != null){
                prev = ptr;
                ptr = ptr.next;
            }
            prev.next = null;
        }

        public void DeleteNode(int key){
            Node ptr = head;
            Node prev = null;
            if(ptr == null && ptr.key == key){
                head = ptr.next;
                return;
            }
            while(ptr == null){
                prev = ptr;
                ptr = ptr.next;
            }
            prev.next = ptr.next;
        }

        public void listPrint(){
            for (Node ptr = head; ptr != null; ptr = ptr.next){
                Console.Write(ptr.key + " ");
            }
            Console.WriteLine();
        }
    }

    class Stack{
        private LinkedList list = new LinkedList();
        
        public void push(int key){
            list.addHead(key);
        }

        public int pop(){
            int temp = list.getHead();
            list.deleteHaed();
            return temp;
        }

        public void Sprint(){
            list.listPrint();
        }
    }
    
    class Queue{
        private LinkedList list = new LinkedList();

        public void enQueue(int key){
            list.addHead(key);
        }

        public int deQueue(){
            int temp = list.getTail();
            list.deleteTail();
            return temp;
        }

        public void Qprint(){
            list.listPrint();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            LinkedList list = new LinkedList();
            list.addHead(4);
            list.addTail(5);
            list.addTail(1);
            list.addTail(2);
            list.addTail(500);
            list.addHead(866);
            list.listPrint();

            Queue queue = new Queue();
            queue.enQueue(4);
            queue.enQueue(1);
            queue.enQueue(2);
            queue.enQueue(3);
            Console.WriteLine(queue.deQueue());
            Console.WriteLine(queue.deQueue());
            queue.Qprint();

            Stack stack = new Stack();
            stack.push(4);
            stack.push(3);
            stack.push(2);
            stack.push(1);
            Console.WriteLine(stack.pop());
            Console.WriteLine(stack.pop());
            stack.Sprint();
        }
    }
}

조금 더 다양한 기능,, 생성자, 오버라이딩, 프로퍼티등 다양하게 사용하고 싶었지만..

너무 오랜만에 c#을 사용해보니 다른 언어들과 너무 헷갈린다.

가장 표준이 되는 모델을 생각해서 구현했으며 링크드리스트를 기초모델로 삼았다.

댓글남기기