Во всех кодах сделаны ошибки...
Задача 07-2: Domain Name System
Изначально заводится структура данных (можно и без неё, тогда придёться делать 2 массива), которая хранит в себе имя компьютера и его ip-адрес. Затем все известные данные заносятся в массив, каждый элемент которого - созданная структура. В конце каждое введённое имя ищется в сохранённом массиве.
Если попытаться сдачь задачу в таком виде, то мы не пройдём один из тестов по времени. Значит, нужно нашу базу имён-адресов каким-то образом проиндексировать. Здесь поможет хэш-таблица. Для разрешение коллизий я использовал метод цепочек. Важной частью здесь оказалось использование "хорошей" хэш-функции, поэтому в коде ниже она сделана не совсем верно (21 тест не пройдёт по времени).
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
enum {
SIZE_HASH = 500000
};
typedef struct copmuter{
char *name;
long long int ip;
} computer;
typedef struct hash{
computer comp;
struct hash *next;
} hash;
int
hashfunc(char *str)
{
int i, r = 0;
for(i = 0; str[i]; i++){
r = (r + str[i]) % SIZE_HASH;
}
return r;
}
void
addcomputer(hash *dnsdb[], char *name, long long int ip)
{
int i = hashfunc(name);
hash *list;
list = (hash*)malloc(sizeof(hash));
list->comp.ip = ip;
list->comp.name = (char*)malloc((strlen(name) + 1) * sizeof(char));
strcpy(list->comp.name, name);
list->next = dnsdb[i];
dnsdb[i] = list;
}
long long int
findip(hash *head, char *str)
{
hash *list = head;
while(list){
if(!strcmp(list->comp.name, str))
return list->comp.ip;
list = list->next;
}
return -1;
}
int
main(void)
{
FILE *input = fopen("input.txt", "r");
FILE *output = fopen("output.txt", "w");
hash *dnsdb[SIZE_HASH];
char buf[101];
int n, m, i, idx;
long long int tmpip, ip;
for(i = 0; i < SIZE_HASH; i++){
dnsdb[i] = NULL;
}
fscanf(input, "%d", &n);
for(i = 0; i < n; i++){
fscanf(input, "%s%lld", buf, &tmpip);
addcomputer(dnsdb, buf, tmpip);
}
fscanf(input, "%d", &m);
for(i = 0; i < m; i++){
fscanf(input, "%s", buf);
idx = hashfunc(buf);
if(dnsdb[idx]){
ip = findip(dnsdb[idx], buf);
if(ip != -1)
fprintf(output, "%lld\n", ip);
else
fprintf(output, "-1\n");
} else
fprintf(output, "-1\n");
}
fclose(input);
fclose(output);
return 0;
}