|
0 / 0 / 0
Регистрация: 15.07.2015
Сообщений: 4
|
||||||
Указатель в списке ссылается на себя, а не на следующий элемент15.07.2015, 06:31. Показов 1214. Ответов 7
Метки нет (Все метки)
Уважаемые, форумчане!
Помогите разобраться в вопросе. Я хочу реализовать стек(добавление элемента) на основе односвязного списка. Предварительно почитав как это делается, я решил а почему бы не сделать по другому, И начал изобретать велосепед, но он не едит, а еще страшнее я не поняимаю почуму. Ниже часть кода
Но при втором вызове stack = 1---->1---->1 ----> ...... ---->1 ..... а я то ждал 3--->1---->2---->NULL Объясните пожалуйста. Выписка из дебагера говорит, что temp->next указывает на себя же, но я не понимаю как так получается. Breakpoint 1, main () at stack.cpp:20 20 push(&stack, 1); (gdb) s push (stack=0xbffff1d8, value=1) at stack.cpp:39 39 temp = *stack; (gdb) 40 stack -> data = value; (gdb) 41 stack -> next = &temp; (gdb) p temp $15 = {data = 2, next = 0x0} (gdb) p &temp $16 = (List *) 0xbffff1b0 (gdb) p stack $17 = (List *) 0xbffff1d8 (gdb) p stack->next $18 = (List *) 0x0 (gdb) s 43 } (gdb) p stack->next $19 = (List *) 0xbffff1b0 (gdb) p (*stack->next)->data $20 = 2 (gdb) p (*stack->next)->next $21 = (List *) 0x0 (gdb) s main () at stack.cpp:21 21 push(&stack, 3); (gdb) p stack $22 = {data = 1, next = 0xbffff1b0} (gdb) p (*stack.next).data $23 = 2 (gdb) p (*stack.next).next $24 = (List *) 0x0 (gdb) s push (stack=0xbffff1d8, value=3) at stack.cpp:39 39 temp = *stack; (gdb) s 40 stack -> data = value; (gdb) s 41 stack -> next = &temp; (gdb) p temp $25 = {data = 1, next = 0xbffff1b0} (gdb) p (*temp.next).next $26 = (List *) 0xbffff1b0 (gdb) p (*temp.next).data $27 = 1 (gdb) p (*(*temp.next).next).data $28 = 1 (gdb) p (*(*(*temp.next).next).next).data $29 = 1
0
|
||||||
| 15.07.2015, 06:31 | |
|
Ответы с готовыми решениями:
7
Функция next списка ссылается не на следующий элемент, а на последний Указатель на следующий элемент структуры
|
|
419 / 418 / 167
Регистрация: 28.11.2010
Сообщений: 1,183
|
|
| 15.07.2015, 07:39 | |
|
temp = *stack; <== сохранил значение переменной, в которой следующий = 0, и данные 2.
stack -> data = value; <== поменял значение данных в исходном объекте stack -> next = &temp; <== записал ссылку на локальный объект, в котором к тому же копия всего "стека" из одного элемента. Не по теме: может без лисапеда?
1
|
|
|
0 / 0 / 0
Регистрация: 15.07.2015
Сообщений: 4
|
||||||||||||||||
| 15.07.2015, 08:22 [ТС] | ||||||||||||||||
|
Rius, Извиняюсь, но я добавляюю в начало, значит мне надо найти первый элемент.
А вот насчет добавить новый динамический созданный, похоже, и есть ключевой момент, который я недопонимаю тут. Помогите разобраться, в моей голове картина такая: Я первый раз вызываю push
но выглядит ужасно. Указатель на указатель там-- это ведь извращение. поэтому решил проще сделать, а тут вон оно как(( Добавлено через 17 минут vua72, stack -> next = &temp; <== записал ссылку на локальный объект, в котором к тому же копия всего "стека" из одного элемента. чувствую где тут проблема кроется)) 1. чем плоха ссылка на локальный объект? разве stack.next из main( ) не сошлется на этот адрес? 2. к тому же копия всего "стека" из одного элемента ну да, потом ведь next в этом элементе приведет меня к следующему, и так я буду переходить к следующему. P.S. не надо лисапеда? Мне не особо симпатичен привычный лисопеде, который ездит к тому же.
0
|
||||||||||||||||
|
0 / 0 / 0
Регистрация: 15.07.2015
Сообщений: 4
|
|
| 15.07.2015, 11:17 [ТС] | |
|
Rius, хорошо!
Но тогда, раз при выходе из функции он удаляется, получается, что stack --> next на выходе должен непонятно куда указывает. И еще более страно, почему мне удалось присвоить адрес temp ( а он должен был удалиться) при первом вызове push?
0
|
|
|
0 / 0 / 0
Регистрация: 15.07.2015
Сообщений: 4
|
|
| 16.07.2015, 08:09 [ТС] | |
|
Все! Я узрил истину))
первый раз я в temp помещаю (2 , next) -> NULL и при выходе из push у меня stack указывает на (1, next) --->(2, next) ---> NULL; теперь я вызываю опять push, и теперь temp = *stack, т.е. темп равняется первому элементу (1, next) , но next на первом вызове push указывает на temp. Выходит, что temp = (1, next) ---> (1, next) ---> (1 , next) ->........->(1,next) ---> Может я описал, достаточно размыто, но я теперь понял, то что хотели сказать Ruis и vua72. Спасибо!
0
|
|
| 16.07.2015, 08:09 | |
|
Помогаю со студенческими работами здесь
8
Как можно сохранить указатель которые ссылается на первый элемент, чтобы ещё раз изменить коэффициенты? Следующий элемент в списке и проверка прогрессии. Определить элемент списка L, следующий за элементом X в этом списке Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/
O1rJuneU_ls
https:/ / vkvideo. ru/ video-115721503_456239114
|
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ВВЕДЕНИЕ
Введу сокращения:
аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
|
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi
ветка по-частям.
коммит Create переделка под биомассу. txt
вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
|
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ *
Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях.
Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её.
Последовательность действий:. . .
|
|
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
|
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение.
И на уровне агентов добавится между грибами или бактериями взаимодействий.
До того я пробовал подход через многомерные массивы,. . .
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|