Во всех кодах сделаны ошибки...
Задача 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; }