Редактирование узла в связанном списке - PullRequest
4 голосов
/ 09 декабря 2010

Я создаю список студентов (связанный список), который может добавлять, просматривать и редактировать информацию о студентах. У меня есть два поля, а именно Имя ученика и Оценка ученика, и я добавляю новых учеников в список таким образом, чтобы он сортировался в соответствии с оценками ученика в порядке убывания.

Я закончил добавлять и просматривать часть. Проблема в части редактирования, потому что мне нужно отредактировать информацию, а затем мне нужно снова отсортировать ее, чтобы она находилась в правильном месте списка.

Например, у меня есть информация о 3 студентах, упорядоченная в соответствии с их оценками:

student1 90 -> student2 85 -> student3 80 -> NULL

Затем мне нужно отредактировать класс ученика 2 до 75, поэтому отредактированный связанный список теперь должен быть организован следующим образом:

student1 90 -> student3 80 -> student2 75 -> NULL

Как мне это сделать? Вам не нужно давать мне код. Я просто хочу несколько советов о том, как я могу реализовать часть редактирования моей программы. Я имею в виду создание нового узла (с отредактированной информацией), удаление старого узла и вставка отредактированного узла в список. Правильна ли моя логика? или есть лучший способ решить мою проблему.

Ответы [ 4 ]

3 голосов
/ 09 декабря 2010

Односвязный список?

Найдите узел, который вы хотите редактировать, и либо сохраните указатель на предыдущий узел, либо напишите процедуру для извлечения предыдущего узла.

Удалить ваш узел из связанного списка (установив previous_node-> рядом с thisOne-> next)

Сделайте ваши правки.

Вставьте новый узел в нужном месте в списке (при обходе списка, пока следующий узел не станет меньше вашего отредактированного значения.

Соединение, отредактированное в списке (editedNode-> next = nextNode; current-> next = editedNode)

С помощью двусвязных списков вы можете просто использовать ссылку "другое" / back / up, чтобы найти предыдущий узел

3 голосов
/ 09 декабря 2010

Вы можете достичь своей цели с помощью

  • Удаление целевого узла
  • Редактирование данных целевого узла
  • Повторно вставьте узел, используя существующую логику для вставки узлов.
2 голосов
/ 09 декабря 2010

В принципе, ваша идея верна, за исключением того, что я не буду создавать новый узел. Что бы я сделал, было бы:

  1. Определить, увеличилось ли значение или уменьшилось (и обновить узел).
  2. Отключить узел от списка.
  3. Поиск вперед или назад (в зависимости от увеличения или уменьшения оценки) для правильного местоположения.
  4. Ссылка узла на новое место.

Обратите внимание, что индексирование списка в массив и т. Д. Может дать более быстрый поиск, чем линейный обход. Если у вас уже есть такой механизм, его можно использовать быстрее при поиске места для повторной вставки узла.

1 голос
/ 09 декабря 2010

Вы можете сделать функцию, которая редактирует указанный узел.Сканируйте список, пока не найдете этот узел, а затем непосредственно отредактируйте его.Конечно, вы будете использовать указатель.Для сортировки, скажем, у вас есть n узлов, сравните каждый узел i с узлами после него и поменяйте их местами, если тот, с которым вы сравниваете, больше:

for every node n1 in list
    for every remaining node n2 in list
        if n2->grade > n1->grade
            swap 'em

вы можете поменять их местами, копируя их память,поэтому вам не нужно менять указатель.

...