Advertisement
BorrowTheProgrammer

lab12.c

Dec 11th, 2019
218
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.38 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define IN 1
  6. #define OUT 0
  7.  
  8. struct word {
  9.     char *str;          //Указатель на строку
  10.     int count;          //Количество повторений слов
  11.     struct word *next;  //Указатель на следующий узел стека
  12. }*p = NULL, *first = NULL, *end;  //Рабочий указатель, указатель на первый элемент и на последний
  13.  
  14. void outputArgs(int);         //Если нехватает аргументов - аварийно завершить программу
  15. void output(FILE *);          //Вывод слов из списка в поток
  16. struct word* search(char*);   //Функция поиска слова в списке
  17. struct word* getLast(struct word*);   //Функция нахождения адреса последнего элемента
  18. void shift(struct word*, char *string);   //Функция вставки слова в список
  19. char* getMember(int);                 //Функция выделения памяти
  20. void freeStr(void);                   //Функци освобождения памяти
  21.  
  22. int main(int argc, char *argv[])
  23. {
  24.   int i = 0;          //Счетчик цикла
  25.   char buf[256];      //Буфер
  26.   struct word *sp;     //Указатель на очередной узел списка
  27.   char *word;          //Адрес, выделенный маллоком
  28.   FILE *fp;            //Указатель на открываемый файл для записи
  29.   int state = OUT;     //Ключ для определения положения каретки
  30.   if((fp = fopen(argv[1], "w")) == NULL)
  31.  {
  32.     printf("Ошибка открытия файла\n");
  33.     exit(-1);
  34.   }
  35.   outputArgs(argc);    
  36.   while((buf[i] = getchar()) != EOF)
  37.   {
  38.     if((buf[i] >= 'A' && buf[i] <= 'Z') || (buf[i] >= 'a' && buf[i] <= 'z'))
  39.     {
  40.       state = IN;
  41.       i++;
  42.     }
  43.     if((buf[i] == '\t' || buf[i] == '\n' || buf[i] == ' ') && state == IN)
  44.     {
  45.       state = OUT;
  46.       buf[i] = '\0';
  47.       word = getMember(i);
  48.       strcpy(word, buf);
  49.       i = 0;
  50.       if(search(word) == NULL)
  51.         shift(sp, word);
  52.       else
  53.         p->count++;
  54.     }
  55.   }
  56.   output(fp);
  57.   freeStr();
  58.   fclose(fp);
  59.   return 0;
  60. }
  61. void outputArgs(int argc)
  62. {
  63.   if(argc < 2)
  64.   {
  65.     printf("Недостаточное количество аргументов.\n");
  66.     printf("Введите не менее двух аргументов.\n");
  67.     printf("Первый аргумент - имя файла вывода.\n");
  68.     exit(1);
  69.   }
  70. }
  71.  
  72. void shift(struct word *sp, char *string)
  73. {
  74.  
  75.   struct word *current = first;  //Узел списка перед очередным узлом списка
  76.   if((sp=(struct word *)malloc(sizeof(struct word)))==NULL)
  77.   {
  78.     exit (1);
  79.   }
  80.   sp->count++;
  81.   sp->str = string;         //Запись слова в очередной узел списка
  82.   sp->next = NULL;    //Очередной узел теперь указывает на NULL
  83.   if(current == NULL)
  84.   {
  85.     first = sp;
  86.   }
  87.   else
  88.   {
  89.     while(current->next != NULL)
  90.     {
  91.       current = current->next;
  92.     }
  93.   current->next = sp;
  94.   }
  95. }
  96.  
  97. struct word* getLast(struct word *sp)
  98. {
  99.   if(first == NULL)   //Если первый элемент - единственный - вернуть нуль
  100.     return NULL;
  101.   else
  102.   {
  103.     for(p = first; p != NULL; p = p->next)
  104.       if(p->next == NULL)
  105.         return p;
  106.   }
  107. }
  108.  
  109. struct word* search(char *string)
  110. {
  111.  for(p = first; p != NULL; p = p-> next)
  112.  {
  113.    if(!strcmp(p->str, string))  //Если строки одинаковые - вернуть адрес элемента
  114.    {
  115.      return p;
  116.    }
  117. }
  118. return p;   //Если нет
  119. }
  120.  
  121. void output(FILE *pointer)
  122. {
  123.   for(p = first; p != NULL; p=p->next)
  124.   {
  125.     fprintf(pointer, "Это слово повторялось при вводе %d раз: ", p->count);
  126.     fprintf(pointer, "%s\n", p->str);
  127.   }
  128. }
  129.  
  130. void freeStr(void)
  131. {
  132.   for(p = first; p = NULL; p=p->next)
  133.   {
  134.     free(p->str);
  135.     first=p->next;
  136.     free(p);
  137.   }
  138. }
  139.  
  140. char* getMember(int t_size)
  141. {
  142.   char *r;
  143.   r = (char*)malloc(t_size * sizeof(char));
  144.   if(r == NULL)
  145.   {
  146.     printf("Ошибка выделения памяти.\n");
  147.     exit(1);
  148.   }
  149.   else
  150.     return r;
  151. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement