Как произвести сортивроку данных в Си

Суть такая, вот код, он считывает данные из файла и находит совпадения слов в файле:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    char** words = NULL; // указатель на слова
    int num_words = 0; // кол во слов
    char* delim = " \t\n,.!?:";
    int size_file = 0; //размер файла
    FILE* fp = fopen("test.txt", "r");
    fseek(fp, 0, SEEK_END);
    size_file = ftell(fp); //находим размер файла
    printf("%d\n", size_file);
    char* buffer = calloc(size_file + 1, sizeof(char)); //буфер

    if (buffer == NULL) {
        printf("Ошибка выделения памяти\n");
        exit(-1);
    }

    fseek(fp, 0, SEEK_SET);
    fread(buffer, 1, size_file, fp);
    printf("\nТекст файла\n\n");

    printf("%s\n", buffer);
    char* istr = strtok(buffer, delim);
    while (istr) {
        words = realloc(words, (num_words + 1) * sizeof(char*));
        words[num_words++] = istr;
        istr = strtok(NULL, delim);
        //printf("%s\n", istr);
    }

    /*for (int i=0; i<num_words;i++) {
  printf("%p\n", words[i]);
  }*/
    printf("Количество символов в файле :%d\n", size_file);
    printf("Количество слов в файле :%d\n\n", num_words);
    for (int i = 0; i < num_words; i++) {
        puts(words[i]);
    }

    printf("\nНахождение одинаковых слов\n");
    int* wcnt = calloc(num_words, sizeof(int));
    char* is_first = calloc(num_words, sizeof(char));
    for (int i = 0; i < num_words; i++) {
        wcnt[i]++;
        for (int j = 0; j < num_words; j++) {
            if (i != j && strcmp(words[i], words[j]) == 0) {
                if (wcnt[i]++ == 1 && i < j)
                    is_first[i] = 1;
            }
        }
    }

    for (int i = 0; i < num_words; i++) {
        if (wcnt[i] == 1 || is_first[i])
            if (wcnt[i] > 1 ) {
                printf("%s = %d\n", words[i], wcnt[i]);
            }
    }
  fclose(fp);
  free(buffer);
  free(words);
  free(wcnt);
  free(is_first);
  return 0;
}

Вот, как реализовать, чтобы в выводе он выводил по увеличению числа совпадений, то есть сначала 2 совпадения, потом 3 и т д


Ответы (1 шт):

Автор решения: SmellyNS

Один из множества вариантов:

Создайте структуру вида:

struct Dict
{
  int key;
  char * value;
};

Напишите функцию сортировки по ключу value. Сортируете так же элементы массива, но в условиях смотрите на значение ключа. К примеру сортировка пузырьком:

void bubbleSort(Dict *arr, int size)
{
  for (int i = 0; i < size - 1; i++)
  {
    for (int j = (size - 1); j > i; j--) // для всех элементов после i-ого
    {
      if (arr[j - 1].value > arr[j].value) // если текущий элемент меньше предыдущего
      {
        arr[j] = arr[j] + arr[j-1] - (arr[j-1] = arr[j]);
      }
    }
  }
}

Возможны ошибки, не компилировал. Это лишь пример, чтобы вы понимали подход к решению задачи.

→ Ссылка