Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2011, 11:25   #1
masterlomaster
Форумчанин
 
Аватар для masterlomaster
 
Регистрация: 21.10.2009
Сообщений: 114
По умолчанию паскаль(списки)

Задание: создается динамический список и нужно что бы этот список стал в обратном порядке.

Идея такая: создать файл f, заполнить его элементами. Затем считывание и присвоение указателя каждому элементу и сохранение в обратном порядке в новый файл g.

Проблема вот в чем: не получается присвоить каждому элементу указатель(ошибка переполнения кучи);

Код:
program spisok;

type ukaz = ^zveno;
     zveno = record
        elem:char;
        next:ukaz;
     end;
var p,st,v:ukaz;
    el,n:char;
    f,g:text;

    begin
     assign(f,'spisok.txt');
     rewrite(f);
     repeat
      readln(el);
      write(f,el);
      until el='.';
     close(f);
    assign(g,'spisok2.txt');
    rewrite(g);
    reset(f);
    while not eof(f) do
     begin
      read(f,el);
      while el<>'.' do
       begin
         new(p);
         p^.elem:=el;
         p^.next:=nil;
       end;
     end;
     close(f);
     close(g);
     reset(g);
     while not eof(g) do
      begin
       read(f,el);
       writeln(el);
      end;
     close(g)
  end.
masterlomaster вне форума Ответить с цитированием
Старый 03.04.2011, 11:46   #2
VadikV
Форумчанин
 
Аватар для VadikV
 
Регистрация: 08.01.2011
Сообщений: 226
По умолчанию

В твоей лень править. Вот правильная работа со списками:
Код:
type
    { Описание элемента списка }
    PList = ^TList;
    TList = record
       v  : string[20];
       next : PList;
    end;

var
   First : PList;       { Указатель на первый элемент списка }
   Curr  : PList;       { Указатель на текущий элемент списка}

procedure ReadDict;
var
    f : TEXT;
    tmp : PList;       { Указатель на временную структуру для чтения данных из файла }
begin
    Curr := First;
    Assign(f, DICT);        { Открытие файла }
    Reset(f);
    { В цикле до конца фала читаем из него города }
    while not eof(f) do begin
        new(tmp);
        ReadLn(f, tmp^.v);
        tmp^.next := nil;

        if Curr = nil then begin { Если список еще пуст }
            Curr := tmp;
            First := Curr;
        end
        else begin               { Иначе }
            Curr^.next := tmp;
            Curr := Curr^.next;
        end;
   end;
   Close(f);            { Закрыть файл }
end;
Суть в том, что First всегда (!!!) указывает на первый элемент списка, а движение по списку осуществляется с помощью указателя Curr .

Ну и не забывай в конце память освобождать!
Код:
        { Удаление из памяти элементов списка }
        while First <> nil do begin
            Curr := First;
            First := First^.next;
            dispose(Curr);
        end;
icq 223-630-454
e-mail vysotskiy@list.ru
сайт http://www.big-library.net/
VadikV вне форума Ответить с цитированием
Старый 03.04.2011, 12:00   #3
masterlomaster
Форумчанин
 
Аватар для masterlomaster
 
Регистрация: 21.10.2009
Сообщений: 114
По умолчанию

..Спасибо..

Правельно ли я понимаю?

Напремер, каждому введеному мною элементу(сколько бы они не весили) можно присвоить указатель.
Код:
new(p);
p^.data:=3;
Теперь когда я это сделал могу легко найти "местоположение" элемента по указателю(как это сделать? и как я это сделаю если при дальнейшем вводе элементов
Код:
new(p^.next);
p^.data:=9
опять p^.data присваиваю ему уже другое значение. Не понятно как потом просмотреть элементы по указателю на них?

теме аппп.

Программа версии два ноль.

Создается динамический список и выводятся все элементы списка в обратном порядке.

Теперь хотелось бы сделать что бы пользователь выбирал после какого элемента(введеным ранее) вставить еше элемент пожеланию. Сделать это не получается, не подскажите направление?.

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

Код:
uses crt;
type ukaz=^zveno;
     zveno=record
          elem:char;
          next:ukaz;
     end;
var p,v,st:ukaz;
    n:integer;
    e,h,j:char;
procedure spisok;
 begin
  new(v);
  v:=nil;
  repeat
   new(p);
   p^.elem:=readkey;
   write(p^.elem);
   p^.next:=v;
   v:=p;
  until p^.elem=#13;
 end;
 procedure respisok(v:ukaz);
  begin
   p:=v;
   writeln('Vasi elementi v obratnom poriadke');
    repeat
    write(p^.elem);
    p:=p^.next;
   until p=nil;
  end;
 begin
  clrscr;
  writeln('Vvedite elementi d odnu stroku');
  spisok;
  clrscr;
  respisok(v);
  writeln;
  writeln('Gelayte li vi vstavit elemen posle kakogo-libo elementa? n/y');
  readln(h);
  if h='n' then exit
  else
  writeln('Posle kakogo elementa?');
  readln(h);
  writeln('Kakoy element hotite vstavit?');
  readln(j);
  readkey;
 end.

P.S а задание вообще такое: разработать программу , которая переформировывает список так, чтобы список стал в обратном порядке и вставлять в список элемент перед первым вхождением другого элемента.

это мы нашли элемент после которого хотим вставить новый элемент.
Код:
 writeln('Pered kakim elementom?');
  readln(h);
  writeln('Kakoy element hotite vstavit?');
  readln(j);
    begin
   while (p^.elem<>h) and (p<>nil) do begin
    p:=P^.next;
   end;
   u:=p;
   end;


Теперь не получается вставить его.

Нам надо присвоить этому новому элементу указатель элемента (перед каким хотим вставить этот новый элемент)?

Напремер: asd

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

Последний раз редактировалось Stilet; 03.04.2011 в 20:07.
masterlomaster вне форума Ответить с цитированием
Старый 03.04.2011, 19:01   #4
masterlomaster
Форумчанин
 
Аватар для masterlomaster
 
Регистрация: 21.10.2009
Сообщений: 114
По умолчанию аааа

тема закрыта
masterlomaster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль. Списки Fatality Помощь студентам 6 28.05.2009 07:56
паскаль списки Александр ето я Паскаль, Turbo Pascal, PascalABC.NET 0 19.05.2009 19:07
Списки. Паскаль Demyrg Помощь студентам 2 10.04.2008 08:20
Паскаль. Списки Freem Паскаль, Turbo Pascal, PascalABC.NET 2 11.05.2007 14:22