Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define IN 1
- #define OUT 0
- struct word {
- char *str; //Указатель на строку
- int count; //Количество повторений слов
- struct word *next; //Указатель на следующий узел стека
- }*p = NULL, *first = NULL, *end; //Рабочий указатель, указатель на первый элемент и на последний
- void outputArgs(int); //Если нехватает аргументов - аварийно завершить программу
- void output(FILE *); //Вывод слов из списка в поток
- struct word* search(char*); //Функция поиска слова в списке
- struct word* getLast(struct word*); //Функция нахождения адреса последнего элемента
- void shift(struct word*, char *string); //Функция вставки слова в список
- char* getMember(int); //Функция выделения памяти
- void freeStr(void); //Функци освобождения памяти
- int main(int argc, char *argv[])
- {
- int i = 0; //Счетчик цикла
- char buf[256]; //Буфер
- struct word *sp; //Указатель на очередной узел списка
- char *word; //Адрес, выделенный маллоком
- FILE *fp; //Указатель на открываемый файл для записи
- int state = OUT; //Ключ для определения положения каретки
- if((fp = fopen(argv[1], "w")) == NULL)
- {
- printf("Ошибка открытия файла\n");
- exit(-1);
- }
- outputArgs(argc);
- while((buf[i] = getchar()) != EOF)
- {
- if((buf[i] >= 'A' && buf[i] <= 'Z') || (buf[i] >= 'a' && buf[i] <= 'z'))
- {
- state = IN;
- i++;
- }
- if((buf[i] == '\t' || buf[i] == '\n' || buf[i] == ' ') && state == IN)
- {
- state = OUT;
- buf[i] = '\0';
- word = getMember(i);
- strcpy(word, buf);
- i = 0;
- if(search(word) == NULL)
- shift(sp, word);
- else
- p->count++;
- }
- }
- output(fp);
- freeStr();
- fclose(fp);
- return 0;
- }
- void outputArgs(int argc)
- {
- if(argc < 2)
- {
- printf("Недостаточное количество аргументов.\n");
- printf("Введите не менее двух аргументов.\n");
- printf("Первый аргумент - имя файла вывода.\n");
- exit(1);
- }
- }
- void shift(struct word *sp, char *string)
- {
- struct word *current = first; //Узел списка перед очередным узлом списка
- if((sp=(struct word *)malloc(sizeof(struct word)))==NULL)
- {
- exit (1);
- }
- sp->count++;
- sp->str = string; //Запись слова в очередной узел списка
- sp->next = NULL; //Очередной узел теперь указывает на NULL
- if(current == NULL)
- {
- first = sp;
- }
- else
- {
- while(current->next != NULL)
- {
- current = current->next;
- }
- current->next = sp;
- }
- }
- struct word* getLast(struct word *sp)
- {
- if(first == NULL) //Если первый элемент - единственный - вернуть нуль
- return NULL;
- else
- {
- for(p = first; p != NULL; p = p->next)
- if(p->next == NULL)
- return p;
- }
- }
- struct word* search(char *string)
- {
- for(p = first; p != NULL; p = p-> next)
- {
- if(!strcmp(p->str, string)) //Если строки одинаковые - вернуть адрес элемента
- {
- return p;
- }
- }
- return p; //Если нет
- }
- void output(FILE *pointer)
- {
- for(p = first; p != NULL; p=p->next)
- {
- fprintf(pointer, "Это слово повторялось при вводе %d раз: ", p->count);
- fprintf(pointer, "%s\n", p->str);
- }
- }
- void freeStr(void)
- {
- for(p = first; p = NULL; p=p->next)
- {
- free(p->str);
- first=p->next;
- free(p);
- }
- }
- char* getMember(int t_size)
- {
- char *r;
- r = (char*)malloc(t_size * sizeof(char));
- if(r == NULL)
- {
- printf("Ошибка выделения памяти.\n");
- exit(1);
- }
- else
- return r;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement