1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
Помогите разобраться с заданием пожалуйста. Вот по этому адресу (адрес указан в приложенном файле) лежит задание для нас. Там правда сказано на С++ без ООП, но преподаватель сказал, что на НАМ нужно на чистом Си. В файле на сайте все написанное и приведены три задания: двусвязный линейный список, ассоциативный массив и динамический массив. В Листинге который я выложу дальше я по идеи реализовал первое задание - линейный список - очень прошу специалистов посмотреть и высказать замечания, где может не правильно, где недодумано, где ещё чего. Вторая просьба - это пояснить, как основываясь на интерфейсе списков сделать динамический массив (это всё в здании написано просто коротко напоминаю) и что из себя таки представляет этот ассоциативный массив в примитивной реализации... не прошу написать, прошу объяснить как на основе сделанного прийти ко всему остальному. С уважением
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; }
Да и вообще, я бы посмотрел в сторону повторного использования функций... А то ты каждый раз делаешь "все внутри себя", а ведь если чуть-чуть подкорректировать, например, функцию cont_size, то можно будет значительно уменьшить размер кода за счет того, что те же самые действия не будут выполняться, например, в cont_add/cont_get/cont_replace, а будет вызываться cont_size...
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; }
Поясни пожалуйста по утечкам, я сделал как бы промежуточную переменную для структуры которую хочу пропихнуть в контейнер и только потом присваиваю ей указатель на память где хранится первый элемент контейнера приведенный к типу моей структуры (её вид ты наверное уже понял, поля некст, прев, дата и каунт)... я думал, что если объявил такую переменную, то прежде чем присвоить её ссылку на первый элемент должен выделить память - этого делать НЕ надо? не объяснишь почему? я думал всегда нужно выделять память...
А вот на счет schet++ я это делаю чтобы новая добавленная в конец структура получила свой порядковый номер, т.к. потом нужна будет функция возвращающая число структур в контейнере и я предполагал брать это число из последней структуры в контейнере... проще говоря я не понял комментария - число не сохранится в структуре или что? Если да, то получается, что когда я добавляю элемент и заношу в него данные, то и они не сохраняются (такая функция тоже есть выше в моем исходнике).
Если не трудно скажи, а в какой момент нужно память освобождать, даже если я пойму почему выделение памяти лишнее и уберу его, то все равно иногда оно встречается по необходимости - где её освободить?
Ну и наконец, тут чтобы более не нарушить правил скажу так... вот есть ещё два задания. Худо бедно, но это (линейный двусвязанный список) сделано, но требует серьёзной доработки (потому я все выспрашиваю, чтобы понять), а вот другие два задания мне не понятны просто - Динамический массив на основе этого списка (т.е. те же функции что и для списка, но теперь релизнуть на них надо динамический массив) - что это, что теперь делают функции, в чем особенность - не могу понять и всё... и наконец Ассоциативный массив, о чем он я примерно понял, интерфейс этого массива заключается в добавлении поля кей в каждую функцию, но сути я не понял, что за структура, то должно подаваться -сути не понимаю...