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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.05.2014, 18:02   #1
Flower2
Пользователь
 
Регистрация: 27.10.2013
Сообщений: 22
По умолчанию список

всем привет. нужно сделать двусвязный список состоящий из элементов Имя и номер телефона. Иван - 123456, Саша - 654321, Егор - 456123. чтобы вправо и влево можно было переходить и добавлять элемент.я смогла обозначить переменные, а дальше не понимаю
Код:
type 
spisok=Nnumber;
Nnumber = record 
 Name, number : string;
 next, prev:spisok; 
 end;
var a,b,c:spisok;
Begin
  New(a);
  a^.next:=nil;
  a^.name:='Ivan';
  a^.number:='123456';
Flower2 вне форума Ответить с цитированием
Старый 13.05.2014, 20:00   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, начало вполне годное. Только ссылка на тип - это ^ (выделил в коде)
А поиском по форуму почему не воспользовались? Уж списков тут было, пальцев не хватит, пересчитать...

ну, примерно так:
Код:
type 
spisok=^Nnumber;
Nnumber = record 
 Name, number : string;
 next, prev:spisok; 
 end;

var 
  a, pred, first, last : spisok;
Begin
  pred := nil;

  New(a);
  a^.next:=nil;
  a^prev :=pred;
  a^.name:='Ivan';
  a^.number:='123456';
  first := a;

  pred := a;
  New(a);
  a^.next:=nil;
  a^prev :=pred;
  a^.name:='Саша';
  a^.number:='654321';
  pred^.next := a;
  
  pred := a;
  New(a);
  a^.next:=nil;
  a^prev :=pred;
  a^.name:='Егор';
  a^.number:='456123';
  pred^.next := a;

  last := a;
вообще-то, лучше процедуры добавления элементов в список вынести в отдельную процедуру. Тогда не придётся повторять один и тот же код!

вот, например, так:
Код:
type 
spisok=^Nnumber;
Nnumber = record 
 Name, number : string;
 next, prev:spisok; 
 end;

procedure AddElemntToEnd(const dName, dnumber : string; var first, last : spisok);
var
  a : spisok;
begin
  New(a);
  a^.next:=nil;
  a^.prev :=last;
  a^.name:=dName;
  a^.number:=dnumber;
  if first=nil then first := a;
  if last<>nil then last^.next := a;
  last := a;
end;

procedure PrintDirectOrder( first : spisok);
var
  a : spisok;
begin
  if first = nil then WriteLn('List is empty!')
  else begin
    a := first;
    while a<>nil do begin
      WriteLn('name: ',a^.name,' number: ',a^.number );
      a := a^.next;
    end;
  end;
end;

procedure PrintReverseOrder( last : spisok);
var
  a : spisok;
begin
  if last = nil then WriteLn('List is empty!')
  else begin
    a := last;
    while a<>nil do begin
      WriteLn('name: ',a^.name,' number: ',a^.number );
      a := a^.prev;
    end;
  end;
end;

procedure FreeSpisok(var first, last : spisok);
var
  a : spisok;
begin
  if (first=nil) or (last=nil) then Exit; {}
  while last<>nil do begin
    a := last;
    last := last^.prev;
    Dispose(a);
  end;
  first := nil
end;

var
  Head, Tail : spisok;
Begin
  Head := nil;
  Tail := nil;

  AddElemntToEnd('Ivan', '123456', Head, Tail);
  AddElemntToEnd('Саша', '654321', Head, Tail);
  AddElemntToEnd('Егор', '456123', Head, Tail);

  WriteLn('List in direct order: ');
  PrintDirectOrder( Head );


  WriteLn('List in reverse order: ');
  PrintReverseOrder( Tail );

  Readln;


end.

Последний раз редактировалось Serge_Bliznykov; 13.05.2014 в 20:23.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.05.2014, 14:39   #3
Flower2
Пользователь
 
Регистрация: 27.10.2013
Сообщений: 22
По умолчанию

а как она вообще работает? я запускаю, ничего не происходит
Flower2 вне форума Ответить с цитированием
Старый 14.05.2014, 15:05   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Flower2 Посмотреть сообщение
а как она вообще работает? я запускаю, ничего не происходит
кто "она"? Что именно Вы запускаете?


p.s. пройдитесь в отладчике пошагово, посмотрите, работает "она" или нет..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.05.2014, 15:17   #5
Flower2
Пользователь
 
Регистрация: 27.10.2013
Сообщений: 22
По умолчанию

насколько я поняла, программа сначало выводит узлы которые имеются, в прямом, а потом в обратном порядке? можно ли сделать переход между узлами и другие операции по средствам ввода цифр. Например 1 - переход влево, 2 - вправо, 3 - создание нового элемента и заполнения имени и номера.
Flower2 вне форума Ответить с цитированием
Старый 14.05.2014, 15:28   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Flower2 Посмотреть сообщение
насколько я поняла, программа сначало выводит узлы которые имеются, в прямом, а потом в обратном порядке?
Вы правильно поняли. именно так.

Цитата:
Сообщение от Flower2 Посмотреть сообщение
можно ли сделать переход между узлами и другие операции по средствам ввода цифр. Например 1 - переход влево, 2 - вправо, 3 - создание нового элемента и заполнения имени и номера.
можно, конечно.
Я же и написал этот пример для Вас, что бы Вы разобрались в идеологии двухсвязного списка и написали программу так, как Вам нужно/понятно/удобно..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.05.2014, 16:00   #7
Flower2
Пользователь
 
Регистрация: 27.10.2013
Сообщений: 22
По умолчанию

нашла похожее задание, пытаюсь в нем разобраться. с цифрами операции новый элемент, вывод списка и выход я разобралась. написала к переменным имя и номер тип стринг. хотелось бы оставить процедуры этих трёх операции, там еще много лишнего написано, в чем я не могу разобраться, можете помочь их убрать
Код:
Program Spisok_dn;
uses
  crt; {Для использования readkey и clrscr}
type
  Nnumber=string; {тип данных, который будет храниться в элементе списка}
  List=^TList;  {Указатель на элемент типа TList}
  
  {двунаправленный список}
  TList=record {А это наименование нашего типа "запись" обычно динамические структуры описываются через запись}
    Name:Nnumber; {имя}
    Number:Nnumber; {телефон}
    next,    {указатель на следующий элемент списка}
    prev:List;  {указатель на предыдущий элемент списка}
  end;
  
 
 
procedure AddElemVst(var nach:List; var ends:List;znach1:Nnumber;znach2:Nnumber);
var
  tmp,tmpL:List;
  flag:boolean;
begin
  if nach=nil then {не пуст ли список, если пуст, то}
  begin
    new(nach); {создаём элемент, указатель nach уже будет иметь адрес}
    nach^.next:=nil; {никогда не забываем "занулять" указатели}
    nach^.prev:=nil; {аналогично}
    ends:=nach; {изменяем указатель конца списка}
    tmp:=nach;
  end
  else {если список не пуст}
  begin
    tmpl:=nach;
    flag:=true;
    while tmpl^.name<znach1 do
    begin
      tmpl:=tmpl^.next;
      if tmpl=nil then
        break;
    end;
    if tmpl<>nil then
    begin
      tmpl:=tmpl^.prev;
      if tmpl=nach then
        flag:=false;
      if tmpl=nil then
        tmpl:=nach;
    end
    else
    begin
      tmpl:=ends;
      flag:=false
    end;
    new(tmp);
    if ends=nach then
      if ends^.name<znach1 then
      begin
        ends^.next:=tmp;
        tmp^.prev:=ends;
        tmp^.next:=nil;
        ends:=tmp;
      end
      else
      begin
        nach^.prev:=tmp;
        tmp^.prev:=nil;
        tmp^.next:=nach;
        nach:=tmp;
      end
    else
    if (tmpl=nach) and (flag) then
    begin
      nach^.prev:=tmp;
      tmp^.prev:=nil;
      tmp^.next:=nach;
      nach:=tmp;
    end
    else
      if (tmpl=nach) and not(flag) then
      begin
        tmp^.next:=nach^.next;
        nach^.next^.prev:=tmp;
        tmp^.prev:=nach;
        nach^.next:=tmp;
      end
      else
      if (tmpL=ends) and not (flag) then
      begin
        ends^.next:=tmp;
        tmp^.prev:=ends;
        tmp^.next:=nil;
        ends:=tmp;
      end
      else
      begin
        tmp^.next:=tmpl^.next;
        tmpl^.next^.prev:=tmp;
        tmp^.prev:=tmpl;
        tmpl^.next:=tmp;
      end;
  end;
  tmp^.name:=znach1; {заносим данные}
  tmp^.number:=znach2;
end;
 
{процедура печати списка}
procedure PrintPL(spis1:List; spis2:List);
begin
  spis1:=spis2;
  if spis1=nil then
  begin
    writeln('Список пуст.');
    exit;
  end;
  Writeln('Список:');
  while spis1<>nil do
  begin
    Writeln(spis1^.name, ' ', spis1^.Number);
    spis1:=spis1^.prev
  end;
end;
 
procedure Print(spis1:List);
begin
  if spis1=nil then
  begin
    writeln('Список пуст.');
    exit;
  end;
  Writeln('Изначальный список:');
    while spis1<>nil do
  begin
    Writeln(spis1^.name, ' ', spis1^.number);
    spis1:=spis1^.next
  end;
end;
 
 
procedure PrintGor(spis1:List; spis2:List);
var
  tmp:List;
begin
  spis2:=nil;
  tmp:=spis2;
  new(spis2);
 // spis1:=spis2;
  if spis1=nil then
  begin
    writeln('Двунаправленный список пуст.');
    exit;
  end;
  
  while spis1<>nil do
  begin
    tmp^.next:=nil;
    tmp^.number:=spis1^.name;
    new(tmp);
    tmp:=tmp^.next;
    spis1:=spis1^.next;
  end;
end;  
{процедура удаления списка}
Procedure FreeStek(spis1:List);
var
  tmp:List;
begin
  while spis1<>nil do
  begin
    tmp:=spis1;
    spis1:=spis1^.next;
    dispose(tmp);
  end;
end;
 
var
  Spis:List;
  SpisNach, {указатель на начало списка и}
  SpisEnd,   {указатель на конец списка.}
  tmpl:List; 
  znach,znachTwo:integer;
  ch:char;
begin
  SpisNach:=nil;
  SpisEnd:=nil;
  Spis:=nil;
  repeat
    clrscr;
    Write('Программа для работы с ');
    TextColor(4);
    Writeln('двунаправленным списком.');
    TextColor(7);
    Writeln('Выберите желаемое действие:');
    Writeln('1) Добавить элемент.');
    Writeln('2) Вывод двунаправленного списка.');
    Writeln('3) Выход.');
    writeln;
    ch:=readkey;
    case ch of
      '1':begin
            write('Введите имя абонента: ');
            readln(znach);
            write('Введите телефон: ');
            readln(znachTwo);
            AddElemVst(SpisNach,SpisEnd,znach,znachTwo);
            {AddElem(SpisNach,SpisEnd,znach);}
          end;
      '2':begin
            clrscr;
            Print(SpisNach);
            PrintPL(SpisNach, SpisEnd);
            readkey;
          end;
    end;
  until ch='3';
  FreeStek(SpisNach);
end.
Flower2 вне форума Ответить с цитированием
Старый 14.05.2014, 17:58   #8
Flower2
Пользователь
 
Регистрация: 27.10.2013
Сообщений: 22
По умолчанию

Разобралась в коде, убрала лишние процедуры, не пойму только что за переменные tmp,tmpl и flag. и можете пояснить пожалуйста код, я его выделила
Код:
Program Spisok_dn;
uses
  crt; {Для использования readkey и clrscr}
type
  Nnumber=string; {тип данных, который будет храниться в элементе списка}
  List=^TList;  {Указатель на элемент типа TList}
  
  {двунаправленный список}
  TList=record {А это наименование нашего типа "запись" обычно динамические структуры описываются через запись}
    Name:Nnumber; {имя}
    Number:Nnumber; {телефон}
    next,prev:List; 
  end;
  
 
 
procedure AddElemVst(var nach, ends:List; znach1, znach2:Nnumber);
var
  tmp,tmpL:List;
  flag:boolean;
begin
  if nach=nil then {не пуст ли список, если пуст, то}
  begin
    new(nach); {создаём элемент, указатель nach уже будет иметь адрес}
    nach^.next:=nil; {никогда не забываем "занулять" указатели}
    nach^.prev:=nil; {аналогично}
    ends:=nach; {изменяем указатель конца списка}
    tmp:=nach;
  end
  else {если список не пуст}
  begin                                                   ******
    tmpl:=nach;
    flag:=true;
    while tmpl^.name<znach1 do
    begin
      tmpl:=tmpl^.next;
      if tmpl=nil then
        break;
    end;
    if tmpl<>nil then
    begin
      tmpl:=tmpl^.prev;
      if tmpl=nach then
        flag:=false;
      if tmpl=nil then
        tmpl:=nach;
    end
    else
    begin
      tmpl:=ends;
      flag:=false
    end;
    new(tmp);
    if ends=nach then
      if ends^.name<znach1 then
      begin
        ends^.next:=tmp;
        tmp^.prev:=ends;
        tmp^.next:=nil;
        ends:=tmp;
      end
      else
      begin
        nach^.prev:=tmp;
        tmp^.prev:=nil;
        tmp^.next:=nach;
        nach:=tmp;
      end
    else
    if (tmpl=nach) and (flag) then
    begin
      nach^.prev:=tmp;
      tmp^.prev:=nil;
      tmp^.next:=nach;
      nach:=tmp;
    end
    else
      if (tmpl=nach) and not(flag) then
      begin
        tmp^.next:=nach^.next;
        nach^.next^.prev:=tmp;
        tmp^.prev:=nach;
        nach^.next:=tmp;
      end
      else
      if (tmpL=ends) and not (flag) then
      begin
        ends^.next:=tmp;
        tmp^.prev:=ends;
        tmp^.next:=nil;
        ends:=tmp;
      end
      else
      begin
        tmp^.next:=tmpl^.next;
        tmpl^.next^.prev:=tmp;
        tmp^.prev:=tmpl;
        tmpl^.next:=tmp;
      end;
  end;
  tmp^.name:=znach1; {заносим данные}
  tmp^.number:=znach2;
end;
 
{процедура печати списка}
procedure PrintPL(spis1:List; spis2:List);
begin
  spis1:=spis2;
  if spis1=nil then
  begin
    writeln('Список пуст.');
    exit;
  end;
  Writeln('Список:');
  while spis1<>nil do
  begin
    Writeln(spis1^.name, ' ', spis1^.Number);
    spis1:=spis1^.prev
  end;
end;
 

 
 
procedure PrintGor(spis1:List; spis2:List);
var
  tmp:List;
begin
  spis2:=nil;
  tmp:=spis2;
  new(spis2);
 // spis1:=spis2;
  if spis1=nil then
  begin
    writeln('Двунаправленный список пуст.');
    exit;
  end;
  
  while spis1<>nil do
  begin
    tmp^.next:=nil;
    tmp^.number:=spis1^.name;
    new(tmp);
    tmp:=tmp^.next;
    spis1:=spis1^.next;
  end;
end;  
                                         *********
 
var
  Spis:List;
  SpisNach, {указатель на начало списка и}
  SpisEnd,   {указатель на конец списка.}
  tmpl:List; 
  znach,znachTwo:string;
  ch:char;
begin
  SpisNach:=nil;
  SpisEnd:=nil;
  Spis:=nil;
  repeat
    clrscr;
    Write('Программа для работы с двунаправленным списком.');
    Writeln('Выберите действие:');
    Writeln('1) Добавить элемент.');
    Writeln('2) Вывод списка.');
    Writeln('3) Выход.');
    writeln;
    ch:=readkey;
    case ch of
      '1':begin
            write('Введите имя абонента: ');
            readln(znach);
            write('Введите телефон: ');
            readln(znachTwo);
            AddElemVst(SpisNach,SpisEnd,znach,znachTwo);
            {AddElem(SpisNach,SpisEnd,znach);}
          end;
      '2':begin
            clrscr;
            PrintPL(SpisNach, SpisEnd);
            readkey;
          end;
    end;
  until ch='3';
  
end.

Последний раз редактировалось Flower2; 14.05.2014 в 18:26.
Flower2 вне форума Ответить с цитированием
Старый 14.05.2014, 20:02   #9
Flower2
Пользователь
 
Регистрация: 27.10.2013
Сообщений: 22
По умолчанию

помогите пожалуйста
Flower2 вне форума Ответить с цитированием
Старый 15.05.2014, 05:50   #10
Flower2
Пользователь
 
Регистрация: 27.10.2013
Сообщений: 22
По умолчанию

почти разобралась, не понятно что за тмп и флаг
Flower2 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
создать список л3 из элементов входящих и в список л1 и в список л2 goosha_gio C++ Builder 1 27.06.2013 22:22
Копирование, перемещение листа, выподающий список список albih Microsoft Office Excel 1 31.05.2012 12:49
Создать односвязный список и вывести его на экран. Из этого списка создать новый список по указанному ниже правилу и новый список San111 Паскаль, Turbo Pascal, PascalABC.NET 1 15.05.2012 22:08
Список с заглавным звеном, из текстового файла получить список из записей и по нему уже сделать задание Zigfried Помощь студентам 2 04.10.2010 20:29
Данные-проверка-список (список на другом листе) Inbox Microsoft Office Excel 7 26.12.2008 01:43