IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Контейнеры в Си, .
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 25
Пол: Мужской

Репутация: -  -1  +


Помогите разобраться с заданием пожалуйста.
Вот по этому адресу (адрес указан в приложенном файле) лежит задание для нас. Там правда сказано на С++ без ООП, но преподаватель сказал, что на НАМ нужно на чистом Си. В файле на сайте все написанное и приведены три задания: двусвязный линейный список, ассоциативный массив и динамический массив. В Листинге который я выложу дальше я по идеи реализовал первое задание - линейный список - очень прошу специалистов посмотреть и высказать замечания, где может не правильно, где недодумано, где ещё чего. Вторая просьба - это пояснить, как основываясь на интерфейсе списков сделать динамический массив (это всё в здании написано просто коротко напоминаю) и что из себя таки представляет этот ассоциативный массив в примитивной реализации... не прошу написать, прошу объяснить как на основе сделанного прийти ко всему остальному.
С уважением

 ! 
Второй раз говорю, прочитай правила форума



Сообщение отредактировано: klem4 -


Прикрепленные файлы
Прикрепленный файл  code.doc ( 35.5 килобайт ) Кол-во скачиваний: 296
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Новичок
*

Группа: Пользователи
Сообщений: 25
Пол: Мужской

Репутация: -  -1  +


Снова дравствуйте.
Можно как нибудь исходник ориентированный видимо на C++ переделать на C обычный в частности избавиться от NEW всяческих?

Пример...
#include "map.h"
#include "container.h"
#include <iostream>

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);
}
}
}
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Neonig   Контейнеры в Си   22.09.2007 21:43
volvo   А вот по этому адресу лежат правила форума, в кото…   22.09.2007 23:39
Neonig   Извини пожалуйста, сейчас скачаю и прилеплю....Тол…   23.09.2007 0:38
Neonig   сам исходник. Условия в посте выше, цель вопроса, …   23.09.2007 2:25
volvo   У тебя в коде есть утечки памяти, или мне кажется?…   23.09.2007 14:42
Neonig   У тебя в коде есть утечки памяти, или мне кажется…   24.09.2007 0:24
volvo   Смотри: void cont_add(void* cont, void* data) { …   24.09.2007 0:47
Neonig   Ясно, значит переделаю остальные моменты под этот …   24.09.2007 2:26
volvo   Я не знаю, чего ждут от тебя в этом задании (какой…   24.09.2007 3:30
Neonig   Я не знаю, чего ждут от тебя в этом задании (како…   24.09.2007 18:50
volvo   если сделать в cont_allocate выделение массива, ск…   24.09.2007 19:15
Neonig   если сделать в cont_allocate выделение массива, с…   24.09.2007 19:39
volvo   AL **array, *current; array = (AL **)malloc(20 * …   24.09.2007 20:11
Neonig   Вот глнянь на общие принципы того ,как я это понял…   24.09.2007 20:12
Neonig   Вот, я сделал ещё динамический массив... посмотрит…   29.09.2007 0:45
volvo   А ты пример как раз ни один не привел, только реал…   29.09.2007 0:53
Neonig   Понял тебя...извини, что - то реально затупил с по…   29.09.2007 21:07
volvo   "Ну-с, приступим..." (С) "Напарник…   30.09.2007 4:16
Neonig   Сэнкс что взялся мне помочь, надеялся что следующи…   30.09.2007 15:44
volvo   Я предупредил, что у меня не MSVS, из за таких вот…   30.09.2007 16:01
Neonig   Посмотрел, работает вывод последовательностей, но …   4.10.2007 22:13
volvo   Ты посты читать будешь? Я же написал в начале 19-…   4.10.2007 22:30
Neonig   Извини, все читал, просто забыл, суть понял... я з…   4.10.2007 23:15
Neonig   Снова дравствуйте. Можно как нибудь исходник ориен…   12.10.2007 1:32
volvo   Можно... Только надо видеть программу полностью...…   12.10.2007 1:59


 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.04.2024 3:12
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name