У меня есть два отдельных связанных списка, которые объединяются в какой-то момент, и я должен найти эту точку. Я думал, могу ли я добавить новый тип данных с именем visit (flag), чтобы я мог сделать все узлы первого связанного список, который был посещен, а затем найти точку пересечения, пересекающуюся со вторым связанным списком. Могу ли я это сделать? Могу ли я изменить структуру после ее определения? Если да, то как? Спасибо заранее.Можно ли изменить структуру?
ответ
Нет, вы не можете добавлять или удалять элементы из структуры во время выполнения.
Рассмотрите два примера списков A
и B
. Вы не знаете, где они пересекаются, но вы проходитесь как и вы знаете, их длины:
A : A1 > A2 > A3 > A4 > NULL <-- length 4
B : B1 > B2 > B3 > B4 > B5 > B6 > NULL <-- length 6
Если есть точка пересечения, некоторый адрес памяти Ai
будет равняться по адресу памяти Bj
для 1 <= i <= 4
и 3 <= j <= 6
.
Почему?
Если адрес A1
равен адресу B1
или B2
(если любой из этих узлов является точкой пересечения), то связанный список A
будет действительно два узла или один узел больше. Но мы знаем, что это не так, потому что мы прошли A
, и мы уже знаем, как долго это происходит.
Итак, что вы можете сделать, это найти разницу в длинах и пройти эту разницу в течение более длинного из двух списков - узел пересечения, если он существует, будет находиться в хвосте более длинного списка. Затем начинает перебор в оба списков, тестирование для указателя равенства, как вы идете:
# we know B is longer, but you would test this
# condition and set up different code to handle
# the two cases
unsigned int A_len = 4;
unsigned int B_len = 6;
unsigned int AB_diff = B_len - A_len;
struct foo *A_head = ...; # user-defined
struct foo *B_head = ...; # user-defined
struct foo *A_iter = NULL;
struct foo *B_iter = NULL;
# - start the A-iterator at the first node of A
# - start the B-iterator at the diff-th node of B
#
# - now test for pointer equality until we find a
# match, or we hit the end of either list
for (A_iter = A_head, B_iter = B_head + AB_diff;
(A_iter != B_iter) || (A_iter->nextNode != NULL);
++A_iter, ++B_iter) { }
# wherever A_iter and B_iter are now pointing will be
# either NULL (if they don't intersect) or some non-NULL
# value representing the intersection node
Ну, я не думаю, что он попросил **, как найти точку пересечения ... **. –
Я знаю, что есть другие методы с гораздо более простой и простой логикой. Я не просил логики, мне было просто интересно, если структура может быть изменена, и это все. Теперь я узнал, что этого не может быть. Так что спасибо. – avinash
Нет, вы не можете изменить структуру после его определения. Почему вы хотите использовать только тип данных и почему не какой-либо другой метод?
Однако, вы можете сохранить адрес каждого узла связанного списка 1 в массиве, а затем использовать его для поиска точки пересечения. Это близко к тому, что вы хотите.
Снова есть много лучших альгорифмов, чтобы найти точку пересечения, которая не нуждается в дополнительном типе данных.
Если структура определена в вашем источнике, вы можете просто добавить дополнительный элемент. Если вам нужно работать со структурой, уже определенной в какой-либо библиотеке (или вашим инструктором), то нет, вы не можете добавлять участников после факта, но лучше всего сохранить хэш-таблицу, которая отображает адрес экземпляров struct к дополнительной информации об этой структуре. В этом случае, поскольку вам нужна только информация о том, был ли экземпляр замечен, просто введите адреса узлов первого списка в хеш-таблицу, затем просмотрите второй список, чтобы узнать, есть ли какой-либо из его узлов в хэш-таблице.
Также см. Ответ Alex Reynolds, который позволяет избежать необходимости в дополнительной информации.
- 1. Можно ли изменить структуру класса через атрибуты?
- 2. Можно ли передать структуру другому?
- 3. Возможно ли изменить структуру зашифрованного бэкэнда Access?
- 4. Изменить Sails.js структуру проекта
- 5. Можно ли изменить цвет?
- 6. Можно ли изменить подпроцесс?
- 7. Можно ли изменить паруса.
- 8. Можно ли изменить TWTweetComposeViewController?
- 9. Можно ли расширить структуру API Windows?
- 10. (C#) Можно ли просматривать структуру в CLRProfiler?
- 11. Можно ли читать структуру другого url?
- 12. Можно ли передать аргументы в структуру/библиотеку?
- 13. Можно ли программно генерировать структуру основных данных?
- 14. Можно ли определить эту структуру PHP?
- 15. Можно ли отправить структуру в блок?
- 16. Можно ли включить запросы в структуру корпуса?
- 17. Можно ли создать собственную структуру событий SDL?
- 18. Можно ли тестировать эту структуру javascript?
- 19. Можно ли прочитать структуру файла plist?
- 20. Можно ли добавить список в структуру?
- 21. Можно ли отобразить древовидную структуру Java-кода?
- 22. Можно ли определить структуру C несколько раз?
- 23. Можно ли обернуть структуру сущности в odbc?
- 24. Могу ли я изменить структуру YUI datatable?
- 25. Изменить структуру массива JS
- 26. Как изменить структуру JSON
- 27. Можно ли изменить привязки привязки?
- 28. Можно ли изменить CSS iFrame?
- 29. Можно ли изменить ширину счетчика?
- 30. Можно ли изменить ключ NSDictionaries?
Можете ли вы опубликовать некоторый код, чтобы проиллюстрировать, что вы думаете? –
Есть другие способы узнать точку пересечения из 2 связанных списков. Не увеличивайте сложность кода. И, насколько я знаю, вы не можете изменить структуру после определения. –