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

// структуры и связного списка

 

#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()

 

Hosted by uCoz