![]() ![]() ![]() |
![]() Главная страница | ![]() Оглавление курса |
![]() Предыдущий модуль |
![]() Следующий модуль |
![]() Поиск терминов | ![]() Настройки | ![]() Версия для печати |
/* дисковая сортировка структур типа ddress. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #define NUM_ELEMENTS 4 /* Количество элементов - произвольное число, которое должно определяться динамически для каждого списка. */ struct address { char name [30]; char street[40] ; char city[20]; char state[3]; char zip[ll]; } ainfo; struct address addrs[NUM_ELEMENTS] = { "A. Alexander", "101 1st St", "Olney", "Ga", "55555", "B. Bertrand", "22 2nd Ave", "Oakland", "Pa", "34232", "C. Carlisle", "33 3rd Blvd", "Ava", "Or", "92000", "D.Dodger", "4 Fourth Dr", "Fresno", "Mi", "45678" }; void quick_disk (FILE *fp, int count); void qs_disk(FILE *fp, int left, int right); void swap_all_fields (FILE *fp, long i, long j); char *get_zip(FILE *fp, long rec); int main(void) { FILE *fp; /* сначала создадим файл с данными, подлежащий сортировке */ if ((fp=fopen("mlist","wb"))= =NULL) { printf("Невозможно открыть файл на запись.\n"); exit(l); } printf ("Запись неупорядоченных данных в дисковый файл.\n"); fwrite(addrs, sizeof(addrs), 1, fp); fclose(fp); /* теперь отсортируем файл */ if ( (fp=fopen("mlist", "rb+") )= =NULL) { printf("Невозможно открыть файл на чтение/запись.\n"); exit(l); } printf("Сортировка дискового файла.\n"); quick_disk(fp, NUM_ELEMENTS); fclose(fp); printf("Файл отсортирован.\n"); return 0; } /* Быстрая сортировка файлов. */ void quick_disk(FILE *fp, int count) { qs_disk (fp, 0, count-1) ; } void qs_disk(FILE *fp, int left, int right) { long int i, j; char x[100]; i = left; j = right; strcpy!x, get_zip(fp, (long)(i+j)/2)); /* получить средний почтовый индекс */ do { while((strcmp(get_zip(fp,i),x) < 0) && (i < right)) i++; while((strcmp(get_zip(fp,j),x) > 0) && (j > left)) j--; if(i <= j) { swap_all_fields(fp, i, j); i++; j - -; } } while(i <= j); if(left < j) qs_disk(fp, left, (int) j); if(i < right) qs_disk(fp, (int) i, right); } void swap_all_fields(FILE *fp, long i, long j) { char a[sizeof(ainfo)], b[sizeof(ainfo)]; /* считать в память записи i и j */ fseek(fp, sizeof(ainfo)*i, SEEK_SET); fread(a, sizeof (ainfo), 1, fp); fseek(fp, sizeof(ainfo)*j, SEEK_SET); fread(b, sizeof(ainfo), 1, fp); /* потом записать их на диск, поменяв местами.*/ fseek(fp, sizeof (ainfo) *j, SEEK__SET) ; fwrite (a, sizeof (ainfo) ," 1, fp) ; fseek(fp, sizeof(ainfo)*i, SEEK_SET); fwrite(b, sizeof(ainfo), 1, fp); } /* Получение указателя на почтовый код записи */ char *get_zip(FILE *fp, long rec) ( struct address *p; p = &ainfo ; fseek(fp, rec*sizeof(ainfo), SEEK_SET); fread(p, sizeof(ainfo), 1, fp); return ainfo.zip; }
![]() Главная страница | ![]() Оглавление курса |
![]() Предыдущий модуль |
![]() Следующий модуль |
![]() Поиск терминов | ![]() Настройки | ![]() Версия для печати |