1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
Посмотрел, работает вывод последовательностей, но вот что интересно, как я понялсначало мы в счтроку выводим значение count всех этих элементов, так? он почему то печатает все нули... т.е. получается, что все манипуляции с полем count что я проводил как бы не имеют следа?
Добавлено через 14 мин. Заметил, что более ничего не работает вставка например в таком виде
Извини, все читал, просто забыл, суть понял... я задаю вопрсоыы когда уже реальн не втыкаю что происходит - как сейчас например, соверешнно не могу понять почему прямой просмотр работает, а обратный начинается с цифры на едницу больше чем размер контейнера, доходит до нуля и вылетает с ошибкой... более того я сделал обратный (на время) прямым обходом, он обходит с этим же косяком с +1 к размеру и опять вылетает с ошибкой показывая на ассемблер....
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); } } }
Можно... Только надо видеть программу полностью...
new заменять на malloc, delete - на free, убирать работу с потоками cin/cout (если есть), переносить описания всех переменных до первой строки выполнимого кода (описание переменных в любом месте программы допустимо только в С++)...