Надо добавить элемент вслед за к-ым. Что здесь не правильно? Сейчас он ставит его вслед за к-ым, но при этом удаляет всё, что после него.
Procedure AddNewNode (var p:Dlist; info,k:integer); var q:Dlist; i:integer; begin i:=1; New(q); if (p = nil) then begin writeln ('vvedite info:'); readln(info); q^.info:=info; q^.next:=q; q^.prev:=q; p:=q; exit; end else begin writeln ('vvedite k:'); readln (k); q:=p^.next; while (q<>p) and (i<k) do begin q:=q^.next; i:=i+1; end; if i<>k then writeln ('nepravilniy nomer') else begin if (i=k) then begin writeln ('vvedite info:'); readln(info); q^.info:=info; q^.prev:=p^.prev; q^.next:=p; p^.prev^.next:=q; p^.prev:=q; end; end; end; end;
volvo
14.05.2007 19:53
Цитата
Что здесь не правильно?
Последовательность действий... Ты должен сначала найти место, в которое будешь добавлять новый элемент, и только потом забирать память через New, иначе у тебя просто будет утечка памяти, ты ж не удаляешь нигде тот элемент, после выделения памяти для которого происходит ошибка "nepravilniy nomer"...
Ну, а само добавление будет делаться так: (пусть q - адрес элемента, ПОСЛЕ которого должен быть добавлен новый)
new(pp); { <--- новая переменная, не используй то, что уже используется где-то } pp^.next := q^.next; pp^.prev := q; pp^.next^.prev := pp; q^.next := pp; pp^.info := ...
Everveit
14.05.2007 20:10
Спасибо большое за совет. Пойду ещё подумаю, может получится...
Everveit
14.05.2007 20:41
Слушай! Всё почти-почти получается за исключением мааааленькой детали. Теперь он добавляет его не после к-ого, а на одну дальше! Например, я говорю "к=2", а он мне ставит его на 4-ую позицию...Это должно быть что-то простое... И, кстати, у меня с удалением узла то же самое, так что это важно очень.
Procedure AddNewNode (var p:Dlist; info,k:integer); var newnode:Dlist; q,pp:Dlist; i:integer; begin i:=1; if (p = nil) then begin New(q); writeln ('vvedite info:'); readln(info); q^.info:=info; q^.next:=q; q^.prev:=q; p:=q; exit; end else begin writeln ('vvedite k:'); readln (k); {if k=1 then p:=q;}
q:=p^.next; while (q<>p) and (i<k) do begin q:=q^.next; i:=i+1; end;
if i<>k then writeln ('nepravilniy nomer') else begin if (i=k) then begin new(pp); writeln ('vvedite info:'); readln(info); pp^.next:=q^.next; pp^.prev:=q; pp^.next^.prev:=pp; q^.next:=pp; pp^.info:=info; end; end; end; end;
volvo
14.05.2007 21:13
Так работает?
procedure AddNewNode(var p:Dlist; info:integer); { Зачем тебе передавать К, если ты все равно его запрашиваешь? }
var q, pp:Dlist; i, k:integer;
begin if p = nil then begin New(q); writeln ('vvedite info:'); readln(info); q^.info :=info; q^.next := q; q^.prev := q; p := q; { Здесь Exit был лишним } end
else begin writeln('vvedite k:'); readln(k);
q := p^.next; i := 1; if p = q then dec(i); while (q <> p) and (i < k - 1) do begin q := q^.next; i := i + 1; end;
if i <> k - 1 then writeln ('nepravilniy nomer') else begin new(pp); writeln('vvedite info:'); readln(info); pp^.next := q^.next; pp^.prev := q; pp^.next^.prev := pp; q^.next := pp; pp^.info := info; end; end; end;
Everveit
14.05.2007 22:49
ДАААААА!!!!!!!!!!!!!!!!!!!! Спасибо тебе огроменное! Просто ты мне очень очень очень очень помог! Бывают же на свете добрые люди! *прыгает от счастья*
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.