При добавлении в хеш таблицу нового элемента, все остальные данные меняются на последний - C (СИ)

Узнай цену своей работы

Формулировка задачи:

При добавлении в хеш таблицу нового элемента, все остальные данные меняются на последний. Я так понял, ошибка в выделении памяти. Как это исправить?
#include <stdio.h>
#include <stdlib.h>
 
typedef int keyType;            /* type of key */
 
typedef int hashIndexType;      /* index into hash table */
 
typedef enum {
    STATUS_OK,
    STATUS_MEM_EXHAUSTED,
    STATUS_KEY_NOT_FOUND
} statusEnum;
 
typedef struct nodeTag {
    struct nodeTag *next;       /* next node */
    keyType key;                /* key */
    char* rec;                /* user data */
} nodeType;
 
nodeType **hashTable;
int hashTableSize;

void initialize()
{
    int i;
    hashTableSize = 2000;
    hashTable = (nodeType**) malloc(sizeof(nodeType)*hashTableSize);
    for(i = 0; i < hashTableSize; i++)
       hashTable[i] = NULL;
}
 
hashIndexType hash(keyType key) {
    return (key % hashTableSize);
}
 
statusEnum insertNode(keyType key, char* rec) {
    nodeType *p, *p0;
    hashIndexType bucket;
 
    bucket = hash(key);
    if ((p = (nodeType*) malloc(sizeof(nodeType))) == 0)
        return STATUS_MEM_EXHAUSTED;
    p0 = hashTable[bucket];
    hashTable[bucket] = p;
    p->next = p0;
    p->key = key;
    p->rec = rec;
    return STATUS_OK;
}
 
statusEnum deleteNode(keyType key) {
    nodeType *p0, *p;
    hashIndexType bucket;
    /* find node */
    p0 = 0;
    bucket = hash(key);
    p = hashTable[bucket];
    while (p && (p->key != key)) {
        p0 = p;
        p = p->next;
    }
    if (!p) return STATUS_KEY_NOT_FOUND;
 
    /* p designates node to delete, remove it from list */
    if (p0)
        /* not first node, p0 points to previous node */
        p0->next = p->next;
    else
        /* first node on chain */
        hashTable[bucket] = p->next;
 
    free (p);
    return STATUS_OK;
}
 
char* find(keyType key) {
    nodeType *p;
    p = hashTable[hash(key)];
    while (p && (p->key != key)) 
        p = p->next;
    if (!p) return NULL;
    return p->rec;
}
 
int main() {
    char* a;
    char data[50];
    char ip[30];
    int i, j, b;
    FILE *mf;
    initialize();
    mf = fopen("hosts", "r");
    for(i = 0; i < 10; i++){
        fscanf(mf, "%s", ip);
        fscanf(mf, "%s", data);
        b = 0;
        for(j = 0; ip[j];j++)
        {
            if(ip[j] == '.')
                continue;
            b = b*10 + ip[j] - 48;
        }
        insertNode(b,data);
    }
    if((a = find(127012)) != NULL)
        printf("%s\n",a);
    if((a = find(127013)) != NULL)
        printf("%s\n",a);
    return 0;
}
пример вводимых данных: 127.0.1.2 localhost 127.0.1.3 fr.a2dfp.net 127.0.1.4 m.fr.a2dfp.net 127.0.1.5 ad.a8.net 127.0.1.6 asy.a8ww.net 127.0.1.7 abcstats.com 127.0.1.8 a.abv.bg 127.0.1.9 adserver.abv.bg 127.0.1.10 adv.abv.bg 127.0.1.11 bimg.abv.bg и вывод: bimg.abv.bg bimg.abv.bg Для продолжения нажмите любую клавишу . . .

Решение задачи: «При добавлении в хеш таблицу нового элемента, все остальные данные меняются на последний»

textual
Листинг программы
127.0.0.1 007guard.com
127.0.0.1 008i.com
127.0.0.1 008k.com
127.0.0.1 00hq.com
127.0.0.1 010402.com
127.0.0.1 012.net
127.0.0.1 012.net/updates
127.0.0.1 032439.com
127.0.0.1 06523e7588bb41464846d2dee8f95c54633a6873.googledrive.com
127.0.0.1 0scan.com
127.0.0.1 1-2005-search.com
127.0.0.1 1-domains-registrations.com
127.0.0.1 1.supertestirovanie.com
127.0.0.1 1000gratisproben.com
127.0.0.1 1000zakazov.ru
127.0.0.1 1001namen.com
127.0.0.1 100888290cs.com
127.0.0.1 100sexlinks.com
127.0.0.1 10sek.com
127.0.0.1 123fporn.info

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.833 из 5
Похожие ответы