Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Однонаправленный линейный список

Автор: Тёмный Эльф 19.12.2006 3:54

А можно ли составить два спика в одной программе? Один список будет составляться по данным файла F1, а другой - файла F2? Нужно ли для этого отдельно описать второй список в TYPE?
Или, если так нельзя, то как можно прочитать файл F2, если известно заранее, что он состит из строк, но неизвестно их количество? Нужно ли делать это через запись или есть другие способы?

Автор: Bokul 19.12.2006 4:01

Цитата
А можно ли составить два спика в одной программе?

Да хоть 16 тысяч.. smile.gif

Цитата
Нужно ли для этого отдельно описать второй список в TYPE?

Нет. Просто делаешь две переменные типа твоего списка и работаешь с ними по отдельности

Цитата
Или, если так нельзя, то как можно прочитать файл F2

Тебе вообще не обязательно перекачивать твой файл в память, можно обойтись только одной переменной типа string. Все зависит от того, что ты хочешь делать с этой информацией.

Автор: Тёмный Эльф 19.12.2006 4:26

Объясните, пожалуйста. Немного не догоняю. Вот я составляю список по данным файла «DAN.inp». Но мне нужно проверить, а если ли в этом файле такие же слова, как и в файле «Dan1.inp», например. Нужно ли мне нижеприведенную процедуру сделать аналогично для второго файла? Или это делается другим способом?

Код

uses crt;
Type
next=^elem;
Elem=RECORD
     EL:string;
     Sled:next;
     END;
VAR
Uk1:next;


Procedure p1(var p:next);
var
m:next;
F1:text;
BEGIN
  Assign(F1,'DAN.inp');
  Reset(f1);
  Assign(output,'res.out');
  rewrite(output);
New(m);
New(m^.sled);
p:=m;
Readln(f1, m^.el);
m^.sled:=nil;
while not EOF(f1) do
begin
New(m^.sled);
m:=m^.sled;
Readln(f1, m^.el);
m^.sled:=nil;
End;
Close(f1);
m:=p;
While m<>NIL do
Begin
Writeln(m^.el);
m:=m^.sled;
End;
end;

Автор: Bokul 19.12.2006 4:41

Глянь на пятый пункт этого раздела...

Цитата
. Но мне нужно проверить, а если ли в этом файле такие же слова, как и в файле «Dan1.inp», например. Нужно ли мне нижеприведенную процедуру сделать аналогично для второго файла? Или это делается другим способом?

Как я вижу твоя процедура считует файл в список, а потом его распечатывает. Если я правильно понял вопрос, ты хочешь чтобы она (процедура) работала с любым другим текстовым файлом? Если да, то тебе надо передавать имя файла как параметр в процедуру.

Автор: Тёмный Эльф 19.12.2006 4:57

Цитата
Как я вижу твоя процедура считует файл в список, а потом его распечатывает. Если я правильно понял вопрос, ты хочешь чтобы она (процедура) работала с любым другим текстовым файлом? Если да, то тебе надо передавать имя файла как параметр в процедуру.


Вот что я имел ввидду:

Код

uses crt;
Type
next=^elem;
next2=^elem2;
Elem=RECORD
     EL:string;
     Sled:next;
     END;
Elem2=RECORD
     EL2:string;
     Sled2:next2;
VAR
Uk1:next;
UK2:next2;

Procedure p1(var p:next;
        var p2:next2);
var
m:next;
m2:next2;
F1,F2:text;
BEGIN
  Assign(F1,'DAN.inp');
  Assign(F2,'DAN1.inp');
  Reset(f1);
  Reset(f2);
New(m);
New(m2);
New(m^.sled);
New(m2^.sled2);
p:=m;
p2:=m2;
Readln(f1, m^.el);
Readln(f2, m2^.el2);
m^.sled:=nil;
while not EOF(f1) do
begin
New(m^.sled);
m:=m^.sled;
Readln(f1, m^.el);
m^.sled:=nil;
End;
Close(f1);
m2^.sled2:=nil;
while not EOF(f2) do
begin
New(m2^.sled2);
m2:=m2^.sled2;
Readln(f2, m2^.el2);
m2^.sled2:=nil;
End;
Close(f2);
end;


Ведь теперь у меня два списка, один по файлу F1, а другой по файлу F2. Могу ли я теперь пробежать по этим двум спискам и найти ОДИНАКОВЫЕ слова!?? В этом и состоит цель задачи. (извеняюсь, что привел этот пример в Теории, а не в Задачах).

Или же эти два списка никак не взаимосвязаны? тогда придется искать другой способ чтения файла F2 и сравнивания его с F1

Автор: Bokul 19.12.2006 5:20

Не правильно, ведь типы next и next2 абсолютно идентичны, для чего же тебе нужно два одинаковых типа? Может две переменных , но точно не типы.

Тоже самое ты делаешь в процедуре - ты делаешь одинаковые действия для разных файлов. Зачем вообще тогда использовать процедуру, выигрыша в краткости кода ведь все-равно нет. Правильно будет, если ты напишешь процедуру, которая умеет заполнять только один список, данными из неизвестного для нее файла. Т.е. ее начало должно быть вроде:

зrocedure p1(s:string; var p:next);
var m:next;
F1:text;
BEGIN
Assign(F1,s);
Reset(f1);
New(m);
New(m^.sled);
p:=m;
Readln(f1, m^.el);
m^.sled:=nil;
--------------------


Ровно в два разы меньше байтодвижений smile.gif .
А потом передавай этой процедуре на растерзание сколько хочешь файлов и списков:

Var list1,list2,list3:next;
begin
p1('C:\first.txt', list1);
p1('C:\second.txt', list2);
p1('C:\third.txt', list3);
end.


Автор: Тёмный Эльф 19.12.2006 5:33

Цитата
ты делаешь одинаковые действия для разных файлов.

А ведь на самом деле, ну, я и глупость написал!
Спасибо... smile.gif