1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
Дан текстовый файл. Строки этого файла расположить в порядке убывания их длины и удалить пять самых коротких из них. Для размещения в памяти содержимого файлов использовать односвязные линейные списки.
Предполагаю заносить каждую строку в одно поле списка, но не знаю, как это сделать именно со строкой и сколько выделять памяти.
Будет гораздо проще сделать наоборот: отсортировать слова по возрастанию длины, а потом удалить 5 первых, поскольку у тебя односвязный список, и работать от "головы" к "хвосту" легче, чем от "хвоста" к "голове"... Смотри:
LIST *p, *lst, *final; FILE *f; f=fopen("rg.txt","r");
lst = NULL; while(!feof(f)) {
fscanf(f, "%s", s); p = (LIST*)malloc(sizeof(list)); strcpy(p -> number, s);
if(!lst) lst = p; else final -> next = p;
final = p;
} fclose(f);
if(!lst) { printf("empty file\n"); return NULL; } final -> next = NULL;
return lst; }
void sort(LIST **first) {
LIST *L, *p; char s[255];
for(L = *first; L -> next; L = L -> next)
for(p = L -> next; p; p = p -> next) {
if(strlen(L -> number) > strlen(p -> number)) { /* сортируем по длине */ strcpy(s, L -> number); strcpy(L -> number, p -> number); strcpy(p -> number, s); } }
}
int main() { struct list *root, *p, *T; int n;
/* читаем список из файла */ root = read_list();
/* сортируем его по возрастанию длин строк */ sort(&root); /* и печатаем ... */ for(p = root; p; p = p -> next) printf("%s\n", p -> number);
/* теперь удаляем первые 5 элементов */ n = 0; for(p = root; p && n < 5; n++) {
p = (T = p) -> next; /* запоминаем текущее P в переменной T, для того чтобы потом удалить */ free(T); } /* и устанавливаем новое начало списка */ root = p;
/* еще раз проходим, и печатаем весь список, сразу удаляя все узлы, которые уже распечатаны */ for(p = root; p; ) { printf("%s\n", p -> number); p = (T = p) -> next; free(T); } root = NULL; return 0; }