Консультация № 160041
09.02.2009, 20:45
0.00 руб.
0 11 1
Доброго времени суток! Помогите решить задачу, тема Указатели и динамическая память:
Описать функцию или процедуру, которая: меняет местами первый и последний элементы непустого списка L;

Обсуждение

давно
Старший Модератор
31795
6196
10.02.2009, 14:14
общий
это ответ
Здравствуйте, Korniychug Petro Dmytrovich!

Программа в приложении.
Коментировал только процедуру modifyList. Программа написана под ТР 7.0.
Удачи!

Приложение:
type
isType=^isList;
isList=record
data:integer;
next:isType;
end;
var
a:isType;
procedure createList(var d:isType;c:integer);
var
b:isType;
begin
while c>0 do
begin
new(b);
b^.data:=random(20);
b^.next:=d;
d:=b;
dec(c);
end;
end;
procedure outputList(b:isType);
begin
while b<>nil do
begin
write(b^.data:4);
b:=b^.next;
end;
end;
procedure modifyList(var b:IsType);
var
c:isType;
begin
c:=b;
{ищем конец списка}
while c^.next^.next<>nil do
c:=c^.next;
{закольцовываем его исключая первый элемент}
c^.next^.next:=b^.next;
{устанавливаем первый элемент перед последним}
b^.next:=c^.next;
{переключаем связи}
c^.next:=b;
{сохраняем голову списка и разрываем кольцо}
b:=b^.next;
c^.next^.next:=nil;
end;
procedure deleteList(var b:isType);
var
c:isType;
begin
repeat
c:=b;
b:=b^.next;
dispose(c);
until b=nil;
end;
begin
{создаем список}
a:=nil;
createList(a,10);
{выводим исходный список}
outputList(a);
writeln;
{изменяем список}
modifyList(a);
{выводим результат и освобождаем память}
outputList(a);
deleteList(a);
readln;
end.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
13.02.2009, 19:10
общий
В методических указаниях к задаче сказано что :Если задание связано со списком, то размер списка неопределен, так как он размещается в динамической памяти. Должен быть признак окончания формирования списка. Отсюда вопрос : что это за признак такой?
давно
Старший Модератор
31795
6196
13.02.2009, 20:32
общий
На примере одной из подпрограм:
Код:
procedure deleteList(var b:isType);
var
c:isType;
begin
repeat
c:=b;
b:=b^.next;
dispose(c);
until b=nil;Признак окончания списка константа NIL
end;

Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
13.02.2009, 21:02
общий
А скажите ещё можно ли сделать что б программа каждый раз формировала список разной величины и разного заполнения???
давно
Старший Модератор
31795
6196
13.02.2009, 21:30
общий
меняете вызов подпрограммы, и получаете удовольствие:
randomize;
createList(a,random(27)+4);

4- это минимальное число с которым работает modifyList(a)
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
25.02.2009, 00:03
общий
А как сделать чтоб можно было вводить список до того времени пока не введу некоторое слово ( например Stop) и после этого слова начинаеться обмен последнего и первого елементов списка.
давно
Старший Модератор
31795
6196
25.02.2009, 11:17
общий
b^.data:=random(20); эта строка формирует значения. Вам нужно поменять сам тип переменной, т.е. b^.data должна быть определена как строка. А проверку if b^.data<>'stop' then . . . думаю написать труда не составит.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
25.02.2009, 19:55
общий
Извините, но уменя есть ещё вопросы: почему после ввода значений списка список формируется наоборот ( например : я ввожу 4 1 2 6 7 4 3 и мой список записан как 3 4 7 6 2 1 4)
давно
Старший Модератор
31795
6196
25.02.2009, 20:07
общий
Он построем по стековому принципу, т.е. в голове списка будет всегда последний введенный элемент.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
25.02.2009, 20:22
общий
И ещё : я изменил тип переменной data из integer на string заменил строку b^.data:=random(20) на readln(b^.data) но всё же я не могу разобратся с проверкой , я пробовал некоторые комбинации и в результате добился только того что при вводе "стоп" заканчивался ввод данных и выводился список но последним елементом в нём было слово "стоп" (( , подскажыте как организовать проверку.
давно
Старший Модератор
31795
6196
26.02.2009, 17:10
общий
Так:
Код:
  type
isType=^isList;
isList=record
data:string;
next:isType;
end;
var
a:isType;
procedure createList(var d:isType);
var
b:isType;
c:string;
begin
repeat
readln(c);
if c<>'stop' then
begin
new(b);
b^.data:=c;
b^.next:=d;
d:=b;
end;
until c='stop;
end;
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа