我接受了如下任务:
我想构建一个链表的实现。具体来说,我希望它是一个双重链表。
我的任务: 您的程序应使用链接列表使用链接列表为火车路线建模。 首先,用户将输入与火车相同的停靠点数,以及每个停靠点的名称。 然后程序应该打印路线图。 完成后,然后输入他们想要开始的停止名称。 从那里他们可以输入命令将列车前进到下一站或向后移动到前一站。
我被告知我没有正确地完成这项任务,但我真的不明白怎么回事,如果有人可以解释我不应该做的事情,我会很感激。我应该这样做。
我的路线类(它没有完成,但如果正确完成它几乎已经完成):
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%确定这意味着什么)。
我们将非常感谢您提供的任何建议/帮助!
答案 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
引用您的新节点。
要删除节点,如果要删除节点,则需要检查它的Tail
和Previous
属性并且(假设其中一个或两个都不为空 - 您需要添加为此,您将节点Next
设置为节点Previous.Next
,将节点Next
设置为节点Next.Previous
。这将导致您的节点脱离列表(如果需要,您可以将节点Previous
和Next
设置为null,但除非您删除的节点将要挂起,否则不一定非必要。)< / p>
希望这能让你开始。澄清你的导师,检查你的教科书(如果它与我的不同,可能更好地尝试和匹配他们的术语),并在互联网上搜索“链表”和“双链表”。你应该找到很多资源。