【问题标题】:Linked list Advice链表建议
【发布时间】:2014-04-10 20:52:03
【问题描述】:

我被分配了以下任务:

我想构建一个链接列表的实现。具体来说,我希望它是一个双向链表。

我的任务: 您的程序应使用链表对使用链表的火车路线进行建模。 首先,用户将输入他们希望火车有多少站,以及每个站的名称。 然后程序应打印路线图。 完成后,他们然后输入他们想要开始的站点的名称。 从那里他们可以输入命令将火车向前移动到下一站或向后移动到上一站。

有人告诉我我没有正确完成这项任务,但我真的不明白怎么做,如果有人能解释我没有做的事情,我将不胜感激。

我的 Route 课程(它还没有完成,但如果做得正确,它就快完成了):

namespace TrainRoute
{
    class Route
    {

        Stops root;

        public LinkedList<Stops> linkedList = new LinkedList<Stops>();
        public Stops MakeNewStop(string stopName)
        {
            Stops stopWithStopName = new Stops(stopName);
            return stopWithStopName;
        }


        public void AddStops(Stops stopIWantToAdd)
        {
            if (linkedList.Count == 0)
            {
                linkedList.AddFirst(stopIWantToAdd);
            }
            else
            {
                //stopIWantToAdd.prevStop = linkedList.Last();
                linkedList.AddLast(stopIWantToAdd);
            }
        }
        public void StopRelationships()
        {

            for (int i = 0; i < linkedList.Count; i++)
            {
                if (linkedList.ElementAt<Stops>(i).nextStop == null && linkedList.ElementAt<Stops>((i + 1)) != null)
                {
                    linkedList.ElementAt<Stops>(i).nextStop = linkedList.ElementAt<Stops>((i + 1));
                }
                if (linkedList.ElementAt<Stops>((i - 1)) != null)
                {
                    linkedList.ElementAt<Stops>(i).prevStop = linkedList.ElementAt<Stops>(i - 1);
                }
            }
        }

        public void Print()
        {
            if (linkedList != null)
            {

                foreach (var item in linkedList)
                {
                    Console.WriteLine("Stop name: " + item.stopName);
                }
            }
        }


        public int StopPosition(string usersInput)
        {
            int position = 0;
            for (int i = 0; i < linkedList.Count; i++)
            {
                if (linkedList.ElementAt<Stops>(i).stopName == usersInput)
                {
                    position = i;
                    break;
                }
            }
            return position;
        }
        public int MoveForward(int indexPosition)
        {
            Console.WriteLine("The train is now at " +linkedList.ElementAt<Stops>(indexPosition).nextStop.stopName);
            return (indexPosition + 1);
        }

        public int MoveBackwords(int indexPosition)
        {
            Console.WriteLine("The train is now at " + linkedList.ElementAt<Stops>(indexPosition).prevStop.stopName);
            return (indexPosition - 1);
        }

        public bool VerifyRoute(int indexPosition, string prevOrForward)
        {
            if (prevOrForward.Contains("forward"))
            {
                if (linkedList.ElementAt<Stops>((indexPosition+1)) != null)
                {
                    return true;
                }
            }
            else 
            {
                if (linkedList.ElementAt<Stops>((indexPosition-1)) != null)
                {
                    return true;
                }
            }
            return false;
        }
    }
}

我也不允许使用链接列表类,但我要使用链接列表(我不是 100% 确定这意味着什么)。

我们将不胜感激提供的任何和所有建议/帮助!

