【问题标题】:I am not understanding why my code for Linked List is not working?我不明白为什么我的链接列表代码不起作用?
【发布时间】:2022-01-28 12:33:40
【问题描述】:

我不知道出了什么问题,但该程序无法正常工作。如果您能帮助我,我将不胜感激。

using System;
using System.Collections.Generic;
                    
public class Program
{
    public static void Main()
    {
        LinkedList<ulong> integers = new LinkedList<ulong>();
        
        for(ulong i = 1; i <= 10; i++)
        {
            integers.AddLast(i);
        }
        
        Console.Write("Enter an integer: ");
        ulong x = ulong.Parse(Console.ReadLine());
        Console.WriteLine();
        
        foreach(ulong integer in integers)
        {
            if(integer > x)
            {
                integers.Remove(integer);
            }
        }
        
        integers.AddLast(x);
        integers.AddLast(10);
        
        foreach(ulong integer in integers)
        {
            Console.WriteLine(integer);
        }
    }
}

我的任务条件是:创建一个 10 个正整数的 LinkedList。完成的列表显示在屏幕上。在键盘上输入一个正整数 x,从列表中删除所有大于 x 的项,并在 x 值列表中的最后一项之后添加一个值为 10 的项。显示更改后的列表。

【问题讨论】:

  • 欢迎使用 stackoverflow。您能否更具体地说明“不工作”?究竟发生了什么,应该发生什么,你得到什么错误信息(如果有的话)?我推荐taking the tour,以及阅读how to ask a good questionwhat's on topic
  • 控制台打开并允许我输入指定数量的整数,但输入它们后给我一个错误但没有告诉我它到底是什么。我是编程新手,所以我无法准确解释我的意思。
  • “但没有确切地告诉我它是什么”这不是 c# 通常做的事情。你的意思是:控制台立即关闭?另外:你要插入什么数字?请阅读我链接到的文章,非常感谢。而且我还建议您学习如何使用调试器 - 这样您的程序会在遇到错误时停止,并且您可以在确切的执行点对其进行检查。
  • 您是否希望您的列表包含唯一排序的项目。您的代码在一定程度上暗示了这一点,但至少插入的 x 当前可以在列表中两次。您可能需要重新考虑您的 if 语句。

标签: c# linked-list


【解决方案1】:

首先引起我注意的是,在 foreach 循环中,您正在修改正在迭代的列表:整数

先尝试将要删除的项目列表存储在单独的列表中。然后遍历该列表并全部删除。

var toBeDeleted=new List<ulong>;

foreach(ulong integer in integers)
        {
            if(integer > x)
            {
                toBeDeleted.Add(integer);
            }
        }

foreach(ulong item in toBeDeleted)
    {
         integers.Remove(item);
    }

您也可以使用Remove(LinkedListNode) 方法。在那种情况下,代码中会是这样的(没有测试它,所以你可能需要触摸它以使其编译)

var toBeDeleted=new List<LinkedListNode<ulong>>;

foreach(LinkedListNode<ulong> integer in integers)
        {
            if(integer > x) //might need to cast it to ulong if it doesn't happen automatically.
            {
                toBeDeleted.Add(integer);
            }
        }

integers.Remove(toBeDeleted);

【讨论】:

  • 你大概想以某种方式填写 toBeDeleted。
  • 好消息@Ralf。复制和粘贴错误。
【解决方案2】:

我运行了你的代码。您正在删除 foreach 循环中的项目。尝试使用“for”循环并从最后一个元素迭代到第一个元素。

class Program
    {
        static void Main(string[] args)
        {
            LinkedList<ulong> integers = new LinkedList<ulong>();

            for (ulong i = 1; i <= 10; i++)
            {
                integers.AddLast(i);
            }

            Console.Write("Enter an integer: ");
            ulong x = ulong.Parse(Console.ReadLine());
            Console.WriteLine();

            for (int i = integers.Count-1; i >= 0; i--)
            {
                ulong a = integers.ElementAt(i);
                if (a > x)
                {
                    integers.Remove(a);
                }
            }

            integers.AddLast(x);
            integers.AddLast(10);

            foreach (ulong integer in integers)
            {
                Console.WriteLine(integer);
            }
            Console.ReadKey();
        }
    }

C# List - Removing items while looping / iterating

【讨论】:

  • 当使用 Remove 改变迭代方向时可能是错误的。 LinkedList.Remove 删除第一次出现的值。
猜你喜欢
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
  • 2020-03-16
  • 2014-12-12
  • 2014-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多