【问题标题】:How to create multiple nodes in a linked list then iterate through the nodes如何在链表中创建多个节点然后遍历节点
【发布时间】:2011-09-08 10:12:30
【问题描述】:

我正在学习如何在 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;
    }
}

【问题讨论】:

标签: c# data-structures linked-list


【解决方案1】:

您的代码已完全损坏。

这是运行它所需的最小更改

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;
    }
}

【讨论】:

    【解决方案2】:

    你转过身来:D

    首先,所有类名都以大写字母开头,因此 Node(不是节点)和 LinkedList(不是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");
        }
    

    此代码将节点添加到列表的末尾,如果您想将节点添加到列表的前面,您可以修改添加函数..

    如果您有其他问题,希望这会有所帮助

    【讨论】:

      【解决方案3】:

      要打印您的数据,您需要执行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;                
      }
      

      【讨论】:

      • 对不起,我在上传之前正在编辑我的代码......不小心删除了那部分,以为它是别的东西。但这并不能解决我的问题。我现在将编辑我的问题以包含该问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-08
      相关资源
      最近更新 更多