Void del(int); // удаление элемента из таблицы по его индексу

void output(char*); // вывод таблицы имен в файл и на экран


void clear(void);

 

void main(void) {


// очистка всей таблицы


// структуры для фиксации времени

struct timeb t0, t1, t2, t3;

int secIncl, msecIncl;

int secDel, msecDel;

int secSum, msecSum;

printf("\nВведите имя файла для включения элементов: ");

scanf("%s", strBuf);

if((infil = fopen(strBuf, "rt"))==NULL) {

printf("No infil\n"); return;

}

ftime(&t0);

nextName();

while(!endfile) {

if(find(strBuf)) {

table[i_find].count++;

} else {

incl(strBuf);

}

nextName();

}

ftime(&t1);

output("incltab.txt");

fclose(infil);

printf("\nВведите имя файла для удаления элементов: ");

scanf("%s", strBuf);

if((infil = fopen(strBuf, "rt"))==NULL) {

printf("No infil\n"); return;

}

ftime(&t2);

nextName();

while(!endfile) {

if(find(strBuf)) {

del(i_find);

}

nextName();

}

ftime(&t3);


 

 

output("deltab.txt");

fclose(infil);

secIncl = t1.time - t0.time;

msecIncl = t1.millitm - t0.millitm;

if(msecIncl < 0) {msecIncl += 1000; --secIncl;}

printf("Время построения таблицы: %d.%02d\n", secIncl, mse-

cIncl/10);

secDel = t3.time - t2.time;

msecDel = t3.millitm - t2.millitm;

if(msecDel < 0) {msecDel += 1000; --secDel;}

printf("Время удаления из таблицы: %d.%02d\n", secDel, msec-

Del/10);

secSum = secIncl + secDel;

msecSum = msecIncl + msecDel;

if(msecSum > 1000) {msecSum -= 1000; ++secDel;}

printf("Суммарное время: %d.%02d\n", secSum, msecSum/10);

printf("Время вывода в файл результатов не учитывается\n");

printf("\nNormal END of work!\n");

}

 

// сканер, обеспечивающий считывание имен в буфер

void nextName(void) {

int c;

i_strBuf = -1;

strBuf[0] = '\0';

while(1) {

c = getc(infil);

if(c==EOF) {endfile=1; return;}

if(isalpha(c) || c=='_') {

strBuf[++i_strBuf] = c;

c = getc(infil);

while(isalpha(c) || isdigit(c) || c=='_') {

strBuf[++i_strBuf] = c;

c = getc(infil);

}

// Ограничения размера ключа

if(i_strBuf>nameSize-2) strBuf[nameSize-1] = '\0';

else strBuf[++i_strBuf] = '\0';

endfile=0;

return;

}

}

}

 

// функция поиска элемента в таблице имен по заданному образцу

int find(char* n) { // n - образец для поиска

int i;

for(i=0; i<=i_table; ++i)

if(!strcmp(table[i].name, n)) {


 

 


 

 

}


 

 

i_find = i;

return 1;

}

i_find = -1;

return 0;


 

 


 

// Включение элемента в таблицу на последнне место,

// так как таблица неупорядочена.

void incl(char* n) {

if(i_table == tableSize-1) {

printf("\nTable OVERLOARD\n");

exit(1);

}

strcpy(table[++i_table].name, n);

table[i_table].count = 1;

}

 

// Удаление элемента из таблицы по его индексу

void del(int d) {

int i;

for(i=d; i<i_table; ++i) {

strcpy(table[i].name, table[i+1].name);

table[i].count = table[i+1].count;

}

--i_table;

}

 

// Вывод таблицы на экран и в файл

void output(char* n) { // n - имя файла

FILE* outfil;

int i;

outfil = fopen(n, "wt");

printf("\n");

for(i = 0; i<=i_table; ++i) {

printf("%s\t\t%d\n", table[i].name, table[i].count);

fprintf(outfil, "%s\t\t%d\n", table[i].name, ta-

ble[i].count);

}

fclose(outfil);

}

 

// Очистка таблицы

void clear(void) {

i_table = -1;

}


 

 

Варианты заданий


 

 


1. Альтернативные варианты организации элемента таблицы имен

1.1 Непосредственное хранение имени в элементе.

1.2. Динамическое выделение памяти под имена по мере надобности.

1.3. Выделение отдельного одномерного массива для хранения имен.

1.4. Использование списка одномерных массивов, выделяемых по мере

надобности.

2. Альтернативные варианты организации таблицы

2.1. Одномерный массив элементов.

2.2. Однонаправленный линейный список элементов.

2.3. Однонаправленный кольцевой список.

2.4. Однонаправленный линейный список одномерных массивов.

2.5. Однонаправленный кольцевой список одномерных массивов.

2.6. Хеш-массив с разрешением конфликтов через однонаправленный

линейный список.

2.7. Хеш-массив с разрешением конфликтов через однонаправленный

кольцевой список.

2.8. Хеш-массив с разрешением конфликтов через ближайший свобод-

ный.

2.9. Однонаправленный линейный список, формируемый на основе

одномерного массива элементов.

2.10. Однонаправленный кольцевой список, формируемый на основе

одномерного массива элементов.

2.11. Двоичное дерево.

2.12. Двоичное дерево, построенное на основе одномерного массива.

Список вариантов