2015-04-15 4 views
4

Я беру класс программирования У меня есть следующее назначение.remove() метод связанного списка

Напишите программу, управляемую меню, которая либо принимает слова, либо их значения, либо отображает список слов в лексикографическом порядке (например, в словаре). Когда запись должна быть добавлена ​​в словарь, вы должны сначала ввести слово как одну строку, а затем ввести значение как отдельную строку. Другое требование - время от времени слова устаревают. Когда это произойдет, такое слово должно быть удалено из словаря.

Используйте класс JOptionPane для ввода информации.

Используйте концепцию связанного списка для выполнения этого упражнения. Вам понадобятся как минимум следующие классы:

  • Класс WordMeaning, который содержит имя слова и его значение.
  • Класс WordMeaningNode, который создает узел информации и поле связи .
  • Класс WordList, который создает и поддерживает связанный список слов и их значения.
  • Класс словаря, который проверяет ваши классы.

Для вывода, программа должна производить два прокруткой списка:

  • Текущий список слов и их значений.
  • Список удаленных слов. Вам не нужно перечислять значения, только слова.

До сих пор у меня было все закодировано, кроме метода удаления, и я не уверен, как это кодировать, так что может кто-нибудь мне помочь. Я уже кодировал метод добавления, но теперь я не знаю, с чего начать с метода remove в моем классе WordList. Мои занятия ниже.

WordList Класс:

public class WordList { 

WordMeaningNode list; 

WordList() { 
    list = null; 
} 

void add(WordMeaning w)// In alphabetical order 
{ 
    WordMeaningNode temp = new WordMeaningNode(w); 

    if (list == null) 
     list = temp; 
    else 
    { 
     WordMeaningNode aux = list; 
     WordMeaningNode back = null; 
     boolean found = false; 

     while(aux != null && !found) 
      if(temp.getWordMeaning().getName().compareTo(aux.getWordMeaning().getName()) < 0) 
       found = true; 
      else 
      { 
       back = aux; 
       aux = aux.next; 
      } 

     temp.next = aux; 
     if (back == null) 
      list = temp; 
     else 
      back.next = temp; 
    } 
} 

boolean listIsEmpty() { 
    boolean empty; 
    if (list == null) { 
     empty = true; 
    } else { 
     empty = false; 
    } 

    return empty; 
} 

public String toString() 
{ 
    String result = ""; 
    int count = 0; 
    WordMeaningNode current = list; 

    while (current != null) 
    { 
     count++; 
     result += current.getWordMeaning().getName() + "\n" + "\t" + current.getWordMeaning().getDefinition(); 
     current = current.next; 
    } 

    return result + "\nThe number of words is : " + count; 
} 
} 

Я пытался использовать тот же формат, метод для метода REMOVE, как я сделал для метода добавления, но на самом деле не работает, или я сделал это неправильно.

+0

Нет, его назначение - * code * связанный список WordMeaningNodes, каждый узел содержит экземпляр WordMeaning, содержащий слово и его определение. Прочитайте вопрос перед публикацией комментариев. –

ответ

4

Чтобы удалить элемент из LinkedList, вы должны перебрать его узлы. Тогда, если вхождение найдено, соединить предыдущий и следующий узел, установка previous.next = next:

boolean remove(String word) { 

    if (list == null) // list is empty 
     return false; 

    WordMeaningNode n = list; 
    WordMeaningNode prev = null; 

    do { 
     if (n.wordMeaning.name.equals(word)) { // word found 
      if (prev != null) { 
       prev.next = n.next; // connect previous to next 
      } else { 
       list = list.next;  // connect head to next 
      } 
      return true; 
     } 
     prev = n; 
     n = n.next; 
    } while (n != null); // repeat till the end of a list 
    return false; 
} 

В основном коде, изменить часть case 2:

if (diction.remove(word)) { 
    obsolete.add(new WordMeaning(word, " ")); 
    // notify about deletion 
} else { 
    // notify that word don't exist. 
} 

, потому что вы действительно не нужно NullPointerException здесь.

+0

Огромное спасибо :) –

+0

Добро пожаловать. BTW, глава списка используется как 'head', а не' list'. –

0

Чтобы удалить элемент из списка, вам нужно найти элемент просто перед тем один, чтобы удалить, и установить его next ссылку на элемент после тот, чтобы удалить.

Вы будете иметь некоторые (не взаимоисключающими) угловые случаи, чтобы обратить внимание на:

  • Если элемент для удаления является первым (то, первый узел WordList должен быть установлен на элемент после того, как один, чтобы удалить)
  • Если элемент удалить, если последний в списке (то вам придется установить next ссылку предыдущего элемента к null)

Кроме того, я вижу, что вам нужно, чтобы сохранить список of rem поэтому не забудьте сохранить ссылку на удаленный элемент во время процесса и добавить его в свой список устаревших слов.

Смежные вопросы