Программа удаляет, добавляет и просматривает записи. Список - однонаправленный. Поле .next содержит ссылку на следующий элемент.
Проблема с пунктом меню под номером 4 (удаление записи, указывая её позицию). Идея такая: сначала я нахожу эту ссылку (процедурой FindPointByPosition), дальше процедурой DeleteByPoint её удаляю. Скорее всего проблема в FindPointByPosition, потому-что в пункте меню под номером 5 тоже применяется процедура DeleteByPoint, ещё и в цикле.
Скрин работы:
Код:
PROGRAM lab2;
USES
Crt;
TYPE
TPoint = ^TCar;
TCar = record
//cost, speed, fuel : integer;
//stolen : boolean;
//model, countrymade : string[20];
mydata : integer;
next : TPoint;
end;
VAR
PointOnFirst, PointOnLast: TPoint;
number, count : byte;
Procedure FindPointByPosition(PointOnFirst : TPoint; var PointOn : TPoint; pos : integer);
var
i : integer;
begin
for i := 1 to pos do PointOnFirst := PointOnFirst^.next;
PointOn := PointOnFirst;
end;
Procedure GetInfoAboutCar(var Car : TCar);
//var
//yn : char;
begin
with Car do
begin
{Write('Cost, speed, fuel: '); ReadLn(Cost, speed, fuel);
Write('Stolen? y/n: '); ReadLn(yn);
if yn = 'y' then stolen := true else stolen := false;
Write('Model: '); ReadLn(model);
Write('In which country it was made: '); ReadLn(countrymade);}
Write('Chislo: '); ReadLn(mydata);
end;
end;
Procedure ShowInfoAboutCar(Car : TCar);
begin
Write(Car.mydata);
end;
Procedure AddToBegin(var PointOnFirst : TPoint; Car : TCar);
var
x : TPoint;
begin
New(x);
x^ := car;
x^.next := PointOnFirst;
PointOnFirst := x;
end;
Procedure AddNToBegin(var PointOnFirst : TPoint; n : integer);
var
i : integer;
car : TCar;
begin
for i := 1 to n do
begin
GetInfoAboutCar(Car);
AddToBegin(PointOnFirst, Car);
end;
end;
Procedure AddToEnd(var PointOnLast : TPoint; Car : TCar);
begin
car.next := nil;
New(PointOnLast^.next);
PointOnLast^.next^ := car;
PointOnLast := PointOnLast^.next;
end;
Procedure AddNToEnd(var PointOnLast : TPoint; n : integer);
var
i : integer;
car : TCar;
begin
for i := 1 to n - 1 do
begin
GetInfoAboutCar(Car);
AddToEnd(PointOnLast, Car);
end;
end;
Procedure WatchListFromFirst(PointOnFirst: TPoint; n : integer);
var
i : integer;
begin
for i := 1 to n do
begin
ShowInfoAboutCar(PointOnFirst^);
PointOnFirst := PointOnFirst^.next;
end;
end;
Procedure DeleteByPoint(var PointOn : TPoint);
var
x : TPoint;
begin
x := PointOn;
PointOn := PointOn^.next;
Dispose(x);
end;
Procedure DeleteNFromBeginning(var PointOnFirst : TPoint; n : integer);
var
i : integer;
begin
for i := 1 to n do DeleteByPoint(PointOnFirst);
end;
Procedure Menu(var number : byte);
begin
WriteLn('Records: ', count);
WriteLn('1. Create list');
WriteLn('2. Add one record to end of list');
WriteLn('3. Add some records to beginning of list');
WriteLn('4. Delete one record by position');
WriteLn('5. Delete some records from beginning of list');
WriteLn('6. Look through some records from beginning of list');
WriteLn('7. Exit');
repeat
Write('Choose number of operation: ');
ReadLn(number);
until ((number > 0) and (number <= 7));
end;
Procedure Execute(number : byte);
var
n : integer;
car : TCar;
PointOn : TPoint;
begin
case number of
1 : begin
Write('How many records: ');
ReadLn(n);
if n > 0 then
begin
count := n;
New(PointOn);
GetInfoAboutCar(PointOn^);
PointOnFirst := PointOn;
PointOnLast := PointOn;
AddNToEnd(PointOnLast, n);
end else WriteLn('Incorrect value');
end;
2 : begin
GetInfoAboutCar(Car);
AddToEnd(PointOnLast, Car)
end;
3 : begin
Write('How many records: ');
ReadLn(n);
if n >= 0 then
begin
count := count + n;
AddNToBegin(PointOnFirst, n)
end else WriteLn('Incorrect value');
end;
4 : begin
Write('Choose position: ');
ReadLn(n);
if (n > 0) and (n <= count) then
begin
count := count - 1;
FindPointByPosition(PointOnFirst, PointOn, n);
DeleteByPoint(PointOn);
end else WriteLn('Incorrect value');
end;
5 : begin
Write('How many records: ');
ReadLn(n);
if (n > 0) and (n <= count) then
begin
count := count - n;
DeleteNFromBeginning(PointOnFirst, n);
end else WriteLn('Incorrect value');
end;
6 : begin
Write('How many records: ');
ReadLn(n);
if (n > 0) and (n <= count) then
begin
WatchListFromFirst(PointOnFirst, n);
WriteLn;
end else WriteLn('Incorrect value');
end;
7 : WriteLn('Finished');
end;
end;
BEGIN
count := 0;
ClrScr;
repeat
Menu(number);
Execute(number);
until number = 7;
ReadLn;
END.