Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Рацеев С.М. Программирование на языке Си.pdf
Скачиваний:
366
Добавлен:
23.03.2016
Размер:
1.65 Mб
Скачать

Приложение 4. СОРТИРОВКА ФАЙЛОВ И СПИСКОВ

1.Сортировка двоичных файлов

Впараграфе «Двоичные файлы» был рассмотрен пример с созданием и выводом двоичного файла, содержащего сведения о работниках некоторой организации: фамилия работника, год рождения, заработная плата. Отсортируем все записи в файле, например по году рождения. Для ускорения алгоритма используем динамический массив, в который выгрузим весь файл (если у нас имеется достаточно оперативной памяти). В качестве алгоритма сортировки для удобства понимания читателем используем пузырьковую сортировку, которая легко может быть трансформирована в любой другой алгоритм.

#include<stdio.h> struct WORKER

{

char name[20]; int year;

float earnings;

};

/* размер файла в байтах */ long Size(char *fileName)

{

FILE *f; long n;

if ((f = fopen(fileName, "rb")) == NULL) return -1;

fseek(f, 0, SEEK_END); n = ftell(f);

fclose(f); return n;

}

/* сортировка файла на основе пузырьковой сортировки */

326

int SortFile(char *fileName)

{

FILE *f;

struct WORKER *a; /* динамический массив структур */ struct WORKER buf;

long n, i, r; int flag;

/* открываем файл для чтения и записи */ if ((f = fopen(fileName, "r+b")) == NULL)

return 1;

/* вычисляем количество записей в файле */ n = Size(fileName)/sizeof(struct WORKER);

/* выделяем память для динамического массива */

a = (struct WORKER *)malloc(n * sizeof(struct WORKER));

/* проверяем успешность выделения памяти и пытаемся выгрузить файл в массив */

if (a == NULL || fread(a, sizeof(struct WORKER), n, f) != n)

{

fclose(f); return 2;

}

/* сортируем массив a по году рождения */ r = n;

do

{

flag = 0;

for(i = 1; i < r; i++)

if (a[i-1].year > a[i].year)

{

buf = a[i]; a[i] = a[i-1]; a[i-1] = buf; flag = 1;

}

r--; }while(flag);

/* устанавливаем файловый указатель в начало файла */ rewind(f);

/* записываем отсортированный массив в файл */

327

fwrite(a, sizeof(struct WORKER), n, f); fclose(f);

free(a); return 0;

}

2. Сортировка линейных списков

Отсортируем список целых чисел методом прямого выбора.

/* элемент списка */ typedef struct ELEMENT

{

int data;

struct ELEMENT *next; } ELEMENT;

/* сортировка линейного списка методом прямого выбора */ void SortList(ELEMENT *head)

{

ELEMENT *q = head->next, *min, *t; int buf;

/* если список пустой или одноэлементный, то сортировка не требуется */

if(q == NULL || q->next == NULL) return;

for( ; q != NULL; q = q->next)

{

min = q;

for(t = q->next; t != NULL; t = t->next) if (t->data < min->data)

min = t; buf = q->data;

q->data = min->data; min->data = buf;

}

}

328