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

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

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

Ответить
*13*
новенький
Сообщения: 28
Зарегистрирован: 14.12.2006 15:29:57

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

Сообщение *13* »

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

Код: Выделить всё

  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 15:29:57

Сообщение *13* »

60 просмотров темы... неужели так тяжело ответить.... последняя прога которая у меня не выходит, и я свободен по ООП...
Аватара пользователя
Attid
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

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

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

в общем если хочешь чтоб я подумал, тогда давай 2 примера файлов
и что должно получится =)
*13*
новенький
Сообщения: 28
Зарегистрирован: 14.12.2006 15:29:57

Сообщение *13* »

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

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

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

ну например текстовый файл а в нём инфа такого рода
4 5 4 545 54 45 4
4 54 4 4 2 7 5
45 3 5 8 9 64
он все цифры из файла заносит в линейный список, и потом другая кнопка на форме этот линейный список распечатывает в МЕМО1. эта вторая кнопка вроде уже написана ( выше )
Аватара пользователя
shade
энтузиаст
Сообщения: 879
Зарегистрирован: 21.02.2006 19:15:48
Откуда: http://shamangrad.net/
Контактная информация:

Сообщение 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);
...
Аватара пользователя
Alexander
энтузиаст
Сообщения: 864
Зарегистрирован: 18.12.2005 18:10:00
Откуда: оттуда
Контактная информация:

Сообщение 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.


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

Сообщение Alexander »

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

Сообщение Alexander »

http://ru.wikipedia.org/wiki/Линейный_список
*13*
новенький
Сообщения: 28
Зарегистрирован: 14.12.2006 15:29:57

Сообщение *13* »

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 15:29:57

Сообщение *13* »

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, у меня в Типе такого не прописано. вы мне говорите что это хрестоматийный пример, а сами его вручную написать не можете, откуда-то копируете.
Аватара пользователя
Alexander
энтузиаст
Сообщения: 864
Зарегистрирован: 18.12.2005 18:10:00
Откуда: оттуда
Контактная информация:

Сообщение Alexander »

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

Сообщение *13* »

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;
Аватара пользователя
Alexander
энтузиаст
Сообщения: 864
Зарегистрирован: 18.12.2005 18:10:00
Откуда: оттуда
Контактная информация:

Сообщение Alexander »

Так я тебе и показываю через ДИНАМИЧЕСКИЙ МАССИВ !
Что же по твоему:

Код: Выделить всё

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 я показал.
Аватара пользователя
shade
энтузиаст
Сообщения: 879
Зарегистрирован: 21.02.2006 19:15:48
Откуда: http://shamangrad.net/
Контактная информация:

Сообщение 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.
*13*
новенький
Сообщения: 28
Зарегистрирован: 14.12.2006 15:29:57

Сообщение *13* »

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:
Ответить