0

我正在学习如何使用课程。我做了两节课,一节课是汽车清单。但是,我需要修改 add 函数,以便添加按价格排序的汽车。我遇到的问题是它会将最便宜的汽车送到开头,但会杀死列表的其余部分。这是我的添加代码...

public void add_car(the_cars new_car)
        {// Method to add cars to list
            if (count == 0)
            {// If this is the first car 
                first = new_car;
                last = new_car;
                count = 1;
            }
            else
            {// If it is not the first car
                if (new_car.getPrice() < first.getPrice())
                {// If price of new car is lower than first car
                    last = first;
                    first = new_car; // new car becomes first car
                }
                else
                {
                    while (new_car.getPrice() > last.getPrice() || last.next != null)
                    {
                        last.next = new_car; // Null value now equal to car
                        last = new_car;
                    }
                }


                count++;
4

3 回答 3

3

要将项目插入单链表,您需要:

  1. 更改以前的节点next(或者first如果它是第一项)以指向新节点。
  2. next将新项目的更改为新项目next之前的项目。(你没有在你的代码中这样做。)

如果你有一个双向链表(看起来你没有),你还需要:

  1. 将当前节点更改previous为指向您之前的节点。
  2. 将下一个节点更改previous为指向您。

请注意,这些操作可能需要按照我在此处指定的顺序以外的顺序完成。

由于您还有一个last指针,因此您需要检查是否需要更新并更新它。

您遇到的另一个问题是您last用于在第一项之后添加任何内容。你……不想那样做。您需要遍历列表,这意味着创建一个新的局部变量来跟踪当前位置。实际上,您的代码基本上是在清除last.

于 2012-12-06T16:36:44.570 回答
0

您已正确识别案例:

  1. 列表还是空的吗?
  2. 是否应该在开头添加项目?
  3. 如果不是:我们需要在哪个项目之后插入?

你实施了第一个案例好吧。

第二种情况是错误的:在开头插入意味着将第一个元素更改为new_car,但new_car.Next需要指向之前的第一个元素,否则会丢失链接。

第三种情况也是错误的:您需要走到列表的末尾,直到到达最后一个元素(然后是您需要插入的那个),或者直到找到一个其后继元素更大的元素价格并在那之后插入。

我可以这样设置条件的原因while是,如果current != last我可以确定存在 a current.Next,否则它就是last定义。我需要一个临时迭代元素的原因是,如果我修改first我会丢失列表的入口点。

如果没有测试过下面的代码,但它应该给你一个线索,如果它不起作用,单步调试会帮助你。

public void add_car(the_cars new_car)
{// Method to add cars to list
    if (count == 0)
    {// If this is the first car 
        first = new_car;
        last = new_car;
        count = 1;
    }
    else
    {// If it is not the first car
        if (new_car.getPrice() < first.getPrice())
        {// If price of new car is lower than first car
            new_car.Next = first; // Insert the first car as the first element
            first = new_car;
        }
        else
        {
            // Create temporary iteration element
            the_cars current = first;

            // Find the car
            while (current != last && new_car.getPrice() >= current.Next.getPrice())
                current = current.Next;

            // Insert after the given element
            new_car.Next = current.Next;
            current.Next = new_car;

            // Also you may need to update last to match the new end
            if (current == last)
                last = new_car;
        }

        count++;
    }
}
于 2012-12-06T16:50:03.847 回答
0

如果您想使用LinkedList 类,这里有一个基于您的场景的示例实现:

class CarList : LinkedList<Car>
{
    public void AddCar(Car newCar)
    {
        if (this.Count == 0)
        {
            AddFirst(newCar);
        }
        else
        {
            var referenceCar = Find(this.OrderByDescending(i => i.Price).Where(i => newCar.Price > i.Price).FirstOrDefault());
            if (referenceCar == null)
            {
                AddBefore(First, newCar);

            }
            else
            {
                this.AddAfter(referenceCar, newCar);
            }
        }
    }
}

class Car
{
    public int Price { get; set; }
    public Car(int price)
    {
        Price = price;
    }
}

static void Main(string[] args)
{
    var list = new CarList();
    list.AddCar(new Car(20000));
    list.AddCar(new Car(10000));
    list.AddCar(new Car(15000));

    foreach (var item in list)
    {
        Console.WriteLine("Price {0}", item.Price);
    }
}
于 2012-12-06T16:52:34.450 回答