链接列表建议

时间:2014-03-07 15:51:38

标签: c# list

我接受了如下任务:

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

我的任务: 您的程序应使用链接列表使用链接列表为火车路线建模。 首先,用户将输入与火车相同的停靠点数,以及每个停靠点的名称。 然后程序应该打印路线图。 完成后,然后输入他们想要开始的停止名称。 从那里他们可以输入命令将列车前进到下一站或向后移动到前一站。

我被告知我没有正确地完成这项任务,但我真的不明白怎么回事,如果有人可以解释我不应该做的事情,我会很感激。我应该这样做。

我的路线类(它没有完成,但如果正确完成它几乎已经完成):

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

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

我们将非常感谢您提供的任何建议/帮助!

2 个答案:

答案 0 :(得分:3)

让我们把面包屑拼凑在一起:

  

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

和此:

  

我也不允许使用Linked list class

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

我假设这里的任务不是建立处理火车的程序,而是学习链表如何工作,以及如何实施。

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

实施您自己的LinkedList<T>版本(尽管您可能不需要将其设为通用版)。

如果您对这样的数据结构真正起作用感到困惑,那么维基百科就有very good article on linked lists。毫无疑问,网上还有其他非常好的资源,可能还有你的教科书或其他资源。

另外,我会敦促你找一个同学同伴,根据经验,我可以说我在编程生涯中遇到的大部分真正困难的问题(通常)已经通过让一个陪练的合作伙伴来解决用。

答案 1 :(得分:0)

实施链表并不困难。我假设你有一本教科书,它讨论链表,阅读它,仔细。您还想与您的导师详细说明您的链表需要实现多少功能。

基本上,您将从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类将管理停止节点的集合。它需要保留对第一个或“head”节点的引用,也可能是最后一个节点(或“tail”)。

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

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

添加非常简单 - 检查Head是否为空。如果是,只需将Head和Tail设置为等于新节点。如果不是,您可以将Next的{​​{1}}属性设置为新节点,然后将新节点的Tail设置为Previous,最后更新您的Tail引用您的新节点。

要删除节点,如果要删除节点,则需要检查它的TailPrevious属性并且(假设其中一个或两个都不为空 - 您需要添加为此,您将节点Next设置为节点Previous.Next,将节点Next设置为节点Next.Previous。这将导致您的节点脱离列表(如果需要,您可以将节点PreviousNext设置为null,但除非您删除的节点将要挂起,否则不一定非必要。)< / p>

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