|
0 / 0 / 0
Регистрация: 15.07.2015
Сообщений: 4
|
||||||
Указатель в списке ссылается на себя, а не на следующий элемент15.07.2015, 06:31. Показов 1272. Ответов 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 в этом списке Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2.
Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники".
В. . .
|
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии.
. . .
|
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
|
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут.
https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc
Первый документ красиво выглядит, но без схемы.
Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
|
|
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере".
Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
|
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти".
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
В качестве источника данных. . .
|
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер
Написал заготовку:
dotnet new console --aot -o UrlHandler
var items = args. Split(":");
var tag = items;
var id = items;
var executable = args;. . .
|
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3.
Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
|