Как произвести сортивроку данных в Си
Суть такая, вот код, он считывает данные из файла и находит совпадения слов в файле:
#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]);
}
}
}
}
Возможны ошибки, не компилировал. Это лишь пример, чтобы вы понимали подход к решению задачи.