Как создать несколько узлов в связанном списке, а затем выполнить итерацию по узлам - PullRequest
0 голосов
/ 08 сентября 2011

Я учусь составлять связанный список в c #.У меня есть код ниже, который не работает для меня.Я просто хочу добавить узлы в основную, как показано ниже, затем выполнить итерацию по всем узлам, которые будут печататься на консоли.

using System;

class node
{
    public object data;
    public node next;

    public node()
    {
        data = null;
        next = null;
    }
    public node(object o)
    {
        data = o;
        next = null;
    }
    public node(object data, node next)
    {
        this.data = data;
        this.next = next;
    }    
}

class linkedList
{
    private node headNode;
    private node tailNode;

    int node_count;

    public void add(object entry)
    {
        if (headNode == null)
        {
            node newNode = new node(entry);
            headNode = newNode;
            ++node_count;
        }
        else
        {
            if (node_count == 1)
            {
                node newNode = new node(entry, headNode);
                tailNode = newNode;                
            }
            else 
            {
                node newNode = new node(entry, tailNode);
                tailNode = newNode;
            }
            ++node_count;
        }
    }

    public void returnData()
    {
        if (headNode.next != null)
        {
            while (headNode.next != null)
            { 
                Console.WriteLine(headNode.data + "\n");
            }
        }
        else
            Console.WriteLine("Not Available");
    }
}

class Exercise
{
    static int Main()
    {
        linkedList ll = new linkedList();
        ll.add(8);
        ll.add(2);
        ll.add(7);
        ll.add(4);
        ll.add(9);
        ll.add(10);

        ll.returnData();

        Console.ReadLine();
        return 0;
    }
}

Ответы [ 3 ]

2 голосов
/ 08 сентября 2011

Ваш код полностью не работает.

Вот минимальные изменения, необходимые для его запуска

using System;

class node
{
    public object data;
    public node next;

    public node()
    {
        data = null;
        next = null;
    }
    public node(object o)
    {
        data = o;
        next = null;
    }
    public node(object data, node next)
    {
        this.data = data;
        this.next = next;
    }    
}

class linkedList
{
    private node headNode;
    private node tailNode;

    int node_count;

    public void add(object entry)
    {
        node newNode = new node(entry);
        if (headNode == null)
            headNode = newNode;
        if (tailNode != null)
            tailNode.next = newNode;
        tailNode = newNode;
        ++node_count;
    }

    public void returnData()
    {
        node currentNode = headNode;

        if (currentNode == null)
            Console.WriteLine("Not Available");

        while (currentNode != null) {
            Console.WriteLine(currentNode.data);
            currentNode = currentNode.next;
        }

    }
}

class Exercise
{
    static int Main()
    {
        linkedList ll = new linkedList();
        ll.add(8);
        ll.add(2);
        ll.add(7);
        ll.add(4);
        ll.add(9);
        ll.add(10);

        ll.returnData();

        return 0;
    }
}
1 голос
/ 08 сентября 2011

Вы идете, немного обернувшись: D

Во-первых, все имена классов должны начинаться с uppercap, поэтому Node (не узел) и LinkedList (не связанный список).

Теперь вы можете использовать эту функцию, но она не будет работать, если вы попытаетесь вернуть список только с одним узлом ... потому что вы добавляете узлы неправильно.

    public void returnData()
    {
        if (tailNode.next != null)
        {
            Node currentNode = tailNode;
            while (currentNode != null)
            { 
                Console.WriteLine(currentNode.data + "\n");
                currentNode = currentNode.next;
            }
        }
        else
            Console.WriteLine("Not Available");
    }

Но если вы хотите более обычный классический связанный список, вы можете изменить функцию добавления связанного списка к этому ...

    public void add(object entry)
    {
        if (headNode == null)
        {
            Node newNode = new Node(entry);
            headNode = newNode;
            ++Node_count;
        }
        else
        {
            if (Node_count == 1)
            {
                Node newNode = new Node(entry);
                headNode.next = newNode;
                tailNode = newNode;                
            }
            else 
            {
                Node newNode = new Node(entry);
                tailNode.next = newNode;
                tailNode = newNode;
            }
            ++Node_count;
        }
    }

и возвращаемые данные для ...

    public void returnData()
    {
        if (headNode.next != null)
        {
            Node currentNode = headNode;
            while (currentNode != null)
            { 
                Console.WriteLine(currentNode.data + "\n");
                currentNode = currentNode.next;
            }
        }
        else
            Console.WriteLine("Not Available");
    }

этот код добавляет узлы в конец списка, если вы хотите добавить узлы в начало списка, вы можете изменить функцию добавления.

надеюсь, это поможет, если у вас есть дополнительные вопросы, просто задайте

0 голосов
/ 08 сентября 2011

Чтобы распечатать свои данные, вам нужно сделать while (headNode.next != null), чтобы ваш список был пройден.

Выглядит так, будто вы никогда не обновляете node.next либо

if (node_count == 1) // this seems unnecessary.
{
   node newNode = new node(entry, headNode);
   tailNode = newNode; 
   //should be node.next = newnode;                
}
...