![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| ТРЕТЬ |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 8.1.2006 Где: mind's gloomy corner Репутация: нет Всего: 1 |
Заранее прошу войти в моё положение. (Если у кого-то достаточно доброе сердце, то следущие 3 обзаца можно пропустить)
Вообще, я в школе начал програмить на Си (чистом). Но это было так называемое "олимпиадное" программирование, которое даже скорее выявляло не программистов а математиков, пототму как нам объяснили только азы (стандартные переменные, функции, циклы... и вроде бы все). В школе как-то все равно было на каком языке пишешь, потому что уровень программирования все равно ниже плинтуса давался. Но вот, пошел в универ, а тут все преподают на паскале... Пробовал на паскале писать, но не смог - откровенно говоря, затошнило... продолжил писать на Си (уже к этому времени Си++, но как понимаете, разницу вряд ли на своем уровне смог уловить). Но появилась серьезная проблемма - курс програмухи включает в себя ООП (кое-как через РНР научился) и рекурентные типы данных... И вот на последних и смотрю теперь как баран на новые ворота... Самое страшное. что у меня через 3 дня экзамен, а я до сих опр до конца не врубился в обозначения и механизмы. А вот теперь вопрос конкретно по проге. Код брал из коллекции тов Смита...
Ну и собственно вопросы практически по каждой строчке... 1. Сама по себе структура (struct), это как бы класс, в котором нету методов? Т.е. есть конечно различия, но в целом, можно ли такое сказать? 2. item *list; Объявляет (хм, как бы это сказать) "полноценный" элемент списка, или только ссылку на первый(последний???) элемент? 3. Объясните вообще, так сказать, на пальцах, как организуется доступ к каждому элементу списка. Что значит "->", в чем отличие i->prev->next от i->next->prev? Очень прошу дать максимально доступные пояснения. Только не посылайте за учебниками - уже больше месяца ничего толкового за бесплатно найти не могу... и все-таки, 3 дня до экзамена.... не хочется его с пересдачи сдавать... |
|||
|
||||
| Никто |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 21.3.2006 Репутация: нет Всего: нет |
Где-то так.
Если вместо указателей переменные,то доступ к ним осуществляется с помощью точки. Например. struct item { int element; int prev; int next; }; item list; list.element=2; list.prev=3; list.next=4; Если же это указатели,то вместо точки ставится указатель -> на данное. struct item { int element; item *prev; item *next; }; item *list; list->element=0; list->next=list; list->prev=list;
Next-это поле prev,а prev-это следующее поле в next. --------------------
|
||||||
|
|||||||
| Никто |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 21.3.2006 Репутация: нет Всего: нет |
У тебя prev и next имеют тип структуры,в который они входят,поэтому они имеют такие же поля,как и структура.
--------------------
|
|||
|
||||
| ТРЕТЬ |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 8.1.2006 Где: mind's gloomy corner Репутация: нет Всего: 1 |
Угу... Все-таки не совсем понятно насчет i->prev->next от i->next->prev...
Как я понял, в первом случае будет от заданной записи перескакивать на предыдущую (->prev) а после можно будет работать с инфой, вписанной в поле next этой записи... блин... сам почти запутался... |
|||
|
||||
| SaDFromSpb |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 5.4.2006 Где: Санкт-Петербург Репутация: 3 Всего: 3 |
ТРЕТЬ,
Структура почти тоже самое, что и класс (она тоже может иметь методы и участвовать в наследовании). Отличается она от класса тем, что по умолчанию доступ к элементам открыт (public), а для класса - закрыт (private). Больше, лично мне никаких различий обнаружить не удалось (ну хотя еще, при наследовании структуры от струтктуры наследование по-умолчанию открытое) item* list; - это определение переменной list, которая может хранить ссылку на экземпляр типа item, но пока еще она не инициализирована (то есть еще не указывает на какой-либо экземпляр типа item). Зовется переменная list указателем на тип item. -> - это оператор доступа к полю через ссылку (т.е. через значение указателя). То есть, если мы пишем
На третий твой вопрос ответ должен быть уже ясен по идее. И все-таки охота тебя за учебниками послать -------------------- "За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001) |
||||||
|
|||||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
i->prev->next=i i->next->prev=i -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| ТРЕТЬ |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 8.1.2006 Где: mind's gloomy corner Репутация: нет Всего: 1 |
Так... во-первых всем ОГРОМНОЕ спасибо!!!
Сегодня встретил одного умного человека, он мне тож пообъяснял... Теперь вот сам сел, решил сам свой список написать, причем не глядя на скрипт Смита, но что-то подобное... Вообчем, то все работает, только осталось всего несколько вопросиков... Точнее они появились.... 1. Самое интересное на текущий момент...
и
какова по сути разница между такими функциями? На сколько я понял, в первом варианте, если встретится например list = list->next, то у нас как бы "бегунок" переместится на следущую позицию списка (заранее извиняюсь, за самодеятельность типа "бегунок" и т.д., но просто я сейчас еменно так это воспринимаю)... А во втором случае по возращению в основную программу list останется таким как был... Или второй вариант вообще что-то другое из себя представляет? *Далее несколько вопросов скорее по поводу стиля, а не работы алгоритма в целом.* 2. Не становится ли односвязный список почти бесполезной схемой в силу своей односторонности? 3. Тов Смит дал пример как создавать замкнутые списки, т.е. кольца по сути. Это дает сразу классную возможность не отслеживать конец списка, что очень удобно (по сути проверка конца списка - проверка не попали ли мы в начало), но если список не замкнут, то как отследить его конец и не "выскочить" куда не надо? 4. Когда понял, что список замкнут, то подумал, может можно как-то избежать такого понятия, как базовый элемент. Правда мысль пошла каким-то странным путём... Получилось примерно следущее - "А можно ли сделать так, чтобы базовый элемент вообще обстрактным - т.е. после первого инсерта (см. скрипт из первого поста) у нас только появлялся первый элемент списка?" Как думаете, похоже на бред? 5. Так сказать "question 1 revisited"... Этакое перемещение "бегунка" считается допустимым в главной программе, или все-таки считается, что как мы создали первый элемент, так он первым и должен оставаться? Я очень извиняюсь, что вопросы звучат неразборчиво - просто я еще только начинаю понимать, что это такое, так что с терминологией у меня полный завал... И еще... Не могли бы вы дать пример программы, которая использовала бы списки не потому что та задание звучит, а потому что это удобно... |
||||
|
|||||
| SaDFromSpb |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 5.4.2006 Где: Санкт-Петербург Репутация: 3 Всего: 3 |
ТРЕТЬ,
На счет первого вопроса - весь код напиши. Нифига не понимаю. 2. Есть задачи, где элементы должны следовать строго в определенном порядке с первого до последнего. 3. Поле next у последнего элемента приравнивается к NULL (аналог нуля для указателя). При прохождении проверяем next на равенство NULL. 4. Как только список замыкается, то начальный элемент - это уже условность. У кольца начала и конца нет. Можно любой элемент за первый считать. 5. Опять не особо понял вопрос. При работе со списками как правило хранят указатель на первый элемент, чтобы его "не потерять", и используют хоть сотню "бегунков".
-------------------- "За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001) |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
Из глобального, например, списки активных и неактивных страниц для реализации управления памятью Linux еще, тот же стек - разновидность списка, а уж удобность и оправданность его применения не вызывает сомнения (разбор выражений, програмный стек и пр.) -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| ТРЕТЬ |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 8.1.2006 Где: mind's gloomy corner Репутация: нет Всего: 1 |
2 SaDFromSpb,
насчет первого вопроса... Вот 2 кода, отличаются только на * в аргументе...
Первый работает, это уже проверено... А что насчет второго варианта? Вызывать еготочно так же как первый? Будет ли вообще что-то меняться по выполнению такой процедуры? И вообще нет ли в нем ошибок? |
||||
|
|||||
| SaDFromSpb |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 5.4.2006 Где: Санкт-Петербург Репутация: 3 Всего: 3 |
Второй кусок вобще скомпилиться не должен, так как i не указатель, оператор -> для доступа к элементам использовать нельзя.
В первом примере мы на вход получаем адрес элемента, который нужно удалить (он хранится в перменной i). Во втором же к нам идет попадает копия элемента списка, подлежащего удалению. Здесь можно написать вот так:
И последнее: второй способ - это изврат =), так как чаще всего стоит задача удалить элемент по такому-то адресу или с таким-то содержанием (например, с определенным номером, если элементы нумеруются). Это сообщение отредактировал(а) SaDFromSpb - 22.6.2006, 12:31 -------------------- "За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001) |
|||
|
||||
| Rockie |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
ТРЕТЬ, можно почитать про спики на С++ здесь
-------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
| ТРЕТЬ |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 8.1.2006 Где: mind's gloomy corner Репутация: нет Всего: 1 |
Ладно... Впринципе есть еще один вопрос. но не думаю. что он уж очень важен...
Всем огромное спасибо!!! Вопрос закрываю... И открываю новый=) Что за тип данных такое "граф"? Насчет деревьев, стеков и иже с ними разобрался, а вот графа так и не встретил с нормальными комментариями... На сколько понял, это тоже что-то основанное на списках, или нет... Вообчем напишите. Очень будет сдорово, если найдется пример, хоть самый простой, но только чтобы можно было его сразу компилить - т.е. законченная прога была. Как правило, имея пример я уже могу разобраться. |
|||
|
||||
| ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 5 Всего: 29 |
Нельзя. В Си это просто набор переменных, объединённых одним именем, в Си++ - это синоним класса, отличающийся от него только тем, что доступ в классе по умолчанию protected, в структуре - public. Во всём остальном struct = class. |
|||
|
||||
| MAKCim |
|
||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
private Добавлено @ 21:03
не совсем по умолчанию при наследовании от структуры используется модификатор public
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||
|
|||||||
| BreakPointMAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
Читаем здесь:
-------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
|||
|
||||
| ТРЕТЬ |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 8.1.2006 Где: mind's gloomy corner Репутация: нет Всего: 1 |
Всмысле почитал, интересно конечно, но просто ОЧЕНЬ хочется самый простой пример на СИ++ (вплоть до простого объявления структуры) Эту уже последний вопрос, так что после его ответа буду помечать вопрос как решенный. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |