IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Односвязные линейные списки, Си
сообщение
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Дан текстовый файл. Строки этого файла расположить в порядке убывания их длины и удалить пять самых коротких из них.
Для размещения в памяти содержимого файлов использовать односвязные линейные списки.

Предполагаю заносить каждую строку в одно поле списка, но не знаю, как это сделать именно со строкой и сколько выделять памяти.

Сообщение отредактировано: 18192123 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Ты сама просила smile.gif

void sort(LIST **first) {

LIST *L, *p, *pp, *T, *prv_L, *prv_p;
char s[255];

start_over:
;

for(L = *first; L -> next; L = L -> next)

for(p = L -> next; p; p = p -> next) {

if(strlen(L -> number) > strlen(p -> number)) {

// Вот тут раньше было 3 строки... Смотри теперь.

if(L == *first) {

for(pp = *first; pp -> next != p; pp = pp -> next);
pp -> next = *first;

T = (*first) -> next;
*first = p;

L -> next = p -> next;
p -> next = T;

}
else {
LIST *prv_L, *prv_p;
for(prv_L = *first; prv_L -> next != L; prv_L = prv_L -> next);
for(prv_p = *first; prv_p -> next != p; prv_p = prv_p -> next);

prv_L -> next = p;
prv_p -> next = L;
T = p -> next;
p -> next = L -> next;
L -> next = T;
}

goto start_over;
}
}

}

 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Цитата(volvo @ 15.05.2007 17:11) *

Ты сама просила smile.gif


Спасибо!
Общую идею поняла...Попробывала переделать на свой лад....Идея такая: по заданию мне нужно расположить строки по убыванию длины. Функцией sort1 я это и делаю. Вывожу результат. Одна часть задания выполнена. Теперь сортирую наоборот (sort), после удаляем 5 самых коротких(они теперь впереди), ещё раз сортируем (т.к. по заданию нужно получить строки, упорядоченные по убыванию длины). Вывожу конечный результат.
Проблема в том, что в файл выводится список отсортированный, но не тот, что нужен мне.....
Вот так, например:
Исходные данные

qwert tyuri vbncgf
aaaaaaaaaaaaaaaaaaaaa
zxc vbn fgh qwerty qwerty
zxc
sd
a
qwervbn
zasd
cvbnnnnnn qwe rty uioopl nm

Результат

qwert tyuri vbncgf

qwervbn

zasd

zxc

sd

a


---

--------
Не пойму, откуда такие результаты?!


#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <alloc.h>

typedef struct list {

char number[255];
struct list *next;

} LIST;

LIST *read_list() {
char s[255];

LIST *p, *lst, *final;
FILE *f;
f=fopen("rgz.txt","r");

lst = NULL;
while(!feof(f)) {

fgets(s,255, f);
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 *p1=first, *p2=p1->next, *prev,*temp1, *temp2;
int flag=1;
while (flag&&p2)
{
flag=0;
prev=first;
while (p2)
{

if (strlen(p1->number)>strlen(p2->number))
{
flag=1;
temp1=p1;
temp2=p2->next;
p1=p2;
p2=temp1;
p1->next=p2;
p2->next=temp2;
if (temp1==first) first=p1; else prev->next=p1;
}
prev=p1;
p1=p1->next;
p2=p2->next;
}
p1=first; p2=p1->next;
}
}

void *sort1(LIST *first)
{
LIST *p1=first, *p2=p1->next, *prev,*temp1, *temp2;
int flag=1;
while (flag&&p2)
{
flag=0;
prev=first;
while (p2)
{

if (strlen(p1->number) < strlen(p2->number))
{
flag=1;
temp1=p1;
temp2=p2->next;
p1=p2;
p2=temp1;
p1->next=p2;
p2->next=temp2;
if (temp1==first) first=p1; else prev->next=p1;
}
prev=p1;
p1=p1->next;
p2=p2->next;
}
p1=first; p2=p1->next;
}
}







void main() {
struct list *root, *p, *T;
int n;
FILE *f;
f=fopen("RGZ2.txt","w");

root = read_list();


sort1(root);

for(p = root; p; p = p -> next)
fprintf(f,"%s\n", p -> number);
fprintf(f,"\n---\n");
sort(root);

n = 0;
for(p = root; p && n < 5; n++) {

p = (T = p) -> next;
free(T);
}

root = p;
sort1(root);


for(p = root; p; ) {
fprintf(f,"%s\n", p -> number);
p = (T = p) -> next;
free(T);
}
root = NULL; fprintf(f,"\n--------\n");

}



Сообщение отредактировано: 18192123 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
18192123   Односвязные линейные списки   29.04.2007 0:57
volvo   После прочтения строки из файла, проверяй ее длину…   29.04.2007 1:00
18192123   хочу сделать функцию для расположения строк в поря…   1.05.2007 20:24
volvo   Ты какой путь выбираешь, сразу заносить очередной …   1.05.2007 20:30
18192123   Ты какой путь выбираешь, сразу заносить очередной…   1.05.2007 21:26
volvo   Ну, тогда тебе и карты в руки... Опять изобретение…   1.05.2007 21:46
18192123   Ну, тогда тебе и карты в руки... Опять изобретени…   1.05.2007 21:49
18192123   попыталась написать ф-ю, которая формирует список …   1.05.2007 23:19
volvo   #include <stdio.h> #include <conio.h> …   2.05.2007 0:48
18192123   [code=cpp] strcpy(p -> number, s); …   2.05.2007 1:56
volvo   Эта строка значит следующее: если lst == NULL (или…   2.05.2007 2:20
18192123   А как будет выглядеть удаление 5 нужных элементов?…   2.05.2007 14:17
volvo   А по какому признаку будешь удалять? Нужно... Про…   2.05.2007 15:35
18192123   А по какому признаку будешь удалять? удалять 5 …   2.05.2007 17:25
volvo   Будет гораздо проще сделать наоборот: отсортироват…   2.05.2007 18:43
18192123   вот такие тестовые данные ввожу в исходный файл: q…   9.05.2007 1:33
volvo   Потому что из списка удаляется всего 5 элементов, …   9.05.2007 1:47
18192123   Потому что из списка удаляется всего 5 элементов,…   9.05.2007 1:56
volvo   Так... Кажется мне удалось повторить проблему, кот…   9.05.2007 2:24
18192123   Так... Кажется мне удалось повторить проблему, ко…   9.05.2007 3:37
18192123   всё-таки хочу разобраться и таким вариантом : как,…   9.05.2007 15:02
volvo   С односвязным списком - только через извращение, к…   9.05.2007 15:27
18192123   Я хочу добиться того, чтобы после удаления 5 элеме…   9.05.2007 19:55
18192123   Я хочу добиться того, чтобы после удаления 5 элем…   9.05.2007 23:19
volvo   Потому, что если мы будем передавать просто указат…   9.05.2007 23:56
18192123   объясните пожалуйста некоторые моменты: 1) о сорти…   10.05.2007 2:21
volvo   Давай по порядку: 1) организацию циклов в С знаеш…   10.05.2007 3:23
18192123   volvo, большое спасибо! теперь всё поняла…   10.05.2007 4:06
18192123   Возник ещё вопрос: for(L = *first; L -> next; …   14.05.2007 22:13
18192123   а можно сделать так, чтобы не строки копировать и…   15.05.2007 18:34
volvo   Можно, только код будет больше по размеру... Не за…   15.05.2007 2:52
18192123   Можно, только код будет больше по размеру... Не з…   15.05.2007 3:05
volvo   Ты сама просила :) void sort(LIST **first) { L…   15.05.2007 20:11
18192123   Ты сама просила :) Спасибо! Общую идею поня…   15.05.2007 21:58
18192123   LIST *prv_L, *prv_p; for(pr…   15.05.2007 22:43
volvo   Сорри, я больше в эту тему НЕ отвечаю! Я тебе …   15.05.2007 22:22


 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 26.04.2024 7:09
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name