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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2008, 19:41   #1
Никита35
Пользователь
 
Регистрация: 24.04.2008
Сообщений: 24
Восклицание Паскаль,списки.Срочно,пожалуйста...

Дорешите,пожалуйста задачи:
1)Даны два списка L1 и L2. Считая,что элементы списков упорядочены по неубыванию,вставить элементы списка L2 в список L1 так,чтобы он остался упорядоченным по неубыванию.
Вот мои наработки: эта программа только выводит и сортирует один список,а как вывести второй и соединить-я не знаю((((
Uses
Crt;

Type
Index = real;
Index2 = integer;
PList2 = ^TList2;
TList2 = record
info: Real;
pred, next : PList2;
end;

Var
head : PList2;
n : index2;

{Процедура формирования односвязного списка}
Procedure MakeList (Var Head:PList2; Var n:index2);
Var
I : Index2;
p : PList2;
Begin {MakeList}
Writeln('Введите количествоэлементов списка*');
Readln(n);
Randomize;
{Формирование списка*}
New(head); {Сторож-головной элемент}
Head^.next:=head;
Head^.pred:=head;
writeln('Введите последовательно элементы списка*');
For i:=1 to n do
Begin
New(p);
p^.info:=Random(1000)/10;
p^.next:=head;
p^.pred:=head^.pred;
p^.pred^.next:=p;
head^.pred:=p;
End;
End; {Print}
{Процедура выводит элементы списка на экран}

Procedure Print ( Head:PList2);
Var
p : PList2;
Begin {Print}

{Вывод списка на экран}
p:=head^.next;
while p<>head do
begin
write(p^.info:5:1);
p:=p^.next;
end;
writeln;
End; {Print}

{Процедура обменивает ссылочные части элемента p и следующего за ним}
Procedure SwapList (P :PList2);
Begin {Swaplist}

p^.next^.next^.pred:=p^.next^.pred;
p^.pred^.next:=p^.next;
P^.next^.pred:=p^.pred;
P^.pred:=p^.next;
p^.next:=p^.pred^.next;
p^.pred^.next:=p^.next^.pred;
End; {Swaplist}

{Сортировка методом пузырька (оптимизированная)}
Procedure Sorting (Head:PList2);
Var
p,t,bound:Plist2;
Begin {Sorting}
Bound:=head^.pred;
Repeat
p:=head^.next;
T:=nil;
While (p<>bound) and (p^.next<>head) do
If (p^.info>p^.next^.info) then
Begin
SwapList (p);
T:=p^.pred^.next;
End
Else
p:=p^.next;
bound:=t;
Until (t=nil)
End; {Sorting}

Begin {Program}
Clrscr;
Writeln ('Программа сортирует созданный линейный список из n элементов');
Writeln;
MakeList(head,n);
Print(head);
Sorting (Head);
Writeln;
Writeln ('Отсортированный список');
Print(head);
Writeln('Нажмите любую клавишу');
Repeat
Until KeyPressed;

End. {Program}


2)Дан список из n целых чисел. Исключить из списка элементы с минимальным значением:

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

program L01;
uses crt;
type
PList = ^TList;
TList = record
info: integer;
a: integer;
next : PList;
end;
var
head: PList;
z: integer;

{Формирование списка}
procedure MakeList(var head:PList);
var
p,q : PList;
n,i : integer;
begin
writeln('Введите количество элементов списка*');
readln(n);
randomize;
{Формирование списка}
new(head); {Сторож-головной элемент}
head^.next:=nil;
p:=head;
for I:=1 to n do
begin
new(q);
q^.a:=random(100);
q^.next:=nil;
p^.next:=q;
p:=q;
end;
end;

{Вывод списка на экран}
procedure WriteList(var head:PList);
var
p: PList;
begin
p:=head^.next;
while p<>nil do
begin
write(p^.a:6);
p:=p^.next;
end;
end;

{Процедура нахождения минимального элемента*}
procedure Minim(var head:PList);
var
p : PList;
min : integer;
begin
p:=head^.next;
min:=p^.info;
while p<>nil do
begin
if p^.info < min then
min:=p^.info;
p:=p^.next;
end;
writeln(min);
end;
{Процедура удаления мин. элемента*}
procedure Delete(var head:PList);
var
min:integer;
p,q:PList;
begin
q:=head;
p:=head^.next;
while p<>nil do
begin
if p^.info = min then
begin
q^.next:=p^.next;
dispose(p);
p:=q^.next;
end;
end;
end;

begin
clrscr;
MakeList(head);
WriteList(head);
writeln;
Minim(head);
writeln;
writeln('Введите 1,чтобы удалить минимальный элемент:');
read(z);
if z=1 then
Delete(PList);
repeat until keypressed;
end.


********СПАСИБО********
Никита35 вне форума Ответить с цитированием
Старый 05.05.2008, 21:25   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Сначала по второй:

Цитата:
минимальный элемент находится некорректно
В процедуре minim для сравнения используется info, а заполнения этого
поля при создании списка нет.

Удаление по логике должно вызываться delete(head).
Вы удаляете минимальный элемент, а переменная min у Вас локальна и ее значение неопределено.
Сделайте ее глобальной. Нет вывода списка после удаления. В самом удалении Вы теряете элементы.
Посмотрите на это:

Код:
procedure Delete(var head:PList);
var p,q:PList;
begin
   q:=head;
   p:=head^.next;
   while p <> nil do begin
      if p^.a = min then begin
         q^.next := p^.next;
         dispose(p);
         p:=q^.next;
      end else begin;
         q := p;
         p := p^.next;
      end;
   end;
end;
Теперь по первой.
Вы уже задавали этот вопрос. Теперь хотя-бы есть какие-то наработки.
Зачем Вы делаете двухсвязный список ? В задании по-моему про это не сказано. Почему-бы не взять из второй задачи заполнение списка. Про сортировку в задании то-же ничего не сказано. Можно сразу взять два отсортированных списка. В чем проблема со слиянием ? Сделайте хотя-бы заполнение двух списков.
alexBlack вне форума Ответить с цитированием
Старый 05.05.2008, 22:37   #3
Никита35
Пользователь
 
Регистрация: 24.04.2008
Сообщений: 24
По умолчанию

А...по второй задачке по поводу того,что минимальный элемент находится некорректно...Можно уточнить вплоть до алгоритма? пожалуйста...
Никита35 вне форума Ответить с цитированием
Старый 05.05.2008, 22:43   #4
Никита35
Пользователь
 
Регистрация: 24.04.2008
Сообщений: 24
По умолчанию

А по первой...преподаватель все же придирается и требует сортировать список автоматически...
Никита35 вне форума Ответить с цитированием
Старый 05.05.2008, 22:56   #5
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Никита35 Посмотреть сообщение
А...по второй задачке по поводу того,что минимальный элемент находится некорректно...Можно уточнить вплоть до алгоритма? пожалуйста...
Алгоритм у Вас правильный. Только зачем Вы используете info. Это поле у Вас нигде не заполняется.

Код:
procedure Minim(var head:PList);
var p : PList;
begin
   p:=head^.next;
   min:=p^.a;
   while p<>nil do begin
      if p^.a < min
      then min:=p^.a;
      p:=p^.next;
   end;
   writeLn(min);
end;
Цитата:
А по первой...преподаватель все же придирается и требует сортировать список автоматически...
Ну, раз надо, значит надо...
Введите две головы: head1 и head2.
Для каждой вызовите процедуры ввода и сортировки. С этим-то, надеюсь, разберетесь.
alexBlack вне форума Ответить с цитированием
Старый 05.05.2008, 23:03   #6
Никита35
Пользователь
 
Регистрация: 24.04.2008
Сообщений: 24
По умолчанию

Спасибо! Программа почти работает,но после нажатия "1",найденный элемент всеже не удаляется...
Никита35 вне форума Ответить с цитированием
Старый 06.05.2008, 08:00   #7
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Никита35 Посмотреть сообщение
Спасибо! Программа почти работает,но после нажатия "1",найденный элемент всеже не удаляется...
А почему бы не пройти по шагам в отладчике и не посмотреть ?
alexBlack вне форума Ответить с цитированием
Старый 06.05.2008, 11:25   #8
Никита35
Пользователь
 
Регистрация: 24.04.2008
Сообщений: 24
По умолчанию

Всё!!!!!!Со второй задачей расправился!!!!
Спасибо вам огромное!!)))))))
Щас сяду за первую....
Никита35 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ПАСКАЛЬ.помогите пожалуйста срочно сделать задачу, завтра зачет. Absent Помощь студентам 14 15.06.2009 19:50
Срочно,пожалуйста...паскаль динамич. списки Никита35 Помощь студентам 2 07.05.2008 22:48
Списки. Паскаль Demyrg Помощь студентам 2 10.04.2008 08:20
Списки(помогите срочно) Coach2 Паскаль, Turbo Pascal, PascalABC.NET 1 30.03.2008 20:32
Паскаль. Списки Freem Паскаль, Turbo Pascal, PascalABC.NET 2 11.05.2007 14:22