// сортировка слов по алфавиту с использованием
// структуры и связного списка
#include <stdio.h>
#include
<stdlib.h>
#include
<string.h>
int
sort_alf_Word( char *oldname,char *newname);
int
main( void )
{
char source[] ="outfile1.txt";
char
destination[]="outfile3.txt";
sort_alf_Word(source,destination);
return(0);
}
////////////////////////////////////////////////////////////////////////
//функция сортировки слов
//////////////////////////////////////////////////////////////////////////
int
sort_alf_Word( char *oldname,char *newname)
{
int counter = 1;
char word[20]; /* Temporary storage for each line. */
/* The list data structure. */
struct list {
char word[20];
struct list *next_rec;
};
/*
Typedefs for the structure and pointer. */
typedef
struct list LIST;
typedef
LIST *LISTPTR;
LISTPTR cur_ptr;
LISTPTR first = NULL; /* head pointer */
LISTPTR next_rec;
FILE *fold,*fnew;
/* Откроем файл-источник для чтения в
символьном режиме */
if ( ( fold = fopen( oldname,
"r" ) ) == NULL )
return -1;
/* Откроем файл
получатель для записи в символьном режиме. */
if ( ( fnew = fopen( newname, "w"
) ) == NULL )
{
fclose (
fold );
return -1;
}
//считаем данные из текстового файла в связный список1
while (!feof( fold ))
{
fgets(word,20, fold );
if ( !feof( fold ) )
{
LISTPTR new_rec = NULL; /* Holds address of new rec */
LISTPTR tmp_rec = NULL; /* Hold tmp pointer */
LISTPTR prev_rec = NULL;
/* Распределим
динам.память под первый элемент списка */
new_rec =
(LISTPTR)malloc(sizeof(LIST));
if (!new_rec) /* Unable to allocate memory */
{
printf("\nUnable to allocate
memory!\n");
exit(1);
}
/* запись новых
данных (инициализация элемента списка */
strcpy( new_rec->word, word);
new_rec->next_rec = NULL;
if (first == NULL) /* это первый элемент списка,вставим его */
{
first = new_rec;
new_rec->next_rec = NULL; /* это лишнее но вставим */
}
else /* если
не первый элемент */
{
/* поставить
перед первым элементом если new_rec->word < first->word */
if (strcmp( new_rec->word,
first->word)==0)
{
continue;
}
if (strcmp( new_rec->word, first->word)<0)
{
new_rec->next_rec = first;
first = new_rec;
}
else /* вставить в середину или конец ? */
{
tmp_rec = first->next_rec;
prev_rec = first;
/*
анализируем куда ставить элемент. */
if (
tmp_rec == NULL )
{
/*
добавляем вторую запись в конец */
prev_rec->next_rec = new_rec;
}
else
{
/*
проверка не вставить ли в середину ?*/
while (( tmp_rec->next_rec != NULL))
{
if(strcmp( new_rec->word, tmp_rec->word )==0)
{
break;
}
if(strcmp( new_rec->word, tmp_rec->word )<0)
{
new_rec->next_rec =
tmp_rec;
if (new_rec->next_rec !=
prev_rec->next_rec)
{
printf("ERROR");
getc(stdin);
exit(0);
}
prev_rec->next_rec =
new_rec;
break; /* элемент вставлен,выход их while */
}
else
{
tmp_rec =
tmp_rec->next_rec;
prev_rec =
prev_rec->next_rec;
}
}//end
while
/*
проверка вставить в конец ? */
if (tmp_rec->next_rec == NULL)
{
if(strcmp( new_rec->word,
tmp_rec->word )==0)
{
continue;
}
if (strcmp(new_rec->word,
tmp_rec->word)<0) /*предпоследний */
{
new_rec->next_rec = tmp_rec;
prev_rec->next_rec =
new_rec;
}
else /* конец */
{
tmp_rec->next_rec =
new_rec;
new_rec->next_rec =
NULL; /* лишнее */
}
}//end if
}//end else
}//end else
}//end else
//
return(first);
}//end if
//считанное из файла слово вставлено
в список
//прочтем
следующее слово из файла
}//end while конец
цикла считывания и сортировки,выход из while
/*========================================================*/
//закроем файл- источник
fclose ( fold
);
//выведем на
экран
// cur_ptr =
first;
// while (cur_ptr != NULL )
// {
// printf("\n %s
", cur_ptr->word );
// cur_ptr = cur_ptr->next_rec;
// }
//выведем в
файл
cur_ptr = first;
while (cur_ptr != NULL )
{
fputs( cur_ptr->word,fnew);
cur_ptr = cur_ptr->next_rec;
}
fclose ( fnew );
//освободим память
cur_ptr = first; /* Start at beginning */
while (cur_ptr != NULL) /* Go while not end of list */
{
next_rec = cur_ptr->next_rec; /* Get
address of next record */
free(cur_ptr); /* Free current record */
cur_ptr = next_rec; /* Adjust current record*/
}
return 0;
} //конец функции sort_alf_Word()