Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.02.2012, 18:57   #1
RakNaGore
Пользователь
 
Регистрация: 10.07.2011
Сообщений: 12
Восклицание Динамические структуры данных - работа со списками (Pascal)

Программа удаляет, добавляет и просматривает записи. Список - однонаправленный. Поле .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.

Последний раз редактировалось RakNaGore; 13.02.2012 в 19:02.
RakNaGore вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Pascal] Динамические и статические структуры Bolverk Помощь студентам 4 27.12.2011 14:59
динамические структуры данных pascal [VENOM] Помощь студентам 0 25.05.2011 20:31
Динамические структуры данных: работа со списком галечка26 Паскаль, Turbo Pascal, PascalABC.NET 3 06.01.2011 18:57