Форум программистов, компьютерный форум, киберфорум
Наши страницы
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.53/19: Рейтинг темы: голосов - 19, средняя оценка - 4.53
Дашустрик
Дашики
7 / 7 / 1
Регистрация: 26.09.2008
Сообщений: 477
1

Двунаправленный список однонаправленных упорядоченных подсписков

16.02.2009, 15:43. Просмотров 3362. Ответов 25
Метки нет (Все метки)

Двунаправленный список однонаправленных упорядоченных подсписков. Реализация задачи должна быть только с применением динамических структур. Дополнительно реализовать:
  • Нахождение произведения всех элементов указанного подсписка.
  • Разбиение n-го подсписка на два подсписка отличающихся не более, чем на один элемент.
  • Найти количество элементов в n-ом подсписке, стоящих после элемента с ключом k.
Плаз,подскажите,что за подсписки и где про них есть материал?

ребят,ну что никто не знает,а то я всю голову себе поламала...

я знаю есть человек,который знает ответ...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.02.2009, 15:43
Ответы с готовыми решениями:

Двунаправленный список
У меня дана информация про спортсмена:ФИО, вес, рост.Создать процедуру для...

Линейный двунаправленный список
Помогите разобраться с задачей. Задан массив из 40 случайных элементов,...

Кольцевой двунаправленный список
Пусть L обозначает кольцевой двунаправленный список с заглавным звеном....

Массив целых чисел, двунаправленный список
Дан массив целых чисел. Поместить все элементы этого массива в двунаправленный...

Односвязный список.Добавление упорядоченных записей. Вывод.
Здравствуйте. Просмотре форум нашёл такую же задачу, но к сожалению не...

25
Дашустрик
Дашики
7 / 7 / 1
Регистрация: 26.09.2008
Сообщений: 477
22.02.2009, 18:20  [ТС] 21
ага,разобралась,а как тогда быть с "Разбиение n-го подсписка на два подсписка отличающихся не более, чем на один элемент."?
0
lexus_ilia
3050 / 710 / 69
Регистрация: 24.09.2008
Сообщений: 1,531
22.02.2009, 21:19 22
а что имеется ввиду под словом "разбиение"? Если имеется ввиду, что пользователь вводит какое-то число (номер подсписка), а программа разбивает его на 2, то тогда встаёт вопрос как связать новопоявившийся подсписок с элементом списка от подсписка которого он было образован, если добавить понятие массива указателей от каждого элемента списка на начала подсписков, то тогда всё можно реализовать...
Или имелось ввиду что произойдёт сравнение подсписков и все отличающиеся не более чем на 1 элемент (т.е. либо одинаковые, либо различия на 1 элемент) подсписки будут разбиваться, тогда всё равно придётся ввести массив указателей на начала подсписков,а потом получается всё тоже самое, просто всё в цикле и некоторые проверки добавятся...
0
Дашустрик
Дашики
7 / 7 / 1
Регистрация: 26.09.2008
Сообщений: 477
23.02.2009, 13:56  [ТС] 23
я тоже над этим голову ламала и мне кажется,что видимо это условие рассчитано на то что видимо пользователь сам вводит число,после которого подсписок делиться,только как это реализовать,я что-то сообразить не могу

Добавлено через 13 часов 15 минут 52 секунды
проверьте,плиз на правильность и на корректность,и чтоб программа условию соответствовала,а то у меня голова уже затуманенная
Код
program pod_spisok;
uses crt;
Const
     Enter='Нажмите ENTER..';
     EnterOrSpas='Нажмите ENTER или ПРОБЕЛ ...';
     Inv1='Создать список';
     Inv2='Создать подсписок';
     Inv3='Добавить элемент в список';
     Inv4='Добавить элемент в подсписок';
     Inv5='Удалить элемент из списка';
     Inv6='Удалить элемент из подспика';
     Inv7='Найти произведение всех элементов указанного подсписка';
     Inv8='Разбить n-ый подсписок на два подсписка отличающихся не более, чем на один элемент';
     Inv9='Найти количество элементов в n-ом подсписке, стоящих после элемента с ключом k';
     CaseStr='Выберите курсором нужный режим.';
 
