проблема с созданием линейного списка

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

проблема с созданием линейного списка

Сообщение *13* » 13.05.2007 22:56:26

помогите, пожалуйста.
задача процедуры, при её активации открывается окно выбора файла ( текстового ) затем с выбранного файла создается линейный список. файл может быть не однострочный, а иметь несколько строк. в файле целые числа.

Код: Выделить всё
  TPtr = ^Elem;
  Elem = record
    inf: integer;
    link: TPtr;
  end;

f1:textfile;
x:integer;
Begl, Endl, p: TPtr;

procedure TForm1.N1Click(Sender: TObject);
begin
if opendialog1.execute then
assignfile(f1, openDialog1.FileName);
reset(f1);

while not eof(f1) do begin
  while not eoln(f1) do begin
    read(f1, x);
       ?
       ?
       ?
  end;
end;
closefile(f1);
end;

вывод линейного списка, я вроде уже написал :o но не могу еще проверить...
Код: Выделить всё
procedure TForm1.N2Click(Sender: TObject);
begin
p:= Begl;
s1:= '';
while p <> nil do begin
  s1:=IntToStr(p^.inf) + ' ';
  p:= p^.link;
  Memo1.Lines.Add(s1);
  s1:= '';
end;
end;
*13*
новенький
 
Сообщения: 28
Зарегистрирован: 14.12.2006 16:29:57

Сообщение *13* » 16.05.2007 16:29:04

60 просмотров темы... неужели так тяжело ответить.... последняя прога которая у меня не выходит, и я свободен по ООП...
*13*
новенький
 
Сообщения: 28
Зарегистрирован: 14.12.2006 16:29:57

Сообщение Attid » 16.05.2007 16:38:10

ну я к примеру не знаю что есть линейный список
,а ради примера искать в нете не хочется =)

и форматирования у тя в сообщении не было =)

в общем если хочешь чтоб я подумал, тогда давай 2 примера файлов
и что должно получится =)
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2586
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение *13* » 16.05.2007 16:45:14

Attid писал(а):ну я к примеру не знаю что есть линейный список
,а ради примера искать в нете не хочется =)

и форматирования у тя в сообщении не было =)

в общем если хочешь чтоб я подумал, тогда давай 2 примера файлов
и что должно получится =)

ну например текстовый файл а в нём инфа такого рода
4 5 4 545 54 45 4
4 54 4 4 2 7 5
45 3 5 8 9 64
он все цифры из файла заносит в линейный список, и потом другая кнопка на форме этот линейный список распечатывает в МЕМО1. эта вторая кнопка вроде уже написана ( выше )
*13*
новенький
 
Сообщения: 28
Зарегистрирован: 14.12.2006 16:29:57

Сообщение shade » 16.05.2007 18:03:22

*13* писал(а):60 просмотров темы... неужели так тяжело ответить.... последняя прога которая у меня не выходит, и я свободен по ООП...

Это хрестоматийный пример. Полистал бы лекции, если они у тебя есть (хотя полагаю и у тебя их нет) и сам написал бы.

Дабы жизнь совсем мёдом не казалась покажу лишь как добавляется элемент в список, остальное без комментариев.

Код: Выделить всё
procedure add_item_to_list(var list: TPtr; inf: Integer);
var p: TPtr;
begin
  New(p);
  p^.inf := inf;
  p^.next := list;
  list := p;
end;

// Пример добавления в список
add_item_to_list(Begl, 1);
add_item_to_list(Begl, 2);
...
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение Alexander » 16.05.2007 19:33:22

При условии, что в конце строк не более одного пробела.

muchenik.pas
Код: Выделить всё
{$RANGECHECKS ON}{$H+}{$SMARTLINK ON}
uses sysutils;

  var
      s : string;
      l, f, om : LongInt;
      a : array of LongInt;

begin

SetLength(a, 0);

while not eof do begin

om := 1;

ReadLn(s);

l := Length(s);

for f := 1 to l do begin

if (s[f] = ' ') or (f = l) then begin
   SetLength(a, Length(a) + 1);
     if (f = l) and (s[f] <> ' ') then a[High(a)] := StrToInt(Copy(s, om, f - om + 1))
     else a[High(a)] := StrToInt(Copy(s, om, f - om));
   om := f + 1;
end;

end; {next f}
end; {wend}

for f := 0 to High(a) do WriteLn(a[f]);

end.


Неужели это так сложно ?
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 821
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Сообщение Alexander » 16.05.2007 19:34:31

Учись студент.
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 821
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Сообщение Alexander » 16.05.2007 20:07:50

http://ru.wikipedia.org/wiki/Линейный_список
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 821
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Сообщение *13* » 16.05.2007 20:45:43

Alexander писал(а):При условии, что в конце строк не более одного пробела.

muchenik.pas
Код: Выделить всё
{$RANGECHECKS ON}{$H+}{$SMARTLINK ON}
uses sysutils;

  var
      s : string;
      l, f, om : LongInt;
      a : array of LongInt;

begin

SetLength(a, 0);

while not eof do begin

om := 1;

ReadLn(s);

l := Length(s);

for f := 1 to l do begin

if (s[f] = ' ') or (f = l) then begin
   SetLength(a, Length(a) + 1);
     if (f = l) and (s[f] <> ' ') then a[High(a)] := StrToInt(Copy(s, om, f - om + 1))
     else a[High(a)] := StrToInt(Copy(s, om, f - om));
   om := f + 1;
end;

end; {next f}
end; {wend}

for f := 0 to High(a) do WriteLn(a[f]);

end.


Неужели это так сложно ?

при чем тут твой массив лонгинт к линейному списку? ты знаешь что такое динамические переменные?
*13*
новенький
 
Сообщения: 28
Зарегистрирован: 14.12.2006 16:29:57

Сообщение *13* » 16.05.2007 20:57:27

shade писал(а):
*13* писал(а):60 просмотров темы... неужели так тяжело ответить.... последняя прога которая у меня не выходит, и я свободен по ООП...

Это хрестоматийный пример. Полистал бы лекции, если они у тебя есть (хотя полагаю и у тебя их нет) и сам написал бы.

Дабы жизнь совсем мёдом не казалась покажу лишь как добавляется элемент в список, остальное без комментариев.

Код: Выделить всё
procedure add_item_to_list(var list: TPtr; inf: Integer);
var p: TPtr;
begin
  New(p);
  p^.inf := inf;
  p^.next := list;
  list := p;
end;

// Пример добавления в список
add_item_to_list(Begl, 1);
add_item_to_list(Begl, 2);
...

что в вашем примере означает p^.next, у меня в Типе такого не прописано. вы мне говорите что это хрестоматийный пример, а сами его вручную написать не можете, откуда-то копируете.
*13*
новенький
 
Сообщения: 28
Зарегистрирован: 14.12.2006 16:29:57

Сообщение Alexander » 16.05.2007 21:04:59

Мне показалось, что динамический массив является частным случаем
линейного списка. Поправте, те кто знает точно.
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 821
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Сообщение *13* » 16.05.2007 21:08:09

Alexander писал(а):Мне показалось, что динамический массив является частным случаем
линейного списка. Поправте, те кто знает точно.

мне нужно создать линейный список именно через динамический массив.
вот процедура. программа почемуто просто зависает и жрет 50% процессора. ошибка гдето в цикле. компилятор ничего не выдаёт. помойму он не может читать цифры перескакивать через строки. не пойму почему ( файл, повторяю, текстовый, с кооторого я читаю )
Код: Выделить всё
procedure TForm1.N1Click(Sender: TObject);
begin
if opendialog1.execute then
assignfile(f1, openDialog1.FileName);
reset(f1);
while not eof(f1) do begin
  while not eoln(f1) do begin
    read(f1, x);
    new(p);
    p^.inf:=x;
    p:=p^.link;
  end;
end;
closefile(f1);
p^.link:=nil;
end;
*13*
новенький
 
Сообщения: 28
Зарегистрирован: 14.12.2006 16:29:57

Сообщение Alexander » 16.05.2007 21:27:44

Так я тебе и показываю через ДИНАМИЧЕСКИЙ МАССИВ !
Что же по твоему:
Код: Выделить всё
a : array of LongInt;
???

Вопрос только попадает ли он в определение линейного списка или
нужен обязательно связанный.

Ещё ссылки на тему:

http://khpi-iip.mipk.kharkiv.edu/librar ... index1.htm
http://rsdn.ru/article/alg/list.xml
http://www.sgu.ru/prcnit/teach/1.php#2_3

В твоём случае внимательно почитай описание функции read. И посмотри
на содержание входного файла. Кроме того у тебя нет readln. Как же он
будет по строчкам продвигаться ?

Парсер вообще без read я показал.
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 821
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Сообщение shade » 16.05.2007 21:43:27

*13* писал(а):что в вашем примере означает p^.next, у меня в Типе такого не прописано. вы мне говорите что это хрестоматийный пример, а сами его вручную написать не можете, откуда-то копируете.

Я не копирую, а пишу по памяти без проверки, если включишь соображалку, то поймешь что вместо p^.next должно было быть p^.link

*13* писал(а):мне нужно создать линейный список именно через динамический массив.

Если вам нужен динамический массив, то см. вариант Alexander (array of Integer - динамический массив)

То, что вы приводите в примерах называется односвязный список:
Код: Выделить всё
type
  PListItem = ^TListItem;
  TListItem = record
    inf: integer;
    link: PListItem;
  end;

var
  f: text;
  x: Integer;
  ListBegin: PListItem;
  ListEnd: PListItem;
  p: PListItem;
 
begin
  assign(f, 'input.txt');
  reset(f);
  ListBegin := nil;
  ListEnd := nil;
  while not SeekEof(f) do
  begin
    read(f, x);
    writeln(x);
    New(p);
    p^.inf := x;
    p^.link := nil;
    if ListEnd <> nil then ListEnd^.link := p;
    ListEnd := p;
    if ListBegin = nil then ListBegin := p;
  end; // while
  close(f);
 
  writeln('---------');
  p := ListBegin;
  while p <> nil do
  begin
    writeln(p^.inf);
    p := p^.link;
  end;
end.
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение *13* » 16.05.2007 22:07:28

shade писал(а):
*13* писал(а):что в вашем примере означает p^.next, у меня в Типе такого не прописано. вы мне говорите что это хрестоматийный пример, а сами его вручную написать не можете, откуда-то копируете.

Я не копирую, а пишу по памяти без проверки, если включишь соображалку, то поймешь что вместо p^.next должно было быть p^.link

*13* писал(а):мне нужно создать линейный список именно через динамический массив.

Если вам нужен динамический массив, то см. вариант Alexander (array of Integer - динамический массив)

То, что вы приводите в примерах называется односвязный список:
Код: Выделить всё
type
  PListItem = ^TListItem;
  TListItem = record
    inf: integer;
    link: PListItem;
  end;

var
  f: text;
  x: Integer;
  ListBegin: PListItem;
  ListEnd: PListItem;
  p: PListItem;
 
begin
  assign(f, 'input.txt');
  reset(f);
  ListBegin := nil;
  ListEnd := nil;
  while not SeekEof(f) do
  begin
    read(f, x);
    writeln(x);
    New(p);
    p^.inf := x;
    p^.link := nil;
    if ListEnd <> nil then ListEnd^.link := p;
    ListEnd := p;
    if ListBegin = nil then ListBegin := p;
  end; // while
  close(f);
 
  writeln('---------');
  p := ListBegin;
  while p <> nil do
  begin
    writeln(p^.inf);
    p := p^.link;
  end;
end.

все работает. до сих пор не понимаю зачем нужно аж 3 переменные чтобы создать список.
ну да ладно... :roll:
*13*
новенький
 
Сообщения: 28
Зарегистрирован: 14.12.2006 16:29:57


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru