Как искать элемент в связанном списке? (c#) - PullRequest
0 голосов
/ 10 июля 2020

Мне дали этот набор кода, и мне нужно заполнить его некоторым кодом выше while l oop и While l oop. Я видел некоторую документацию, но все, что я видел, это методы поиска с двумя аргументами, а у этого только один. Я уже написал часть внутри while l oop, но я уверен, что это правильно. Как я могу завершить sh этот код, чтобы он искал значение, указанное в качестве параметра?

примечание: это не домашнее задание, где я прошу вас сделать это за меня, скорее это одно из несколько ресурсов, которые у нас есть для изучения, и если бы вы могли завершить это, это дало бы мне лучшую gr asp.

Когда я запускаю этот код сейчас, я получаю следующее сообщение об ошибке: Тип "Tests.Node" не содержат определение для "значения", и не удалось найти метод расширения "значение" типа "Tests.Node". Вам не хватает ссылки на сборку?

{
  public class Node<T> where T : IComparable
{
public T Value { get; }
public Node<T> Next { get; set; }

public Node(T value, Node<T> next)
{
  this.Value = value;
  this.Next = next;
}
}

 public class LinkedList<T> where T : IComparable
  {
public Node<T> start;

public LinkedList()
{
  start = null;
}

public LinkedList(Node<T> node)
{
  start = node;
}

public Node<T> Search(T value)
{
  [here is code needed]
  while (start != null)
    if(start.value.CompareTo(value) == 0){
      return start;
    }
    start = start.next;
}
 }
   public class Program {
    public static void Main(string[] args){
  var list =
    new LinkedList<int>(
      new Node<int>(
        5, new Node<int>(
          7, new Node<int>(
            21, new Node<int>(
              30, null)
            )
          )
        )
    );
  var a = 21;
  var fr = list.Search(a);
}
 }
}

Ответы [ 2 ]

2 голосов
/ 10 июля 2020

Вы очень близки к правильному решению. Прежде всего, вам нужно исправить ошибки компилятора - изменить value и next на Value и Next, потому что так вызываются свойства в вашем Node классе.

Затем вам нужно добавить фигурные скобки, чтобы блок while выполнял присваивание start = start.Next; (в настоящее время только if оператор находится внутри while, поэтому вы закончите с бесконечным l oop)

Затем вам нужно исправить return - добавить return null; после while block - значение, которое вы вернете, если ничего не будет найдено (также без него код не будет компилироваться).

Наконец, вам понадобится чтобы исправить проблему с изменением списка во время поиска (вы изменяете поле start вашего класса LinkedList на start = start.Next, вы не должны этого делать), введите временную переменную (я назвал ее curr) присвойте ему значение start и используйте его в своем while l oop:

public Node<T> Search(T value)
{
    var curr = start;
    while (curr != null)
    {
        if (curr.Value.CompareTo(value) == 0)
        {
            return curr;
        }
        curr = curr.Next;
    }
    
    return null;
} 
1 голос
/ 10 июля 2020

Я предлагаю реализовать IEnumerable<Node<T>> интерфейс

public class Node<T> : IEnumerable<Node<T>> where T : IComparable {
  public IEnumerator<Node<T>> GetEnumerator() {
    for (Node<T> item = this; item != null; item = item.Next)
      yield return item;        
  }

  IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();

  ...

Затем вы можете использовать Linq для запроса коллекции:

  using System.Linq;

  ...

  public static void Main(string[] args) {
    LinkedList<int> list = ... 

    int a = 21;

    var fr = list.start.FirstOrDefault(item => item.Value == a);     
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...