![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
Neonig |
![]()
Сообщение
#1
|
|||
Новичок ![]() Группа: Пользователи Сообщений: 25 Пол: Мужской Репутация: ![]() ![]() ![]() |
Помогите разобраться с заданием пожалуйста.
Вот по этому адресу (адрес указан в приложенном файле) лежит задание для нас. Там правда сказано на С++ без ООП, но преподаватель сказал, что на НАМ нужно на чистом Си. В файле на сайте все написанное и приведены три задания: двусвязный линейный список, ассоциативный массив и динамический массив. В Листинге который я выложу дальше я по идеи реализовал первое задание - линейный список - очень прошу специалистов посмотреть и высказать замечания, где может не правильно, где недодумано, где ещё чего. Вторая просьба - это пояснить, как основываясь на интерфейсе списков сделать динамический массив (это всё в здании написано просто коротко напоминаю) и что из себя таки представляет этот ассоциативный массив в примитивной реализации... не прошу написать, прошу объяснить как на основе сделанного прийти ко всему остальному. С уважением
Сообщение отредактировано: klem4 - 23.09.2007 8:06 Прикрепленные файлы ![]() |
|||
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Цитата Вот по этому адресу (адрес указан в приложенном файле) лежит задание для нас. А вот по этому адресу лежат правила форума, в которых присутствует и пункт 1.11 (который ты только что нарушил)... Если нужна помощь - присоединяй то что у тебя есть открытым текстом, а то как-то не очень хочется качать неизвестно что... |
Neonig |
![]()
Сообщение
#3
|
Новичок ![]() Группа: Пользователи Сообщений: 25 Пол: Мужской Репутация: ![]() ![]() ![]() |
Извини пожалуйста, сейчас скачаю и прилеплю....Только задание находится на вполне таком официальном сайте универа, что сразу видно по названию, можно я ссылку оставлю, а то перерисовывать сюда таблицы и всё такое будет сложно.... ccfit.nsu.ru/~den/CPP/Task1.doc
|
Neonig |
![]()
Сообщение
#4
|
Новичок ![]() Группа: Пользователи Сообщений: 25 Пол: Мужской Репутация: ![]() ![]() ![]() |
сам исходник.
Условия в посте выше, цель вопроса, в первом сообщении, надеюсь на вашу помощь Код #include <stdio.h> #include <stdlib.h> #include "LinkedList.h" void* cont_allocate() { static AL *cont_v; void* from_al_to_void; cont_v = (AL*)malloc(sizeof(AL)); from_al_to_void = &cont_v; cont_v->count = count; count++; cont_v->data = NULL; cont_v->Prev = NULL; cont_v->Next = NULL; return from_al_to_void; } void cont_add(void* cont, void* data) { AL *cont_insert; AL *from_cont_to_alstruct; int schet = 0; from_cont_to_alstruct = (AL*)malloc(sizeof(AL)); cont_insert = (AL*)malloc(sizeof(AL)); from_cont_to_alstruct = (AL*) cont; while(from_cont_to_alstruct->Next) { from_cont_to_alstruct = from_cont_to_alstruct->Next; schet++; } from_cont_to_alstruct->Next = cont_insert; cont_insert->Prev = from_cont_to_alstruct; cont_insert->data = data; cont_insert->count = schet++; cont_insert->Next = NULL; } void cont_insert(void* cont, int pos, void* data) { int shet = 0; AL *from_cont_to_alstruct; AL *pos_insert; from_cont_to_alstruct = (AL*)malloc(sizeof(AL)); pos_insert = (AL*)malloc(sizeof(AL)); from_cont_to_alstruct = (AL*)cont; while(((from_cont_to_alstruct->count)!= pos) || (from_cont_to_alstruct->Next)) { from_cont_to_alstruct = from_cont_to_alstruct->Next; shet++; } pos_insert->Next = from_cont_to_alstruct->Next; from_cont_to_alstruct->Next = pos_insert; pos_insert->Prev = from_cont_to_alstruct; pos_insert->data = data; } int cont_size(void* cont) { AL *from_cont_to_alstruct; int razm_cont = 0; from_cont_to_alstruct = (AL*)malloc(sizeof(AL)); from_cont_to_alstruct = (AL*)cont; while(from_cont_to_alstruct->Next) { from_cont_to_alstruct = from_cont_to_alstruct->Next; razm_cont++; } return razm_cont; } void* cont_get(void* cont, int pos) { AL *from_cont_to_alstruct; void* insert_data; from_cont_to_alstruct = (AL*)malloc(sizeof(AL)); from_cont_to_alstruct = (AL*)cont; while(((from_cont_to_alstruct->count)!=pos) || (from_cont_to_alstruct->Next)) { from_cont_to_alstruct = from_cont_to_alstruct->Next; } insert_data = from_cont_to_alstruct->data; return insert_data; } void* cont_replace(void* cont, int pos, void* data) { AL *from_cont_to_alstruct; void *lost_data; from_cont_to_alstruct = (AL*)malloc(sizeof(AL)); while ( ((from_cont_to_alstruct->count)!=pos) || (from_cont_to_alstruct->Next)) { from_cont_to_alstruct = from_cont_to_alstruct->Next; } lost_data = from_cont_to_alstruct->data; from_cont_to_alstruct->data = data; return lost_data; } void* cont_remove(void* cont, int pos) { AL *from_cont_to_alstruct; AL *vrem_xran; void *lost_data; from_cont_to_alstruct = (AL*)malloc(sizeof(AL)); vrem_xran = (AL*)malloc(sizeof(AL)); from_cont_to_alstruct = (AL*)cont; while ( ((from_cont_to_alstruct->count)!=pos) || (from_cont_to_alstruct->Next)) { from_cont_to_alstruct = from_cont_to_alstruct->Next; } lost_data = from_cont_to_alstruct->data; from_cont_to_alstruct->Prev->Next = from_cont_to_alstruct->Next; from_cont_to_alstruct->Next->Prev = from_cont_to_alstruct->Prev; from_cont_to_alstruct->Next = NULL; from_cont_to_alstruct->Prev = NULL; free(from_cont_to_alstruct); return vrem_xran; } void cont_foreach(void* cont/*, cont_handle*/) { AL *from_cont_to_alstruct; from_cont_to_alstruct = (AL*)malloc(sizeof(AL)); from_cont_to_alstruct = (AL*)cont; while(from_cont_to_alstruct->Next) { // cont_handle(from_cont_to_alstruct); from_cont_to_alstruct = from_cont_to_alstruct->Next; } } void cont_foreach_reverse(void* cont/*, cont_handle*/) { AL *from_cont_to_alstruct; from_cont_to_alstruct = (AL*)malloc(sizeof(AL)); from_cont_to_alstruct = (AL*)cont; while(from_cont_to_alstruct->Next) { from_cont_to_alstruct = from_cont_to_alstruct->Next; } while(from_cont_to_alstruct->Prev) { // cont_handle(from_cont_to_alstructr); from_cont_to_alstruct = from_cont_to_alstruct->Prev; } } void cont_release(void* cont) { AL *from_cont_to_alstruct; from_cont_to_alstruct = (AL*)malloc(sizeof(AL)); from_cont_to_alstruct = (AL*)cont; while(from_cont_to_alstruct->Next) { from_cont_to_alstruct = from_cont_to_alstruct->Next; } while(from_cont_to_alstruct->Prev) { from_cont_to_alstruct = from_cont_to_alstruct->Prev; free(from_cont_to_alstruct); } } Сообщение отредактировано: Neonig - 22.09.2007 22:29 |
volvo |
![]()
Сообщение
#5
|
Гость ![]() |
У тебя в коде есть утечки памяти, или мне кажется? Вот это, например, что такое:
int cont_size(void* cont) ? Второе... Вот тут: void cont_add(void* cont, void* data) Да и вообще, я бы посмотрел в сторону повторного использования функций... А то ты каждый раз делаешь "все внутри себя", а ведь если чуть-чуть подкорректировать, например, функцию cont_size, то можно будет значительно уменьшить размер кода за счет того, что те же самые действия не будут выполняться, например, в cont_add/cont_get/cont_replace, а будет вызываться cont_size... |
Neonig |
![]()
Сообщение
#6
|
Новичок ![]() Группа: Пользователи Сообщений: 25 Пол: Мужской Репутация: ![]() ![]() ![]() |
[quote name='volvo' date='23.09.2007 10:42' post='109904']
У тебя в коде есть утечки памяти, или мне кажется? Вот это, например, что такое: int cont_size(void* cont) ? Второе... Вот тут: void cont_add(void* cont, void* data) Поясни пожалуйста по утечкам, я сделал как бы промежуточную переменную для структуры которую хочу пропихнуть в контейнер и только потом присваиваю ей указатель на память где хранится первый элемент контейнера приведенный к типу моей структуры (её вид ты наверное уже понял, поля некст, прев, дата и каунт)... я думал, что если объявил такую переменную, то прежде чем присвоить её ссылку на первый элемент должен выделить память - этого делать НЕ надо? не объяснишь почему? я думал всегда нужно выделять память... А вот на счет schet++ я это делаю чтобы новая добавленная в конец структура получила свой порядковый номер, т.к. потом нужна будет функция возвращающая число структур в контейнере и я предполагал брать это число из последней структуры в контейнере... проще говоря я не понял комментария - число не сохранится в структуре или что? Если да, то получается, что когда я добавляю элемент и заношу в него данные, то и они не сохраняются (такая функция тоже есть выше в моем исходнике). Если не трудно скажи, а в какой момент нужно память освобождать, даже если я пойму почему выделение памяти лишнее и уберу его, то все равно иногда оно встречается по необходимости - где её освободить? Ну и наконец, тут чтобы более не нарушить правил скажу так... вот есть ещё два задания. Худо бедно, но это (линейный двусвязанный список) сделано, но требует серьёзной доработки (потому я все выспрашиваю, чтобы понять), а вот другие два задания мне не понятны просто - Динамический массив на основе этого списка (т.е. те же функции что и для списка, но теперь релизнуть на них надо динамический массив) - что это, что теперь делают функции, в чем особенность - не могу понять и всё... и наконец Ассоциативный массив, о чем он я примерно понял, интерфейс этого массива заключается в добавлении поля кей в каждую функцию, но сути я не понял, что за структура, то должно подаваться -сути не понимаю... |
volvo |
![]()
Сообщение
#7
|
Гость ![]() |
Цитата я думал всегда нужно выделять память... Смотри:void cont_add(void* cont, void* data) Цитата а в какой момент нужно память освобождать Когда будешь удалять элемент контейнера, в частности в функции cont_remove (free там, кстати, у тебя уже есть). |
Neonig |
![]()
Сообщение
#8
|
Новичок ![]() Группа: Пользователи Сообщений: 25 Пол: Мужской Репутация: ![]() ![]() ![]() |
Ясно, значит переделаю остальные моменты под этот стиль... остался тогда толкьо вопрос касательно Динамического массива на оснвое этого же интерфейса и ассоциаивный массив..прошу помочь с теорией, и объяснить что это такое. Первое - какя паралель между динам массивом и списком, второе - что вообще сделать чтобы похожий интерейс работал с ассоциативным массивом (да и что он тако есть в целом)
|
volvo |
![]()
Сообщение
#9
|
Гость ![]() |
Я не знаю, чего ждут от тебя в этом задании (какой смысл переписывать вручную уже готовые и намного более функциональные std::list, std::vector и std::map - я не понимаю), но могу привести основные различия между std::list и std::vector:
Цитата(С++ STL Tutorial) Список (std::list) отличается от динамического массива (std::vector) следующим: - список не предусматривает прямого доступа. Если Вам нужно получить доступ к 5-му элементу списка, Вы обязаны перед этим пройти по предшествующим ему 4-м элементам. Таким образом, доступ к элементу в списке замедляется; - вставка и удаление элементов производятся быстро в любой позиции, а не только с концов списка. Вы всегда можете удалить или добавить элемент за константное время, поскольку другие элементы при этом не должны перемещаться. Изменяются только несколько внутренних указателей. Теперь о массиве: Цитата(С++ STL Tutorial) - массив - это упорядоченная коллекция. К элементам массива возможен прямой доступ (random access). То есть, Вы можете обратиться к любому элементу массива за константное время; - массив обеспечивает наилучшее быстродействие при добавлении/удалении элементов с конца. При работе с началом/серединой массива быстродействие ухудшается. Это происходит потому, что следующие за удаленным/добавленным элементом должны быть сдвинуты в другую позицию. Если надо - могу написать, что представляет из себя map (ассоциативный массив) с точки зрения STL... |
Neonig |
![]()
Сообщение
#10
|
Новичок ![]() Группа: Пользователи Сообщений: 25 Пол: Мужской Репутация: ![]() ![]() ![]() |
Я не знаю, чего ждут от тебя в этом задании (какой смысл переписывать вручную уже готовые и намного более функциональные std::list, std::vector и std::map - я не понимаю), но могу привести основные различия между std::list и std::vector: Теперь о массиве: Если надо - могу написать, что представляет из себя map (ассоциативный массив) с точки зрения STL... Я вот чего понять не могу, а как мне сейчас используя все те же функции листа, сделать из него вектор..как реализовать этот проивольныйд оступ, ведь унтри всеравно придется бегать по всем структурам - в чем отличии исходного кода получается? . На счет мапа - буду очень благодарен, если пояснишь... |
volvo |
![]()
Сообщение
#11
|
Гость ![]() |
Цитата ведь унтри всеравно придется бегать по всем структурам если сделать в cont_allocate выделение массива, скажем, под 20-30 указателей на структуры, и в cont_get не бегать по предыдущим элементам, а сразу отправляться по соответствующему указателю - то не придется...А насчет map - посмотри вот тут (по-русски) или тут: SGI: map (по-английски) |
Neonig |
![]()
Сообщение
#12
|
Новичок ![]() Группа: Пользователи Сообщений: 25 Пол: Мужской Репутация: ![]() ![]() ![]() |
если сделать в cont_allocate выделение массива, скажем, под 20-30 указателей на структуры, и в cont_get не бегать по предыдущим элементам, а сразу отправляться по соответствующему указателю - то не придется... А насчет map - посмотри вот тут (по-русски) или тут: SGI: map (по-английски) Т.е. достаточно разговор с последовательности структур перевести на массив структур и всё? А как сразу переходить по указателю - мне же дается позиция, как мне не проходя все подрядд сразу в этой позиции оказаться...? |
volvo |
![]()
Сообщение
#13
|
Гость ![]() |
Цитата как мне не проходя все подрядд сразу в этой позиции оказаться...? AL **array, *current; ... но я же не обращался ни к array[0], ни к array[1]. Сообщение отредактировано: volvo - 24.09.2007 16:12 |
Neonig |
![]()
Сообщение
#14
|
Новичок ![]() Группа: Пользователи Сообщений: 25 Пол: Мужской Репутация: ![]() ![]() ![]() |
Вот глнянь на общие принципы того ,как я это понял ...
void* cont_allocatet()вот кая я понял, если не трудно скажи где не прав, где не допонял....? Ещё такой вопрос, препод сказал, что может получиться дескать нет места добавить жлемент и типо нужно расширить память и скопировать старый массив в новый - большой... а как этот лимит памяти проверять? |
Neonig |
![]()
Сообщение
#15
|
Новичок ![]() Группа: Пользователи Сообщений: 25 Пол: Мужской Репутация: ![]() ![]() ![]() |
Вот, я сделал ещё динамический массив... посмотрите пожалуйста....
И ещё одна такая прозьба. Пример которы я скинул по двусвязанному списку - почему то не работает, функции вызываю старнные ошибки при выходе которых компилятор показывает мне исходники каких то хейдеров и т.п... в чем может быть причина... #ifndef CONTAINER_H |
volvo |
![]()
Сообщение
#16
|
Гость ![]() |
Цитата Пример которы я скинул по двусвязанному списку - почему то не работает А ты пример как раз ни один не привел, только реализацию самих функций... Поэтому и ответов не получаешь. Ну не хочется мне выдумывать пример использования, задание, прости, дали тебе - вот и придумывай. А если что не получается - то давай не обрывки кода, а ВЕСЬ код... Включая и тестовую программу. Ибо у меня то, что ты привел не имеет шанса даже откомпилироваться - main() не присутствует... |
Neonig |
![]()
Сообщение
#17
|
Новичок ![]() Группа: Пользователи Сообщений: 25 Пол: Мужской Репутация: ![]() ![]() ![]() |
Понял тебя...извини, что - то реально затупил с постановкой вопроса.... првожу все файлы... Смысл такой, я создаю контейнер и добавляю в него 10 элементов, где данные - это прядковый номер каждого. Эти две функции вроде пашут, следующая - это прокрутка всего контейнера с применеием некой функции к нему - я хотел, чтобы при прокрутке принтэфились эти числа, что я заносил...но ничего не происходит . в лучем случае программа запускается демонстрирует пустой экран и закрывается -в худшев уходит в ссылку на ошибку в какоам - то закрытом сишном файле....
Компилятор Visual Studio 2008 Beta 2, но и на VS 2005 она не блещет работоспособностью... Array List.H: #ifndef ARRAYLIST_H Container.h: #ifndef CONTAINER_H LinkedList.h: #ifndef LINKEDLIST_H Arraylist.cpp #include <stdio.h> LinkedList.cpp: #include <stdio.h> Test.cpp: #include <stdio.h>Выложил все сразу, но на этот раз речь идет о LinkedList. Прошу помочь, время сдачи пджимает, а знания буксуют...стараюсь как могу, но без компетентной помощи загнусь.... |
volvo |
![]()
Сообщение
#18
|
Гость ![]() |
"Ну-с, приступим..." (С) "Напарник"
Если ты вот тут: int main()хотел распечатывать текущее число элементов в контейнере, то ты ошибся - здесь будет печататься count только для первого элемента контейнера, а это - всегда 0... Это первое... Второе... Я тебе еще в 5-ом посте написал, что такая конструкция: void* cont_replace(void* cont, int pos, void* data)... приводит к утечким памяти. Зачем ты опять так делаешь malloc? Я же в седьмом посте написал, что надо сделать... Так делай это, а не создавай утечки... Теперь - о том, почему у тебя Цитата в лучем случае программа запускается демонстрирует пустой экран и закрывается -в худшев уходит в ссылку на ошибку в какоам - то закрытом сишном файле.... - а что ты хотел, мой компилятор говорит, что стек разрушается.Я поправил файлы, у меня (GCC) они компилируются и работают, но проверял только ДО cont_foreach() включительно!!!, до cont_release() еще не дошел... Посмотри, что я изменил для того, чтобы работала передаваемая в cont_foreach() функция print_data() ... Прикрепленные файлы ![]() |
Neonig |
![]()
Сообщение
#19
|
Новичок ![]() Группа: Пользователи Сообщений: 25 Пол: Мужской Репутация: ![]() ![]() ![]() |
Сэнкс что взялся мне помочь, надеялся что следующим впросом разберём Аррай (ну если вдруг я и его косячно сделал), но не тут то было при компиляции линкдлист выдает две ошибки
1>Test.obj : error LNK2005: "struct ArrayList * cont" (?cont@@3PAUArrayList@@A) already defined in LinkedList.obj 1>C:\Users\VBproffi\Documents\Visual Studio 2008\Projects\WindowsApplication3\kont\Debug\kont.exe : fatal error LNK1169: one or more multiply defined symbols found 1>Build log was saved at "file://c:\Users\VBproffi\Documents\Visual Studio 2008\Projects\WindowsApplication3\kont\kont\Debug\BuildLog.htm" Т.к ни на какие строчки не показывает я вообще без понятия что делать и что исправлять.... |
volvo |
![]()
Сообщение
#20
|
Гость ![]() |
Я предупредил, что у меня не MSVS, из за таких вот глюков я ее и не люблю (там где нормальный компилятор справляется "на ура", VS приходится все разжевывать)...
Проблема - в том, что переменная cont описывается в header файле, который подключается более чем в одном *.C, из-за чего линкер считает это повторным объявлением... Сделай переменную статической: #ifndef LINKEDLIST_Hпо идее это должно решить проблему для VS, поскольку на count у тебя линкер не ругается. Сообщение отредактировано: volvo - 30.09.2007 12:01 |
![]() ![]() |
![]() |
Текстовая версия | 17.07.2025 14:55 |