Помогите разобраться с заданием пожалуйста. Вот по этому адресу (адрес указан в приложенном файле) лежит задание для нас. Там правда сказано на С++ без ООП, но преподаватель сказал, что на НАМ нужно на чистом Си. В файле на сайте все написанное и приведены три задания: двусвязный линейный список, ассоциативный массив и динамический массив. В Листинге который я выложу дальше я по идеи реализовал первое задание - линейный список - очень прошу специалистов посмотреть и высказать замечания, где может не правильно, где недодумано, где ещё чего. Вторая просьба - это пояснить, как основываясь на интерфейсе списков сделать динамический массив (это всё в здании написано просто коротко напоминаю) и что из себя таки представляет этот ассоциативный массив в примитивной реализации... не прошу написать, прошу объяснить как на основе сделанного прийти ко всему остальному. С уважением
!
Второй раз говорю, прочитай правила форума
volvo
22.09.2007 23:39
Цитата
Вот по этому адресу (адрес указан в приложенном файле) лежит задание для нас.
А вот по этому адресу лежат правила форума, в которых присутствует и пункт 1.11 (который ты только что нарушил)... Если нужна помощь - присоединяй то что у тебя есть открытым текстом, а то как-то не очень хочется качать неизвестно что...
Neonig
23.09.2007 0:38
Извини пожалуйста, сейчас скачаю и прилеплю....Только задание находится на вполне таком официальном сайте универа, что сразу видно по названию, можно я ссылку оставлю, а то перерисовывать сюда таблицы и всё такое будет сложно.... ccfit.nsu.ru/~den/CPP/Task1.doc
Neonig
23.09.2007 2:25
сам исходник. Условия в посте выше, цель вопроса, в первом сообщении, надеюсь на вашу помощь
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...
Neonig
24.09.2007 0:24
[quote name='volvo' date='23.09.2007 10:42' post='109904'] У тебя в коде есть утечки памяти, или мне кажется? Вот это, например, что такое:
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; // ... и тут же благополучно об этом забыл?
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++ я это делаю чтобы новая добавленная в конец структура получила свой порядковый номер, т.к. потом нужна будет функция возвращающая число структур в контейнере и я предполагал брать это число из последней структуры в контейнере... проще говоря я не понял комментария - число не сохранится в структуре или что? Если да, то получается, что когда я добавляю элемент и заношу в него данные, то и они не сохраняются (такая функция тоже есть выше в моем исходнике).
Если не трудно скажи, а в какой момент нужно память освобождать, даже если я пойму почему выделение памяти лишнее и уберу его, то все равно иногда оно встречается по необходимости - где её освободить?
Ну и наконец, тут чтобы более не нарушить правил скажу так... вот есть ещё два задания. Худо бедно, но это (линейный двусвязанный список) сделано, но требует серьёзной доработки (потому я все выспрашиваю, чтобы понять), а вот другие два задания мне не понятны просто - Динамический массив на основе этого списка (т.е. те же функции что и для списка, но теперь релизнуть на них надо динамический массив) - что это, что теперь делают функции, в чем особенность - не могу понять и всё... и наконец Ассоциативный массив, о чем он я примерно понял, интерфейс этого массива заключается в добавлении поля кей в каждую функцию, но сути я не понял, что за структура, то должно подаваться -сути не понимаю...
volvo
24.09.2007 0:47
Цитата
я думал всегда нужно выделять память...
Смотри:
void cont_add(void* cont, void* data) { AL *cont_insert; AL *from_cont_to_alstruct; int schet = 0;
cont_insert = (AL*)malloc(sizeof(AL)); // Это ты выделил память под новый элемент
// Для добавления очередного элемента к контейнеру все, что тебе нужно - // это найти такой элемент, поле Next которого равно NULL ... for(from_cont_to_alstruct = (AL*)cont; // начинаем искать с начала контейнера from_cont_to_alstruct->Next; // пока поле 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; // Вот тут достаточно просто присвоить полю count значение schet: // увеличивать schet _после_ запоминания совсем не обязательно... cont_insert->Next = NULL; }
Цитата
а в какой момент нужно память освобождать
Когда будешь удалять элемент контейнера, в частности в функции cont_remove (free там, кстати, у тебя уже есть).
Neonig
24.09.2007 2:26
Ясно, значит переделаю остальные моменты под этот стиль... остался тогда толкьо вопрос касательно Динамического массива на оснвое этого же интерфейса и ассоциаивный массив..прошу помочь с теорией, и объяснить что это такое. Первое - какя паралель между динам массивом и списком, второе - что вообще сделать чтобы похожий интерейс работал с ассоциативным массивом (да и что он тако есть в целом)
volvo
24.09.2007 3:30
Я не знаю, чего ждут от тебя в этом задании (какой смысл переписывать вручную уже готовые и намного более функциональные 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
24.09.2007 18:50
Цитата(volvo @ 23.09.2007 23:30)
Я не знаю, чего ждут от тебя в этом задании (какой смысл переписывать вручную уже готовые и намного более функциональные std::list, std::vector и std::map - я не понимаю), но могу привести основные различия между std::list и std::vector: Теперь о массиве: Если надо - могу написать, что представляет из себя map (ассоциативный массив) с точки зрения STL...
Я вот чего понять не могу, а как мне сейчас используя все те же функции листа, сделать из него вектор..как реализовать этот проивольныйд оступ, ведь унтри всеравно придется бегать по всем структурам - в чем отличии исходного кода получается? .
На счет мапа - буду очень благодарен, если пояснишь...
volvo
24.09.2007 19:15
Цитата
ведь унтри всеравно придется бегать по всем структурам
если сделать в cont_allocate выделение массива, скажем, под 20-30 указателей на структуры, и в cont_get не бегать по предыдущим элементам, а сразу отправляться по соответствующему указателю - то не придется...
А насчет map - посмотри вот тут (по-русски) или тут: SGI: map (по-английски)
Neonig
24.09.2007 19:39
Цитата(volvo @ 24.09.2007 15:15)
если сделать в cont_allocate выделение массива, скажем, под 20-30 указателей на структуры, и в cont_get не бегать по предыдущим элементам, а сразу отправляться по соответствующему указателю - то не придется...
А насчет map - посмотри вот тут (по-русски) или тут: SGI: map (по-английски)
Т.е. достаточно разговор с последовательности структур перевести на массив структур и всё? А как сразу переходить по указателю - мне же дается позиция, как мне не проходя все подрядд сразу в этой позиции оказаться...?
volvo
24.09.2007 20:11
Цитата
как мне не проходя все подрядд сразу в этой позиции оказаться...?
AL **array, *current; array = (AL **)malloc(20 * sizeof(AL*));
// ну, тут заполнение массива array
current = array[3]; // <--- Как ты думаешь, что будет содержаться в current? Не array[3] ? ...
... но я же не обращался ни к array[0], ни к array[1].
Neonig
24.09.2007 20:12
Вот глнянь на общие принципы того ,как я это понял ...
void* cont_allocatet() { void** cont_array; //массив указателей AR *first_struct_array; // структура на которую я буду ссылаться в каждой ячейке
first_struct_array = (AR*)malloc(sizeof(AR)); // выделяю память под эту структуру, и заполняю /* только вот с заполнением не ясно, а на что теперь ссылается некст и прев и как это оформить - ходить по ячейкам массива или выискивать адрес следующей структуры в общем пошел для меня темный лес... */
cont_array=(void**) malloc(sizeof(AR)*10); // выделяю память для массива нашего
cont_array[0] = &first_struct_array; // первой ячейке (она же вроде ссылается на указатель) // передаю адрес этой структуры....
return cont_array[0]; }
вот кая я понял, если не трудно скажи где не прав, где не допонял....? Ещё такой вопрос, препод сказал, что может получиться дескать нет места добавить жлемент и типо нужно расширить память и скопировать старый массив в новый - большой... а как этот лимит памяти проверять?
Neonig
29.09.2007 0:45
Вот, я сделал ещё динамический массив... посмотрите пожалуйста....
И ещё одна такая прозьба. Пример которы я скинул по двусвязанному списку - почему то не работает, функции вызываю старнные ошибки при выходе которых компилятор показывает мне исходники каких то хейдеров и т.п... в чем может быть причина...
#ifndef CONTAINER_H #define CONTAINER_H
// #define ARRAY #define LIST
typedef void(*cont_handle)(void* data);
// Создает пустой контейнер !!!*** void* cont_allocate(); // Удаляет контейнер!!!*** void cont_release(void* cont); // Добавляет элемент в конец контейнера !!!*** void cont_add(void* cont, void* data); // Вставляет злемент в позицию pos !!!*** void cont_insert(void* cont, int pos, void* data); // Возвращает размер контейнера !!!*** int cont_size(void* cont); // Возвращает данные в позиции pos !!!*** void* cont_get(void* cont, int pos); // Заменяет данные в позиции pos. Возвращает старые данные.!!!*** void* cont_replace(void* cont, int pos, void* data); // Удаляет данные из позиции pos. Возвращает удаленные данные. void* cont_remove(void* cont, int pos); // Перебирает все элементы контейнера по порядку. !!!*** void cont_foreach(void* cont/*, cont_handle proc*/); // Перебирает все элементы контейнера в обратном порядке.!!!*** void cont_foreach_reverse(void* cont, cont_handle proc);
#endif
#ifndef ARRAYLIST_H #define AARAYLIST_H
typedef struct ArrayListt{ void** data; int count_size; } AR;
void cont_insert(void* cont, int pos, void* data) { AR *vrem_cont_array; void **vrem_mass; int count_one = 0; int count_two = 0; int count_three = 0; int mass_size = 0;
void* cont_remove(void* cont, int pos) { AR *vrem_cont_array; void* vrem_data; void** vrem_mass; int count_one = 0; int count_two = 0; int count_three = 0; int vrem = 0; int mass_size = 0;
Пример которы я скинул по двусвязанному списку - почему то не работает
А ты пример как раз ни один не привел, только реализацию самих функций... Поэтому и ответов не получаешь. Ну не хочется мне выдумывать пример использования, задание, прости, дали тебе - вот и придумывай. А если что не получается - то давай не обрывки кода, а ВЕСЬ код... Включая и тестовую программу. Ибо у меня то, что ты привел не имеет шанса даже откомпилироваться - main() не присутствует...
Neonig
29.09.2007 21:07
Понял тебя...извини, что - то реально затупил с постановкой вопроса.... првожу все файлы... Смысл такой, я создаю контейнер и добавляю в него 10 элементов, где данные - это прядковый номер каждого. Эти две функции вроде пашут, следующая - это прокрутка всего контейнера с применеием некой функции к нему - я хотел, чтобы при прокрутке принтэфились эти числа, что я заносил...но ничего не происходит . в лучем случае программа запускается демонстрирует пустой экран и закрывается -в худшев уходит в ссылку на ошибку в какоам - то закрытом сишном файле....
Компилятор Visual Studio 2008 Beta 2, но и на VS 2005 она не блещет работоспособностью...
Array List.H:
#ifndef ARRAYLIST_H #define AARAYLIST_H
typedef struct ArrayListt{ void** data; int count_size; } AR;
AR *cont;
#endif
Container.h:
#ifndef CONTAINER_H #define CONTAINER_H
// #define ARRAY #define LIST
typedef void(*cont_handle)(void* data);
// Создает пустой контейнер !!!*** void* cont_allocate(); // Удаляет контейнер!!!*** void cont_release(void* cont); // Добавляет элемент в конец контейнера !!!*** void cont_add(void* cont, void* data); // Вставляет злемент в позицию pos !!!*** void cont_insert(void* cont, int pos, void* data); // Возвращает размер контейнера !!!*** int cont_size(void* cont); // Возвращает данные в позиции pos !!!*** void* cont_get(void* cont, int pos); // Заменяет данные в позиции pos. Возвращает старые данные.!!!*** void* cont_replace(void* cont, int pos, void* data); // Удаляет данные из позиции pos. Возвращает удаленные данные. void* cont_remove(void* cont, int pos); // Перебирает все элементы контейнера по порядку. !!!*** void cont_foreach(void* cont/*, cont_handle proc*/); // Перебирает все элементы контейнера в обратном порядке.!!!*** void cont_foreach_reverse(void* cont, cont_handle proc);
void cont_insert(void* cont, int pos, void* data) { AR *vrem_cont_array; void **vrem_mass; int count_one = 0; int count_two = 0; int count_three = 0; int mass_size = 0;
void* cont_remove(void* cont, int pos) { AR *vrem_cont_array; void* vrem_data; void** vrem_mass; int count_one = 0; int count_two = 0; int count_three = 0; int vrem = 0; int mass_size = 0;
Выложил все сразу, но на этот раз речь идет о LinkedList. Прошу помочь, время сдачи пджимает, а знания буксуют...стараюсь как могу, но без компетентной помощи загнусь....
volvo
30.09.2007 4:16
"Ну-с, приступим..." (С) "Напарник"
Если ты вот тут:
int main() for (count_two = 0; count_two <= 10; count_two +=1) { cont_add(cont, &count[count_two]); printf("%d", ((AL*)cont)->count); // <--- у меня действительно компилируется только так... }
хотел распечатывать текущее число элементов в контейнере, то ты ошибся - здесь будет печататься count только для первого элемента контейнера, а это - всегда 0...
Это первое... Второе... Я тебе еще в 5-ом посте написал, что такая конструкция:
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)); // <--- Вот тут ...
... приводит к утечким памяти. Зачем ты опять так делаешь malloc? Я же в седьмом посте написал, что надо сделать... Так делай это, а не создавай утечки...
Теперь - о том, почему у тебя
Цитата
в лучем случае программа запускается демонстрирует пустой экран и закрывается -в худшев уходит в ссылку на ошибку в какоам - то закрытом сишном файле....
- а что ты хотел, мой компилятор говорит, что стек разрушается.
Я поправил файлы, у меня (GCC) они компилируются и работают, но проверял только ДО cont_foreach() включительно!!!, до cont_release() еще не дошел... Посмотри, что я изменил для того, чтобы работала передаваемая в cont_foreach() функция print_data() ...
Neonig
30.09.2007 15:44
Сэнкс что взялся мне помочь, надеялся что следующим впросом разберём Аррай (ну если вдруг я и его косячно сделал), но не тут то было при компиляции линкдлист выдает две ошибки
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
30.09.2007 16:01
Я предупредил, что у меня не MSVS, из за таких вот глюков я ее и не люблю (там где нормальный компилятор справляется "на ура", VS приходится все разжевывать)...
Проблема - в том, что переменная cont описывается в header файле, который подключается более чем в одном *.C, из-за чего линкер считает это повторным объявлением... Сделай переменную статической:
по идее это должно решить проблему для VS, поскольку на count у тебя линкер не ругается.
Neonig
4.10.2007 22:13
Посмотрел, работает вывод последовательностей, но вот что интересно, как я понялсначало мы в счтроку выводим значение count всех этих элементов, так? он почему то печатает все нули... т.е. получается, что все манипуляции с полем count что я проводил как бы не имеют следа?
Добавлено через 14 мин. Заметил, что более ничего не работает вставка например в таком виде
сначало мы в счтроку выводим значение count всех этих элементов, так? он почему то печатает все нули...
Ты посты читать будешь? Я же написал в начале 19-го поста, почему это происходит...
Добавлено через 2 мин.
Цитата
Заметил, что более ничего не работает
Исправь все функции - будет работать ... Я исправил только то, что показал. Не буду я делать чужую работу.
Neonig
4.10.2007 23:15
Извини, все читал, просто забыл, суть понял... я задаю вопрсоыы когда уже реальн не втыкаю что происходит - как сейчас например, соверешнно не могу понять почему прямой просмотр работает, а обратный начинается с цифры на едницу больше чем размер контейнера, доходит до нуля и вылетает с ошибкой... более того я сделал обратный (на время) прямым обходом, он обходит с этим же косяком с +1 к размеру и опять вылетает с ошибкой показывая на ассемблер....
Neonig
12.10.2007 1:32
Снова дравствуйте. Можно как нибудь исходник ориентированный видимо на C++ переделать на C обычный в частности избавиться от NEW всяческих?
HashIndex getHashIndex(void *key){ // хэш-функция int _key = (int) key; HashIndex index = _key % HashTableSize; return index; }
Item *search(void *cont, void *key){ // функция поиска int i = 0; int size = cont_size(cont); void *item = NULL; for (i = 0; i < size; i++){ item = cont_get(cont, i); if (((Item *)item)->key == key) break; } if (i == size) return NULL; else return (Item *)item; }
int getPos(void *cont, void *key){ // функция поиска позиции по ключу (нужна для функции удаления) int pos = 0; int size = 0; Item *item = NULL; size = cont_size(cont); for (pos = 0; pos < size; pos++){ item = (Item *) cont_get(cont, pos); if (item->key == key) break; } return pos; }
void* assoc_allocate(){ Map *map = new Map; map->size = 0; for (int i = 0; i < HashTableSize; i++) map->HashTable[i] = cont_allocate(); return map; } void assoc_release(void* cont){ Map *map = (Map *) cont; for (int i = 0; i < HashTableSize; i++) cont_release(map->HashTable[i]); delete map; } void* assoc_put(void* cont, void* key, void* data){ Map *map = (Map *) cont; HashIndex index = getHashIndex(key); void *oldData = NULL; Item *item = NULL; Item *newItem = NULL; item = search(map->HashTable[index], key); if (item){ // если нашли такое - просто меняем значение oldData = item->data; item->data = data; return oldData; } newItem = new Item; newItem->data = data; newItem->key = key; cont_add(map->HashTable[index], newItem); map->size++; return oldData; } int assoc_size(void* cont){ return ((Map *)cont)->size; } void* assoc_get(void* cont, void* key){ Map *map = (Map *) cont; HashIndex index = getHashIndex(key); void *data = NULL; Item *item = NULL; item = search(map->HashTable[index], key); if (item) data = item->data; return data; } void* assoc_get_key(void* cont, int pos){ // пробегает контейнеры, исчерпывая переменную pos Map *map = (Map *) cont; if (pos > map->size-1 || !map->size){error(); return NULL;} void *key = NULL; int i = 0; Item *item = NULL; while (pos > 0 && i < HashTableSize){ pos -= cont_size(map->HashTable[i++]); } if (pos <= 0){ if (pos) i--; if (pos) pos += cont_size(map->HashTable[i]); while (!cont_size(map->HashTable[i])) i++; item = (Item *) cont_get(map->HashTable[i], pos); if (item) key = item->key; } return key; } void* assoc_get_value(void* cont, int pos){ // то же самое : ) Map *map = (Map *) cont; if (pos > map->size-1 || !map->size){error(); return NULL;} void *data = NULL; int i = 0; Item *item = NULL; while (pos > 0 && i < HashTableSize){ pos -= cont_size(map->HashTable[i++]); } if (pos <= 0){ if (pos) i--; if (pos) pos += cont_size(map->HashTable[i]); while (!cont_size(map->HashTable[i])) i++; item = (Item *) cont_get(map->HashTable[i], pos); if (item) data = item->data; } return data; } void* assoc_remove(void* cont, void* key){ Map *map = (Map *) cont; HashIndex index = getHashIndex(key); void *oldData = NULL; Item *item = NULL; if (search(map->HashTable[index], key) == NULL) {error(); return NULL;} int pos = getPos(map->HashTable[index], key); cont_get(map->HashTable[index], pos); item = (Item *) cont_remove(map->HashTable[index], pos); oldData = item->data; map->size--; return oldData; } void assoc_foreach(void* cont, assoc_handle proc){ Map *map = (Map *) cont; for (int i = 0; i < HashTableSize; i++){ int size = cont_size(map->HashTable[i]); for (int j = 0; j < size; j++){ Item *item = (Item *) cont_get(map->HashTable[i], j); proc(item->key, item->data); } } } void assoc_foreach_reverse(void* cont, assoc_handle proc){ Map *map = (Map *) cont; for (int i = HashTableSize - 1; i >=0; i--){ int size = cont_size(map->HashTable[i]); for (int j = size-1; j >=0; j--){ Item *item = (Item *) cont_get(map->HashTable[i], j); proc(item->key, item->data); } } }
volvo
12.10.2007 1:59
Можно... Только надо видеть программу полностью...
new заменять на malloc, delete - на free, убирать работу с потоками cin/cout (если есть), переносить описания всех переменных до первой строки выполнимого кода (описание переменных в любом месте программы допустимо только в С++)...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.