type
   TypeOfElem=Char;
   odnosvyazniy_spisok=^spisok_os;
   spisok_os = record
   next:odnosvyazniy_spisok;
   data:real;
   Elem:TypeOfElem;
   end;
   dvuh_svyazniy_spisok=^spisok_ds;
   spisok_ds = record
   next,prev:dvuh_svyazniy_spisok;
   Inf:real;
   Inf1,Inf2:string;
   end;
   Second=record
   fir,las:dvuh_svyazniy_spisok;
   end;
Procedure sozdanie_spisok;
var
r:dvuh_svyazniy_spisok;
n:real;
    begin
      New(r);
      r^.Next:=nil;
      r^.Inf:=n;
    end;
Procedure sozdanie_podspisok;
var
r:odnosvyazniy_spisok;
b:real;
    begin
      New(r);
      r^.Next:=nil;
      r^.Data:=b;
    end;
procedure Add_spisok;
var
s:dvuh_svyazniy_spisok;
n:string;
L:Second;
begin
   repeat
    Writeln('Введи элемент списка: ');
    Readln(n);
     if length(n)<>0 then
          begin
             New(s);
             S^.next:=nil;
             S^.prev:=nil;
             S^.Inf1:=n;
              if L.fir=nil then
                L.fir:=S
              else
                 begin
                    L.las^.next:=S;
                    S^.prev:=L.las;
                 end;

             L.las:=S;
          end;
   until length(n)=0;
end;
procedure Add_podspisok;
var
Info: TypeOfElem;
q:odnosvyazniy_spisok;
ElemOfStr: odnosvyazniy_spisok ;
begin
  if not ( ElemOfStr= nil ) then begin
    new( q );
    q^.next:= ElemOfStr^.next;
    q^.Elem:= Info;
    ElemOfStr^.next:= q
  end
end;
procedure Delete_spisok(var L:Second);
var NowElem,ElemWasDel:dvuh_svyazniy_spisok;
    DelEl,Num:integer;
begin
   WriteLn('Сколько удалить'' элементов:');
   ReadLn(DelEl);
   NowElem:=L.fir;
   Num:=1;
    while Num<>DelEl+1 do
      begin
         L.fir:=NowElem^.next;
         ElemWasDel:=NowElem;
         NowElem:=NowElem^.next;
         dispose(ElemWasDel);
         Num:=Num+1;
      end;

end;
Procedure Delet_podspisok( ElemOfStr: odnosvyazniy_spisok ); 
var q, p: odnosvyazniy_spisok; 
begin 
  if ElemOfStr^.next <> nil then begin
    q:= ElemOfStr^.next;
    p:= ElemOfStr^.next;
    ElemOfStr^.next:= p^.next;
    dispose( q ); 
  end 
end;
Procedure proizvedenie;
var 
P: real;
S:odnosvyazniy_spisok;
begin 
P:=1;
repeat
P:=P*S^.data;
S:=S^.next;
until S=nil;
end;
Procedure Razdelitel;
type
spisok=odnosvyazniy_spisok;
var
r:spisok;
head1,head2:spisok;
b:real;
cur : odnosvyazniy_spisok;
    begin
      Writeln('Введите элементы подсписка                   ');
      New(r);
      r^.Next:=nil;
      r^.Data:=b;
    end;
  begin     
    Writeln('Введите элемент,после которого список будет разделен', head2,' ');
     head2:=nil 
    begin  cur:=head2;
      while cur^.next<>nil do cur:=cur^.next;
      cur^.next:=head2;
   end;
end;
Procedure kolichestvo;
var
r:odnosvyazniy_spisok;
k,kol:integer;
begin
 while (r<>nil) or (r^.data<>k) do
  r:=r^.Next;
 kol:=0;
 while r^.Next<>nil do 
 begin
  inc(kol);
  r:=r^.Next
 end;
end;
Function MainMenu:boolean;
const
 i:integer=1;
begin
  MainMenu:=false;
  clrscr;
  Writeln(Inv1);
  Writeln(Inv2);
  Writeln(Inv3);
  Writeln(Inv4);
  Writeln(Inv5);
  Writeln(Inv6);
  Writeln(Inv7);
  Writeln(Inv8);
  Writeln(Inv9);
  Writeln('Выход');
  OutMessageXY(5,24,CaseStr,Enter);
  Gotoxy(1,i);
  repeat
    ch:=readkey;
    if(ch=#32)or(ch=#13)then
      begin
        case i of
          1:sozdanie_spisok;
          2:sozdanie_podspisok;
          3:Add_spisok;
          4:Add_podspisok;
          5:Delete_spisok;
          6:Delete_podspisok;
          7:proizvedenie;
          8:Razdelitel;
          8:kolichestvo; 
          9:begin
              MainMenu:=true;
              Exit;
            end;
          end;
        end
      else UpDown(i,8);
    until false;
  end;
begin
  clrscr;
  repeat until MainMenu;
end.
0
Дашустрик
Дашики
7 / 7 / 1
Регистрация: 26.09.2008
Сообщений: 477
24.02.2009, 17:54  [ТС] 24
Добровольцы есть?
0
Дашустрик
Дашики
7 / 7 / 1
Регистрация: 26.09.2008
Сообщений: 477
26.02.2009, 10:08  [ТС] 25
вот немного добавила
Код
program pod_spisok;
uses crt;
Const
     Enter='Нажмите ENTER..';
     EnterOrSpas='Нажмите ENTER или ПРОБЕЛ ...';
     Inv1='Создать список';
     Inv2='Создать подсписок';
     Inv3='Добавить элемент в список';
     Inv4='Добавить элемент в подсписок';
     Inv5='Удалить элемент из списка';
     Inv6='Удалить элемент из подспика';
     Inv7='Найти произведение всех элементов указанного подсписка';
     Inv8='Разбить n-ый подсписок на два подсписка отличающихся не более, чем на один элемент';
     Inv9='Найти количество элементов в n-ом подсписке, стоящих после элемента с ключом k';
     CaseStr='Выберите курсором нужный режим.';
     TaOld=15;
var
ch:char;
type
   TypeOfElem=Char;
   odnosvyazniy_spisok=^spisok_os;
   spisok_os = record
   next:odnosvyazniy_spisok;
   data:real;
   Elem:TypeOfElem;
   end;
   dvuh_svyazniy_spisok=^spisok_ds;
   spisok_ds = record
   next,prev:dvuh_svyazniy_spisok;
   Inf:real;
   Inf1,Inf2:string;
   end;
   Second=record
   fir,las:dvuh_svyazniy_spisok;
   end;
Procedure OutMessageXY(X,Y:Byte;Str1,Str2:String);
var
 Xcur, Ycur:byte;
begin
     Xcur:=WHereX;
     Ycur:=WHereY;
     GotoXY(X,Y);
     TextAttr:=Red+16*LightGray+Blink;
     Write(Str1,Str2);
     TextAttr:=TaOld;
     GotoXY(Xcur,Ycur);
end;
Procedure UpDown(var Vari:integer;Im:byte);
begin
  if ch=#0 then ch:=readkey;
  case ch of
    #72: begin
           if vari=1 then vari:=im else vari:=vari-1;
           gotoxy(1,vari);
         end;
    #80: begin
           if vari=im then vari:=1 else vari:=vari+1;
           gotoxy(1,vari);
         end;
    end;
end;
Procedure sozdanie_spisok;
var
r:dvuh_svyazniy_spisok;
n:real;
    begin
      New(r);
      r^.Next:=nil;
      r^.Inf:=n;
    end;
Procedure sozdanie_podspisok;
var
r:odnosvyazniy_spisok;
b:real;
    begin
      New(r);
      r^.Next:=nil;
      r^.Data:=b;
    end;
procedure Add_spisok;
var
s:dvuh_svyazniy_spisok;
n:string;
L:Second;
begin
   repeat
    Writeln('Введи элемент списка: ');
    Readln(n);
     if length(n)<>0 then
          begin
             New(s);
             S^.next:=nil;
             S^.prev:=nil;
             S^.Inf1:=n;
              if L.fir=nil then
                L.fir:=S
              else
                 begin
                    L.las^.next:=S;
                    S^.prev:=L.las;
                 end;

             L.las:=S;
          end;
   until length(n)=0;
end;
procedure Add_podspisok;
var
Info: TypeOfElem;
q:odnosvyazniy_spisok;
ElemOfStr: odnosvyazniy_spisok ;
begin
  if not ( ElemOfStr= nil ) then begin
    new( q );
    q^.next:= ElemOfStr^.next;
    q^.Elem:= Info;
    ElemOfStr^.next:= q
  end
end;
procedure Delete_spisok(var L:Second);
var NowElem,ElemWasDel:dvuh_svyazniy_spisok;
    DelEl,Num:integer;
begin
   WriteLn('Сколько удалить'' элементов:');
   ReadLn(DelEl);
   NowElem:=L.fir;
   Num:=1;
    while Num<>DelEl+1 do
      begin
         L.fir:=NowElem^.next;
         ElemWasDel:=NowElem;
         NowElem:=NowElem^.next;
         dispose(ElemWasDel);
         Num:=Num+1;
      end;

end;
Procedure Delet_podspisok( ElemOfStr: odnosvyazniy_spisok ); 
var q, p: odnosvyazniy_spisok; 
begin 
  if ElemOfStr^.next <> nil then begin
    q:= ElemOfStr^.next;
    p:= ElemOfStr^.next;
    ElemOfStr^.next:= p^.next;
    dispose( q ); 
  end 
end;
Procedure proizvedenie;
var 
P: real;
S:odnosvyazniy_spisok;
begin 
P:=1;
repeat
P:=P*S^.data;
S:=S^.next;
until S=nil;
end;
Procedure Razdelitel;
type
spisok=odnosvyazniy_spisok;
var
r:spisok;
head1,head2:spisok;
b:real;
cur : odnosvyazniy_spisok;
    begin
      Writeln('Введите элементы подсписка                   ');
      New(r);
      r^.Next:=nil;
      r^.Data:=b;
    end;
  begin     
    Writeln('Введите элемент,после которого список будет разделен', head2,' ');
    Readln(head2);
    head2:=nil
    begin  cur:=head2;
      while cur^.next<>nil do cur:=cur^.next;
      cur^.next:=head2;
   end;
end;
Procedure kolichestvo;
var
r:odnosvyazniy_spisok;
k,kol:integer;
begin
 while (r<>nil) or (r^.data<>k) do
  r:=r^.Next;
 kol:=0;
 while r^.Next<>nil do 
 begin
  inc(kol);
  r:=r^.Next
 end;
end;
Function MainMenu:boolean;
const
 i:integer=1;
begin
  MainMenu:=false;
  clrscr;
  Writeln(Inv1);
  Writeln(Inv2);
  Writeln(Inv3);
  Writeln(Inv4);
  Writeln(Inv5);
  Writeln(Inv6);
  Writeln(Inv7);
  Writeln(Inv8);
  Writeln(Inv9);
  Writeln('Выход');
  OutMessageXY(5,24,CaseStr,Enter);
  Gotoxy(1,i);
  repeat
    ch:=readkey;
    if(ch=#32)or(ch=#13)then
      begin
        case i of
          1:sozdanie_spisok;
          2:sozdanie_podspisok;
          3:Add_spisok;
          4:Add_podspisok;
          5:Delete_spisok;
          6:Delete_podspisok;
          7:proizvedenie;
          8:Razdelitel;
          8:kolichestvo; 
          8:begin
              MainMenu:=true;
              Exit;
            end;
          end;
        end
      else UpDown(i,8);
    until false;
  end;
begin
  clrscr;
  repeat until MainMenu;
end.
плиз,проверьте!!!%)
0
Дашустрик
Дашики
7 / 7 / 1
Регистрация: 26.09.2008
Сообщений: 477
05.03.2009, 12:51  [ТС] 26
ну так как?
0
05.03.2009, 12:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.03.2009, 12:51

Двунаправленный неупорядоченный список. Ошибка Встречено '=', а ожидалось ';'
делал задачку и вот возникла проблемка: Строка 162 : Встречено '=', а...

Двунаправленный линейный список. Не могу найти ошибку
Программа, которая выполняет следующие операции с двунаправленным линейным...

Кольцевой двунаправленный список: удалить все элементы, у которых одинаковые соседи
Дан кольцевой двунаправленный список. Из списка L удалить все элементы у...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru