LinuxForum.Fans
Тема

Сортировка строк по количеству слов (C)

Автор: Pek1neZ 10 сообщений 2953 просмотров
#168088

Функция считает слова и символы в строке. Затем количество слов и строк заносится в массив. Строка вводится из файла или консоли.

text

for (int i = 0; i < total_lines; ++i)
        {
                
            int c, words, chars, condition;                
            c = words = chars = 0;                                    
            condition = OUT;
            while ((c = getc (input)) != '\n' && '\r') 
        
            {
                ++chars;
                if (c == ' ' || c == '\n' || c == '\t')
                    condition = OUT;
                else if (condition == OUT) 
                    {
                    condition = IN;
                    ++words;
                    }
            }
            printf ("words:%d chars:%d\n", words, chars);

words_base[i] = words; printf ("%d\n", words_base[i]); }

Пример работы:

total lines:3
words:3 chars:9
words:1 chars:6
words:5 chars:3


Нужно отсортировать строки по количеству слов. Как это можно сделать?


Заранее спасибо.

#168098

массив. в каждом элементе строка и кол-во слов в ней.
при получении очередной строки вставляете ее в нужную позицию в массиве.

#168099

точнее, пожалуй, будет сказать не массив, а связанный список

#168131

На словах вроде понял, но слабо себе представляю, как это реализовать(

#168140
Pek1neZ написал:
Нужно отсортировать строки по количеству слов. Как это можно сделать?

man qsort

#168141

Если qsort'ом отсортирую массив из количества слов, порядок строк ведь не изменится?
Или я что-то не так понял?

#168142
Pek1neZ написал:
На словах вроде понял, но слабо себе представляю, как это реализовать(

список?

text

struct List{
List *next;
int data;
};

// последний эл-т указывает на NULL // первый эл-т List *first = NULL;// список вначале пуст

//вставка в нужную позицию // например список такой 10 20 30 40 // вставляем 27 после 20 void insert(int d) { List *p = first; while(*p && p->next && p->data < d && p->data->next < d) p = p->next; List *n = malloc(sizeof(List)); if(*p) { if(p->next) { n->next = p->next; p->next = n; } else // дальше сами, лениво писать

#168145
Pek1neZ написал:
Если qsort'ом отсортирую массив из количества слов, порядок строк ведь не изменится?
Или я что-то не так понял?

а вы сделайте не несколько массивов, а один массив структур

struct Word{
char *string;
int count;
};

а потом его отсортируйте.

Это кстати куда как грамотнее и быстрее связанного списка.

#168361

Елки-палки, с qsort'ом разобраться не могу(

text

struct structure { char c; int words; };

structure *pt = (structure*) malloc (total_lines * sizeof(structure)); //разместил массив структур в куче

int compare (const void *p1, const void *p2) // функция сравнения { return ((*(structure*)p1).words - (*(structure*)p2).words); }

...

for (int i = 0; i < total_lines; ++i) { qsort (&(pt[i].words), total_lines*sizeof(int), sizeof (int), compare); printf ("%d \n", pt[i].words); }

На выводе "мусор" и несколько значений words (неотсортированных)

Что делаю не так?

#168380

man 3 qsort

text
 qsort (pt, total_lines, sizeof (structure), compare);

structure наверно всётаки {char*str; int words;}.

Войдите или зарегистрируйтесь, чтобы ответить.