【问题讨论】:

  • 您的任务是使用链表还是实现链表?
  • 听起来你的老师(假设这是家庭作业)希望你实现一个链表类,而不是使用提供的 .NET 类。
  • @LasseV.Karlsen 我刚问过,得到了一个非常令人困惑的答案,但幸运的是,最后他说学习如何使用某些东西的最佳方法是构建它以便实现。好吧,这立即使我所有的代码都没用了:(
  • @user3245390:不一定,但毫无疑问,它需要进行一些重大修改。
  • 同意其他评论者的观点,但实际上,您应该与您的老师澄清这一点(以获得最高分)。澄清需求是软件工程的重要组成部分,但通常做得不好。因此,将其视为实践...作为记录,我同意上面的马特,您需要使用适当的 API 实现一个链表MyLinkedList 来完成要求。您的要求是能够记录火车路线,然后根据要求返回路线。在考虑实现时,用节点和指针绘制图片并计算出它们是如何移动的。也可以重复使用它们。

标签: c# list


【解决方案1】:

让我们在这里拼凑面包屑:

我想构建一个链接列表的实现。

还有这个:

我也不允许使用链表类

显然这里的任务是让您实现自己的链表(类),而不是使用.NET 提供的现有链表。

我假设这里的任务不是构建处理火车的程序,而是了解链表是如何工作的,以及如何实现它。

因此,简单地获取现有类的捷径是错误的工作工具。如果您的任务是构建该程序,那将是完美的(可能),但在这种情况下,该程序与您的任务正交,它可以为您真正被要求做的事情创建一个上下文:

实现您自己的LinkedList&lt;T&gt; 版本(尽管您可能不需要使其通用)。

如果您对这种数据结构的真正工作原理感到困惑,维基百科有一个very good article on linked lists。毫无疑问,网络上还有其他非常好的资源,可能在您的教科书或其他资源中。

另外,我强烈建议你找一个同学一起交流,根据经验,我可以说,我在编程生涯中遇到的大多数真正困难的问题(通常)都可以通过有一个陪练的伙伴来解决与。

【讨论】:

  • 看来是我误解了手头的任务……又一次。我有点幸运,但并不那么幸运,因为我已经完成了一些二进制搜索树代码,因此我已经知道如何做到这一点。但由于我不是在接受教育(学徒),除了stackoverflow之外,我实际上没有任何帮助:(。幸运的是,堆栈上的人非常有帮助。感谢您的帮助,我会接受您的回答让我。
【解决方案2】:

实现一个链表并不难。我假设您有一本教科书,其中讨论了链表,请仔细阅读它,仔细。此外,您还想与您的导师明确您的链接列表需要实现多少功能。

基本上,您将从node 类开始,如果您不需要它是通用的,那么您可以创建一个StopNode 类。 node 类的基础是对列表中下一个节点的引用,并且由于这是一个双向链表,所以对前一个节点的引用:

public class StopNode
{
    public StopNode Next { get; set; }
    public StopNode Previous { get; set; }
    // whatever other properties your stop class needs - such as name
}

现在您的 LinkedList 类将管理停止节点的集合。它需要保留对第一个或“头”节点的引用,也可能是最后一个节点(或“尾”)。

public class StopLinkedList
{
     private StopNode Head { get; }
     private StopNode Tail { get; }
}

它需要实现方法来添加和删除节点(至少)并且可能还插入。

添加非常简单 - 检查 Head 是否为空。如果是,只需将 Head 和 Tail 都设置为您的新节点。如果不是,则改为将TailNext 属性设置为新节点,然后将新节点的Previous 设置为Tail,最后更新Tail 以引用您的新节点节点。

要删除一个节点,如果给定要删除的节点,您需要检查它的 PreviousNext 属性和(假设一个或两个不为空 - 您需要为此添加逻辑) ,您将您的节点Previous.Next 设置为您的节点Next,并将您的节点Next.Previous 设置为您的节点Previous。这将导致您的节点不在列表中(如果需要,您可以将节点 NextPrevious 设置为 null,但除非您删除的节点会挂起,否则这不是绝对必要的)。

希望这能让你开始。与您的导师澄清,检查您的教科书(如果与我的不同,最好尝试匹配他们的术语),并在互联网上搜索“链表”和“双向链表”。你应该找到很多资源。

【讨论】:

  • 嗨,到目前为止,我会将我的代码发布在 OP 中,也许您可​​以让我知道它是怎么回事(我有一个错误,但我会在 OP 中发布它。我没有不幸的是,一位导师和教科书。开发人员告诉我最好使用递归,所以我会用它来让他开心。编辑:我不能在 OP 中发布它:(。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-10
  • 2019-04-09
  • 1970-01-01
相关资源
最近更新 更多