Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
33
Добавлен:
17.04.2013
Размер:
119.3 Кб
Скачать

Пояснения к программе.

Вся информация о найденных файлах заносится в одно-связанный список, который в последствии сортируется и выводится на экран.

Структура DIR содержит описание информации о файле.

Структура list - это описание элемента одно-связанного списка.

Переменные pntr и p - это рабочие переменные, типа указатель на элемент списка.

Переменная min - это адрес элемента с информацией о файле с самой ранней датой создания файла.

Переменная dir - это переменная типа структуры DIR. Через эту переменную происходит обмен информацией.

Сортировка одно-связанного списка происходит следующим образом. Просматриваем элементы списка от начала до конца. Весь список будет разделен на две части: отсортированную и не отсортированную. Определяем адрес элемента с ранней датой создания (min), как первый элемент в не отсортированной части. Указатель p - это адрес первого не отсортированного элемента списка. В не отсортированной части ищем элемент с ранней датой создания файла ( внутренний цикл ) и информацию найденного элемента записываем по адресу переменной p, а информацию по адресу p записываем на место найденного элемента min ( обмен через переменную dir ).

После завершения сортировки, выводим на печать содержимое информационной части односвязанного списка. Одновременно происходит удаление списка из памяти.

Пример 2.

Вывести на экран информацию о файлах, созданных в году, заданном в строке аргументов, в алфавитном порядке. Если год не задан, то взять текущий год .

Текст программы.

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <dos.h>

#include <string.h>

#include <dir.h>

void main(int argc,char *argv[])

{ struct DIR{

char name[13]; // имя файла

long size; // размер

int data; // дата создания файла

int time; // размер

};

struct list{

DIR inf; // информация о файле

list *next; // адрес следующего элемента

};

/* описание переменных */

list *Dir=NULL,*pntr,*p,*min;

DIR dir;

int god=1998;

ffblk ff;

char path[]="c:\\dos\\*.*";

/* формирование года */

if(argc>1) god=atoi(argv[1]);

god-=1980;

/* поиск файлов с формированием односвязанного списка */

a=findfirst(path,&ff,FA_DIREC &&FA_ARCH);

while(!a)

{ int year=((ff.ff_fdate & 0177000)>>9);

if(year==god)

{

pntr=new list;

strcpy(pntr->inf.name,ff.ff_name);

pntr->inf.size=ff.ff_fsize;

pntr->inf.data=ff.ff_fdate;

pntr->inf.time=ff.ff_ftime;

pntr->next=NULL;

if(Dir==NULL)Dir=pntr;

else p->next=pntr;

p=pntr;

}

a=findnext(&ff) ;

}

/* сортировка односвязанного списка в алфавитном порядке имен */

p=Dir;

while (p!=NULL)

{ pntr=p;

min=p;

while(pntr!=NULL)

{ if(strcmp(pntr->inf.name,min->inf.name)<0)min=pntr;

pntr=pntr->next;

}

dir=min->inf;

min->inf=p->inf;

p->inf=dir;

p=p->next;

}

/* вывод содержимого односвязанного списка на экран */

clrscr();

while(Dir!=NULL)

{ printf(" %-15s %ld %d %d %d\n",

Dir->inf.name,

Dir->inf.size,

Dir->inf.data & 037,

(Dir->inf.data & 0740)>>5,

(( Dir->inf.data &0177000)>>9)+1980);

p=Dir;

Dir=Dir->next;

delete p;

}

}

Соседние файлы в папке Lab6