2019-10-31 System.NullReferenceException 인벤토리를 Indexer와 Linked List를 사용하여 구현

Console Programming/C# Console 2019. 10. 31. 16:06

Program.cs

namespace Syntax01
{
    class Program
    {
        static void Main(string[] args)
        {
            new App();
        }
    }
}

App.cs

using System;
namespace Syntax01
{
    public class App
    {
        public App()
        {
            Syntax01.LinkedList list = new LinkedList(10);

            list.Add(new Item(100, "장검"));
            list.Add(new Item(200, "단검"));
            list.Add(new Item(300, "활"));
            list.Add(new Item(400, "도끼"));

            list.Print();

            Console.WriteLine("단검을 제거함");
            list.Remove("단검");


            list.Print();


            Console.WriteLine("지팡이를 추가함");
            list.Add(new Item(500, "지팡이"));

            list.Print();

            Console.WriteLine("Node의 흐름순으로 출력하면");
            list.PrintByNode();

            list.Remove("장검");

            list.Print();

        }
    }
}

LinkedList.cs

using System;
namespace Syntax01
{
    public class LinkedList
    {
        public Node first;
        public Node[] nodes;
        public Node this[int i]
        {
            get
            {
                return nodes[i];
            }
        }
        public LinkedList(int capacity)
        {
            this.nodes = new Node[capacity];
        }
        public void Add(Item item)
        {
            Node node = new Node(item);

            if(first==null)
            {
                first = node;
            }
            else
            {
               Node lastNode = FindLast(first);
                lastNode.next = node;
                node.previous = lastNode;               
            }

            for(int i=0; i < nodes.Length; i++)
            {
                if(nodes[i]==null)
                {
                    nodes[i] = node;
                    return;
                }
            }
            int lastindex = nodes.Length;
            Array.Resize(ref nodes, nodes.Length * 2);
            nodes[lastindex] = node;
        }
        public Node FindLast(Node node)
        {
            if(node.next ==null)
            {
                return node;
            }
            return FindLast(node.next);
        }
        public void Remove(string name)
        {
            int i = GetIndex(name);
            Node foundNode = nodes[i];
            if (foundNode != null)
            {
                foundNode.previous.next = foundNode.next;
                foundNode.next.previous = foundNode.previous;
                nodes[i]=null;
            }            
        }
        public int GetIndex(string name)
        {
            for(int i=0; i<nodes.Length; i++)
            {
                if(nodes[i]!=null && nodes[i].item.Name==name)
                {
                    return i;
                }
            }
            return -1;
        }

        //public Node GetT(string name)
        //{
        //    Node node = first;
        //    while(node!=null)
        //    {
        //        if (node.item.Name == name)
        //        {
        //            return node;
        //        }
        //        else
        //        {
        //            node = node.next;
        //        }
        //    }
        //    return null;
        //}     


        public void Print()
        {
            Console.WriteLine("------------------------------------------");
            for (int i=0; i < nodes.Length; i++)
            {
                if(nodes[i]!=null)
                {
                    Console.WriteLine(nodes[i].item.Name);
                }
            }
            Console.WriteLine("------------------------------------------");
            Console.WriteLine();
        }
        public void PrintByNode()
        {
            Console.WriteLine("------------------------------------------");
            Node nodePrint = first;

            while(nodePrint!=null)
            {
                Console.WriteLine(nodePrint.item.Name);
                nodePrint = nodePrint.next;
            }
            Console.WriteLine("------------------------------------------");
            Console.WriteLine();
        }
    }
}

Node.cs

namespace Syntax01
{
    public class Node
    {
        public Item item;
        public Node next;
        public Node previous;
        public Node(Item item)
        {
            this.item = item;
        }
    }
}

 

마지막에 제일 처음의 장검을 제거했더니 오류가 발생했다.

 

첫번째를 제거하니 first가 null이 되었으므로 모든 링크가 끊겼다.

 

: