Простой список слияния C # (без обобщений) - PullRequest
0 голосов
/ 24 октября 2018

Я создал простой список классов с нуля.Это для задания класса, над которым я работаю около недели - очень новый для списков.Мы не можем использовать дженерики, поэтому попытка исследовать мой вопрос ниже не принесла результатов.Хотя BetterCoder мне удалось просмотреть 7 учебных пособий по YouTube, и я нашел кое-что в своей книге, но ничего с примером «слияния».

У меня есть три класса - мой узел, мой список и моя программа,В моем классе списков я работаю над созданием метода Merge (), который в конечном итоге сравнивает данные в двух списках и объединяет их в упорядоченный список.

Прямо сейчас по какой-то причине мой метод слияния - который очень помогает мне понять, что происходит - работает неправильно.Ему переданы оба списка, и он добавляет данные из listTwo в listOne, НО по какой-то причине, когда он печатает на консоль, данные второго узла отображаются дважды:

EX: 1 -> 2 -> 2

вместо печати головки (1), следующей (2), а затем следующей (3), которая должна быть.

EX: 1 -> 2 -> 3

В программном классе я доказал с помощью строки записи, что (listOne.firstNode.Next.Next.Data) = 3.Каким он должен быть.

Может кто-нибудь помочь мне выяснить, правильно ли указываются узлы в первом списке или что там происходит?

  • МойМетод слияния должен быть передан обоим объектам списка (listOne и listTwo), и в конце концов мне нужно сделать так, чтобы они передавались как ссылки, но я еще не понял этого и остановлюсь на этом позже, я полагаю.

        namespace LinkedList
            {
      //This is my Node Class
                class Node
                {
                    public object Data { get; set; }
    
                    public Node Next { get; set; }
    
                    public Node(object dataValue) : this(dataValue, null) { }
    
                    public Node(object dataValue, Node nextNode)
                    {
                        Data = dataValue;
                        Next = nextNode;
                    }
                }
    
    
    
            //This is my List Class
    
                class List
                {
                    public Node firstNode;
                    public int count;
    
                    public List()
                    {
                        firstNode = null;
                    }
    
                    public bool Empty
                    {
                        get { return this.count == 0; }
                    }
    
                    public int Count
                    {
                        get { return this.count; }
                    }
    
                    public object Add(int index, object o)
                    {
                        if (index < 0)
                            throw new ArgumentOutOfRangeException("Index: " + index);
    
                        if (index > count)
                            index = count;
    
                        Node current = this.firstNode;
    
                        if (this.Empty || index == 0)
                        {
                            this.firstNode = new Node(o, this.firstNode);
                        }
                        else
                        {
                            for (int i = 0; i < index - 1; i++)
                                current = current.Next;
    
                            current.Next = new Node(o, current.Next);
                        }
    
                        count++;
    
                        return o;
                    }
    
                    public object Add(object o)
                    {
                        return this.Add(count, o);
                    }
    
                    public object Merge(List a, List b)
                    {
                        a.Add(b.firstNode.Data);
    
                        return a;
                    }
    
                    public void Print()
                    {
                        while (this.count > 0)
                        {
                            Console.Write(firstNode.Data + "->");
    
                            if(firstNode.Next != null)
                            firstNode.Data = firstNode.Next.Data;
    
                            count--;
                        }
    
                    }
    
                }
    
    
            //And here is my Program
    
                class Program
                {
    
                    static void Main(string[] args)
                    {
                        List listOne = new List();
    
                        List listTwo = new List();
    
                        listOne.Add(1);
                        listOne.Add(2);
    
                        listTwo.Add(3);
    
    
                        listTwo.Print();
    
                        Console.WriteLine("");
    
    
                        listOne.Merge(listOne, listTwo);
    
                        Console.WriteLine("");
    
                        listOne.Print();
    
                        //This line below shows that the data "3" from listTwo is being added to listOne in the list Merge Method
          //Console.WriteLine(listOne.firstNode.Next.Next.Data);
    
                        Console.ReadKey();
                    }
                }
       }
    

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

Актуальная проблема в вашем методе печати

    public void Print()
    {
        Node node = firstNode;
        for (int i = 0; i < this.count; i++)
        {
            Console.Write(node.Data + "->");

            if (node.Next != null)
                node = node.Next;
        }
    }

Алекс Сикилинда , вы правы, метод merge неполон.

        public object Merge(List a, List b)
    {
        Node bNode = b.firstNode;
        while (bNode != null)
        {
            a.Add(bNode.Data);
            bNode = bNode.Next;
        }

        return a;
    }
0 голосов
/ 24 октября 2018

Вместо присвоения данных первому узлу я присваиваю

 firstNode = firstNode.Next;

Пожалуйста, проверьте нижеприведенный код печати

     public void Print()
    {
        while (this.count > 0)
        {
            Console.Write(firstNode.Data + "->");

            if (firstNode.Next != null)
                firstNode = firstNode.Next;

            count--;
        }

    }
0 голосов
/ 24 октября 2018

Я бы написал так:

public void Merge(List b)
{
    Node lastNode = GetLastNode();

    if (lastNode != null)
    {
        lastNode.Next = b.firstNode;
    }
    else 
    {
        this.firstNode = b.firstNode;
    }
}

// this method is used to find the last node in current list
private Node GetLastNode()
{
    if (this.firstNode == null)
    {
        return null;
    }

    Node current = this.firstNode;

    while (current.Next != null)
    {
        current = current.Next;
    }

    return current;
}

Прежде всего, я изменил подпись Merge с public object Merge(List a, List b) на public void Merge(List b).Теперь мы можем использовать его следующим образом:

listOne.Merge(listTwo);

Это свяжет последний элемент listOne с первым элементом listTwo и, таким образом, они будут объединены.

Теперь нам нужно изменить метод Printпоскольку текущая версия изменяет список, чего не должно быть:

public void Print()
{
    Node currentNode = this.firstNode;

    while(currentNode != null)
    {
        Console.Write(currentNode.Data + ' ');
        currentNode = currentNode.Next;
    }
}
...