![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
student0511 |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 26.3.2006 Репутация: нет Всего: нет |
Приветствую ALL!!!
Моё сообщение уже было представлена в теме "Указатели на структуры". Но с проблемой так и не разобрался.... ![]() Сравнительно недавно начал изучать С/С++ и перешёл к указателям (весьма весёлая вещь ![]() ![]() Для простоты я использую только одно поле: int digital. В программе всего несколько функций: вывод списка, поиск и удаление элементa(ов), вставка, печать в обратном порядке - проблема заключается в удалении элемента, вставленного в середину списка. Поиск организуется путём перебора исходных данных, если «объект» повторяется (в данном случае целое число), то создаётся новый линейный список с более, чем одним элементом (он формируется в любом случае), каждый элемент которого указывает на свой исходник (->prvs) и возвращается указатель на него. В функции удаление, если это элемент - ни конец списка, ни его начало, то происходит вставка элемента в середину, а удаляет следующия функция:
Где del - указатель на список, который формируется для удаления повторяющихся полей в исходном списке – очереди (order). Beg and end – как понятно из названия, являются указателями на начало и конец в исходном списке. При формировании вспомогательной динамической структуры используется основа исходной. Так указатель “->p” содержит адрес след. элемента, а вот “->prvs” уже играет другую роль, нежели в очереди order: он отвечает за координаты исходных элементов, из которых и формируется вспомогательный список. В результате, зная всё об исходнике, его легко удалить. При чём выражение (del->prvs)->prvs всё равно указывает не на «объект», предшествующий исходному, а вообще непонятно на что. При выводе (del->prvs)->prvs->d возвращает число, которое необходимо удалить. Функция вставки:
Функция поиска.
Функция добавления в вспомогательный список:
Вообще функция удаления элемента или повторяющихся полей, которые были в списке изначально, работает. Я думаю, что проблема в вставки или что-то с указателем, который хранит исходный элемент. Вообщем, хз... Буду благодарен за помощь! ![]() Это сообщение отредактировал(а) student0511 - 4.9.2006, 02:21 Присоединённый файл ( Кол-во скачиваний: 7 ) ![]() |
||||||||
|
|||||||||
student0511 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 26.3.2006 Репутация: нет Всего: нет |
Я думаю после комментариев код будет понятен. Извиняюсь за отсутствие онных...
|
|||
|
||||
zkv |
|
||||||||||||||||||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
судя по проге это не так:
далее при добавлении нового элемента end нацеливается на последний, а beg как показывал на end так и показывает, в итоге end всегда указывает на последний, а beg всегда указывает на end ИМХО твою прогу очень трудно разбирать, а проблему четко ты не указал (в итоге проще заново написать чем проверить), по этому могу помочь лишь рекомендациями: ![]() далее все ИМХО, если кто то со мной не согласен буду рад выслушать ![]() 1. назови переменные и функции так чтобы их имена отражали свое назначение, одни только прототипы ставят в тупик:
в твоей структуре:
можно лишь догадаться что prvs указывает на предыдущий элемент, про d тоже можно что то представить, про p конечно можно методом исключения предположить что это указатель на следующий, но только когда видишь имена и типы остальных членов структуры. если же это дело обозвать так:
то встретив выражение типа pBegin->next мы не будем ломать голову что такое next. 2. Слишком много функций, например отдельная функция добавления первого элемента, почему бы не использовать функцию добавления элемента, а в ней сделать проверку пуст список или нет. Или такой пример:
Зачем такие сложности? ![]() 3. Используй начальный отступ, прогу трудно читать 4. взглянем на 2 прототипа:
почему, в одном из них ты передаешь указатель по ссылке, а в другом указатель на указатель? Ведь аргументы в функциях ты используешь одинаково, это просто сбивает. или здесь, тоже хочешь "запутать врага" ![]()
почему бы просто не передать int по значению:
ну и последнее: погоняй прогу по шагам, выводи промежуточные результаты в "подозрительных" местах, найди ошибку, и если сам не сможешь исправить (хотя это вряд ли ![]() тогда уже задавай конкретный вопрос, потому как прогу за тебя может кто и напишет, но если хочешь разобраться - делай сам. |
||||||||||||||||||
|
|||||||||||||||||||
student0511 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 26.3.2006 Репутация: нет Всего: нет |
Вообщем, проверил я пошаговой троссировкой, что творится со списком. Так вот, оказалось, что при связывании следущего после позиции элемента с новым: ((pos->prvs)->next)->prvs = pv - адреса ((pos->prvs)->next)->prvs, ((pos->prvs)->next)->prvs->prvs ... ((pos->prvs)->next)->prvs->...->prvs становятся равными. Почему я так и не понял
![]() Функция вставки в новом виде:
Вот результат пошаговой троссировки: Это сообщение отредактировал(а) student0511 - 6.9.2006, 02:06 Присоединённый файл ( Кол-во скачиваний: 5 ) ![]() |
|||
|
||||
zkv |
|
||||||||||||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
student0511, эта функция даже не откомпилится, проверь скобки. Проясни пожалуйста, что ты передаешь в функцию в качестве аргументов (и вообще, что она должна сделать)?
что делает find и что возвращает? &*k - интересное выражение ![]()
интересно, почему все-таки ты не хочешь передавать int'ы по ссылке или по значению, ведь понятнее и удобнее написать так:
и еще, вижу две строчки, которые меня пугают ![]()
в принципе не важно, что происходило до них, после выполнения строки 1 когда говорим (pos->prvs)->next подразумеваем pv, следовательно ((pos->prvs)->next)->prvs эквивалентно pv->prvs, а вся строка 2 эквивалентна pv->prvs = pv; может отсюда ноги у ошибки растут? ![]() PS если ты передаешь beg в функцию по ссылке:
то зачем тогда еще раз его передавать в возвращаемом значении:
Это сообщение отредактировал(а) zkv - 6.9.2006, 05:14 |
||||||||||||
|
|||||||||||||
student0511 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 26.3.2006 Репутация: нет Всего: нет |
zkv
В строчках
ААА!!! нашёл ошибку: вернее нужно было вот как: ((pos->prvs)->next)->prvs = pv; (pos->prvs)->next = pv; Вот до чего доводит невнимательность. ![]() ![]() ![]() Конечно, нужно ещё предусмотреть некоторые ситуации, но это уже проще, чем поменять местами две строчки ![]() Это сообщение отредактировал(а) student0511 - 6.9.2006, 11:28 |
|||
|
||||
wnayk |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 10.12.2006 Репутация: нет Всего: нет |
У кого нибудь есть такая или похожая на эту задачка????:::: Магазин с одним продавцом. Компьютер вместо кассового аппарата. База наличия товаров: наименование, единица измерения, цена единицы, количество, дата последнего завоза. Регистрация поступления товара( как старых ,так и новых наименований ). Оформление покупки: выписка чека, корректировка базы. Проблема уценки и описания. Инвентаризация остатков товара с вычислением суммарной стоимости. Программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе. |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
wnayk, нехорошо!
Во-первых, ты уже писал данное сообщениеи тебе ответили, что сочли нужным. Во-вторых, к этой теме оно абсолютно не относится... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |