Люди помогите!!! Плз... Задача звучит так:
"ВВодится некоторая последовательность букв русского алфавита и записывается в памяти в виде линейного списка. Определить упорядочена ли последовательность по алфавиту( если нет, то упорядочить), заменить выбранную K-ую букву на Q-ю, поменять местами первую и последнюю буквы...
Люди, пожалуйста, подскажите как это делать и приведите примеры кусочков кода (полный мне не нужен, хочу сам разобраться, но для этого нужно небольшое ускорение) Пожалуйста, подскажите что и как...
http://forum.pascal.net.ru/index.php?showtopic=2706
Почитал, многое понял...
Но тогда подскажите, в чем может быть ошибка в этой процедуре:
QDe5n1K
Код должен выглядеть вот так:
Ладно, вот еще
Я собираюсь поменять число под номером P на число под номером Q...
QDe5n1K
Если честно, я не совсем понял, что нужно найти, но вообще-то, чтобы найти элемент списка под номером X, пользуются такой конструкцией:
то есть вышеприведенный код может быть переписан вот так:
writeln('Введите номер числа, которое вы хотите найти'); readln(p);
while p<>0 do
begin
g:=g^.next; dec(p)
end;
procedure change_p_to_q(var g:plist; var a:char);
var p,q:word;
x:char;
T: plist; {обязательно сохраняем исходное значение G }
begin
T := g;
writeln('Введите номер числа, которое вы хотите заменить'); readln(p);
writeln('Введите номер числа, на которое вы хотите поменять число под номером',p); readln(q);
while q<>0 do {здесь я пытаюсь искать букву под номером q - то, на что буду менять}
begin
g:=g^.next; dec(q)
end;
x := g^.a; { сохраняем букву, на которую будем менять }
g := T; { восстанавливаем список }
while p<>0 do {здесь ищу ту букву, которую нужно поменять - p}
begin
dec(p); g:=g^.next;
end;
{собственно присваиваю символьной переменной, находящейся по этому адресу значение x,
то бишь значение символа под номером q}
g^.a:=x;
end;
Нет, не просто ;)
while assigned(p) do
begin
write(p^.a,' ');
p:=p^.next;
end;
В итоге у меня все зацикливается и не реагирует ни на что Блин, может у меня повторяется все одна и та же ошибка? Подскажите, плз!
while assigned(p^.next) do begin
pp:=p;
while assigned(p^.next) do begin
ppp:=p^.next;
if ppp^.a>pp^.a then
begin
tmp:=ppp^.a;
ppp^.a:=pp^.a;
pp^.a:=tmp;
end;
ppp:=ppp^.next;
end;
pp:=pp^.next;
end;
{здесь я заканчиваю сортировать и пробую вывести результат}
while assigned(p^.next) do
write(p^.a,' ');
QDe5n1K
Вот код процедуры open
А в файл все буквы записываются как и положено, слева направо... открывал блокнотом и проверял
procedure view_list(p:plist; a:char);
begin
while p<>nil do
begin
write(p^.a , ' ');
p:=p^.next;
end;
end;
procedure open(var p:plist;var a:char);
var filex:text;
s:string;
pp:plist;
begin
firstofall;
nameoffile(s);
assign(filex,s);
reset(filex);
while not eof(filex) do
begin
new(pp);
pp^.next:=p;
read(filex, pp^.a);
p:=pp;
end;
pp:=p;
view_list(pp,a);
readkey;
end;
Werwolf86
А откуда, интересно, выделяется память? (Heap - это все-таки "куча")
Куча, куча, volvo прав ;)... и все же, что же не так в моей программе, помогите найти ошибку
QDe5n1K
А ошибка в том, что ты добавляешь новый элемент в начало списка, а нужно добавлять в конец...
Что это значит? Это значит, нужно ввести дополнительную переменную "at_end" того же типа, как и "p", которая всегда будет указывать на конец списка, и добавлять данные по приведенной выше схеме в конец списка... :yes:
{добавление в начало списка выглядит так:}
{пусть p - начало списка}
new(pp);
pp^.a := ...;
pp^.next := p;
p := pp;
{добавление в конец списка выглядит так:}
{пусть p - начало списка, at_end - конец списка}
new(pp);
pp^.a := ...;
pp^.next := nil;
if p = nil then p := pp else at_end^.next := pp;
at_end := pp;
Хм... ну тогда по идее можно ограничится вариантом без дополнительных указателей:
Разве не так?
p:=nil;
while not eof(filex) do
begin
new(p);
read(filex, p^.a);
write(p^.a,' ');
p^.next:=nil;
p:=p^.next;
end;
p^.next:=nil;
end;
По идее должно работать, но не работает
procedure sort(var p:plist);
var tmp:char;
flag:boolean;
a:char;
begin
repeat
flag:=false;
while assigned(p^.next) do
begin
if p^.a>p^.next^.a then
begin
tmp:=p^.a;
p^.a:=p^.next^.a;
p^.next^.a:=tmp;
flag:=true;
end;
end;
until flag=true;
while assigned(p) do
write(p^.a,' ');
readln;
end;
QDe5n1K
А вообще, могу тебе посоветовать такой способ работы со списком, как написать программу на листе бумаги, а потом рядом с ней попытаться нарисовать список, вручную проходя по строчкам программы (и выполняя те же действия, которые должна выполнять программа)... Вот это выявляет все ошибки (проверено неоднократно) :yes:
p:=nil;
while not eof(filex) do
begin
new(p);
read(filex, p^.a);
write(p^.a,' ');
p^.next:=nil; p:=p^.next;
{ После выполнения этих 2-х команд p ВСЕГДА будет равняться nil,
т.е. данные не будут связаны одно с другим... }
end;
p^.next:=nil; { ... и эта команда будет ошибочной }
end;
Вот блин, опять проблема... которая кажется мне неразрешимой ))
Так вот, проблема заключается в том, что данные из файла я считать то считал, но КАК СДЕЛАТЬ, ЧТОБЫ ЭТИ ДАННЫЕ ВЫВОДИЛИСЬ? Я так понял, что нужно p присвоить p начальное... но как это сделать, в толк никак не возьму А так, вроде во всем разобрался...
procedure open(var p:plist);
var filex:text;
s:string;
flagg,x:shortint;
last,first,pp:plist;
a:char;
begin
{...............}
assign(filex,s);
reset(filex);
last:=nil;
while not eof(filex) do
begin
new(p);
p:=last;
read(filex, p^.a);
last:=p^.next;
end;
{*}
while p<>nil do begin
write(p^.a,' ');
p:=p^.next; end;
end;
last:=nil;Итак: last:=nil;
while not eof(filex) do
begin
new(p);
p:=last;
read(filex, p^.a);
last:=p^.next;
end;
так... зачем тебе last и pp ?
(прости, нет времени просматривать предыдущие посты)
так я делал сегодня:
function load:plist;набирал тут, так что могут быть ошибки....
var begin,temp:plist; f:text;
begin
assign(f,'file.dat');
reset(f);
new(temp);
begin:=temp;
while not eof(filex) do
begin
read(f,temp^.a);
temp^.next:=new(plist);
end;
temp^.nex:=nil; {в целесообразности не уверен}
load:=begin;
end;
procedure show_list(as: Plist);
begin
while as^.next<>nil do
begin
writeln(as^.a);
as:=as^.next;
end;
end;
Бродяжник
Ну, если уже вводить дополнительную переменную, которая укажет на конец списка, то я бы делал вот так:
QDe5n1K, я же этот способ описывал раньше... почему не используем?
procedure open(var p:plist);
var
pp:plist;
iterator: plist;
begin
p := nil; { пишем в пустой список }
while not eof(filex) do
begin
new(pp);
read(filex, pp^.a);
pp^.next := nil;
if p = nil then p := pp else iterator^.next := pp;
iterator := pp;
end;
end;
volvo
Да, это лучше. :P
Lioresal Acheter En France
Best Place Buy Strattera Atomoxetine
Levitra How Long To Work
Prix Amoxil En Pharmacie
Buy Lipitor Online With No Prescription