Помощь - Поиск - Пользователи - Календарь
Полная версия: вставить элемент в I-ю позицию списка
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Wait
Здравствуйте, у меня тут прога со списком с ООП...
Не получается вставить в процедуре obj.insert со второго по шестой элемент...
Надо ввести номер позиции для ввода и что вводить...
Получилось ввести только первый элемент...
Проверьте, пожалуйста, а то уже плохо мне от этой проги... :molitva:
Код

program ex1;
uses crt;
type p=^el;
el=record
data:byte;
next:p;
end;
obj=object
root,last,l:p;
id:string[5];
constructor init;
procedure build;
procedure output;
procedure insert;
end;
constructor obj.init;
begin
root:=nil;
last:=nil;
new(l);
end;
procedure obj.build;
var eli:p;i:byte;
begin
randomize;
write('input list id: ');
readln(id);
writeln('list ',id,':');
new(root);
root^.data:=random(10);
eli:=root;
for i:=2 to 5 do begin
new(eli^.next);
eli^.next^.data:=random(10);
eli:=eli^.next
end;
eli^.next:=nil;
end;
procedure obj.output;
var eli:p;
begin
eli:=root;
while eli<>nil do begin
writeln(eli^.data);
eli:=eli^.next;
end;
end;
procedure obj.insert;
var eli,mem:p;d,i,k:byte;
begin
write('input element to insert: ');
readln(d);
write('input the position for inserting of ',d,': ');
readln(i);
if (i=1) then begin
new(eli);
eli^.data:=d;
eli^.next:=root;
if (eli^.next=nil) then eli^.next^.next:=nil;
root:=eli;
end else if (i=2) then begin
mem:=eli^.next;
new(eli^.next);
eli:=eli^.next;
eli^.data:=d;
eli^.next:=mem
end else begin
for i:=3 to 5 do eli:=eli^.next;
mem:=eli^.next;
new(eli^.next);
eli:=eli^.next;
eli^.data:=d;
eli^.next:=mem
end;
end;
var list:obj;
begin
list.build;
list.output;
list.insert;
writeln('---------------');
list.output;
readln
end.
hiv
В процедуре вставки элемента списка сразу увидел пару оплошностей:

1) при вставке перед первым элементом списка root надо выкинуть бесполезную строку
if (eli^.next=nil) then eli^.next^.next:=nil;
Скорее там должна быть проверка на пустой список, если root=nil (пустой список), то тогда первым элементом будет тот, что вставляем: root:=eli;

2) при вставке после root элемента нужно сместиться на i позиций, поэтому использование цикла
for i:=3 to 5 do eli:=eli^.next;
совершенно бессмысленно, ибо мы теряем значение пременной i.
Нужно взять другую переменную и сместиться i-2 раз. Например:
eli:=root;
for j:=1 to (i-2) do eli:=eli^.next;
Wait
Код

procedure obj.insert;
var eli,mem:p;d,i,k:byte;
begin
write('input element to insert: ');
readln(d);
write('input the position for inserting of ',d,': ');
readln(i);
if (i=1) then begin
new(eli);
eli^.data:=d;
eli^.next:=root;
if (eli^.next=nil) then eli^.next^.next:=nil;
root:=eli;
end else begin
eli:=root;
for k:=1 to k-2 do eli:=eli^.next;
mem:=eli^.next;
new(eli^.next);
eli:=eli^.next;
eli^.data:=d;
eli^.next:=mem
end;
end;


так? не получается все равно... Пожалуйста, напишите, как точно надо
Wait
Исправьте, пожалуйста, а то у меня уже голова не варит :molitva: :molitva: :molitva:
hiv
Учите матчасть, я уже все разжевал... Учите циклы... А еще лучше отоспитесь и под подушку положите книжку великого писателя Вирта!
volvo
Wait, вопрос на засыпку: Ты действительно хочешь изобрести велосипед, а не пользоваться готовым решением, которое есть в FAQ-е? (Не то, которое в теме "Все о динамических структурах данных", ибо там без ООП, а то, которое здесь: FAQ: Объектно-ориентированное программирование). Основываясь на этом объекте можно дописать 1 (!) функцию, и он будет работать так, как тебе нужно. Ну, если не хочешь - я просто предложил... rolleyes.gif
Wait
Всем огромное спасибо, уже все работает...
Век буду благодарен
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.