Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Разряженная матрица. Мультисписки.

Автор: kase666 22.12.2005 17:15

Вообщем тема...

Разряженая матрица в виде мультисписков.
Необходимо найти максимальный элемент и удалить строку и столбец его содержащие.
==================
В принципе проблем нет, НО - мульти списки...
В реале это просто:

MAX:=A[1,1];DEL_X:=1; DEL_Y:=1;
FOR I:=1 TO RAZ_Y DO BEGIN
FOR J:=1 TO RAZ_X DO
IF MAX<A[J,I] THEN
BEGIN
MAX:=A[J,I];
DEL_X:=J; DEL_Y:=I;
END;

RAZ_Y:=RAZ_Y-1;
FOR I:=DEL_Y TO RAZ_Y DO
FOR J:=1 TO RAZ_X DO
A[J,I]:=A[J,I+1];
RAZ_X:=RAZ_X-1;
FOR I:=1 TO RAZ_Y DO
FOR J:=DEL_X TO RAZ_X DO
A[J,I]:=A[J+1,I];

Но с указателями через динамическую память да еще списки...
Подскажите?

Автор: volvo 22.12.2005 17:44

kase666, погоди... У тебя уже задана матрица в виде мультисписка, или мультисписок еще надо организовать?

Автор: kase666 22.12.2005 18:23

матрица нулевая А[X, X] ее необходимо загрузить
из файла в виде мультисписка и выполнить операции...

Автор: volvo 22.12.2005 19:10

Повторяю вопрос: Мультисписок умеешь создавать, или нет?
(то, что работать с ним не умеешь - это понятно, но может уже есть хоть какая-то готовая реализация, в которую можно хотя-бы загрузить данные.)

Автор: kase666 22.12.2005 19:28

список создавать могу, простой...
но не для двухмерных матриц, парюсь с указателями...
вот процедурка для линейного
толкаюсь от нее, но как X, Y организовать не знаю

Код

        { загрузить список с файла }
           procedure Load(var f:FilType; start: AddrPointer):
                        AddrPointer;
           var
             temp, temp2: AddrPointer
             first: boolean;
           begin
             Writeln('load file');
             Reset(f);
             while start <> nil do begin  { освобождение памяти
                                           при необходимости }
               temp := start^.next
               dispose(start);
               start := temp;
             end;

             start := nil; last := nil;
             if not eof(f) then begin
               New(temp);
               Read(i, temp^);
               temp^.next := nil;  temp^.prior:= nil;
               load := temp;  { указатель на начало списка }
             end;

               while not eof(f) do begin
                 New(temp2);
                 Read(i, temp2^);
                 temp^.next := temp2; { построить список }
                 temp2^.next := nil;
                 temp^.prior := temp2;
                 temp := temp2;
               end;
               last := temp2;
             end; { конец загрузки }


тэги!

Автор: kase666 22.12.2005 21:51

Да ладно, ты с тэгами...
буду ставить.

Да ладно ? Это между прочим правила форума, если ты не в курсе, так вот я советую тебе пойти и прочитать их

Автор: volvo 22.12.2005 23:14

Ну, насчет прочитать матрицу в список списков, я набросал кое-что... Особо не тестировал, только сама идея. Но компиляцию проходит... Попробуй с использованием этого реализовать свое задание...

type
plist = ^tlist;
tlist = { это - список по строке }
record
col_num, value: integer;
next: plist;
end;

pvector = ^tvector;
tvector = { это - список самих строк }
record
row_num: integer;
next: pvector;
end;

var
f: text;
pl, pl_first, pl_last: plist;
pv, pv_first, pv_last: pvector;

i, j, X: integer;

begin
assign(f, '__razr.txt');
reset(f);

pv_first := nil; pv_last := nil;

i := 1;
while not seekeof(f) do begin

j := 1; pl_first := nil; pl_last := nil;

while not seekeoln(f) do begin

read(f, X);

if X <> 0 then begin
{
append new item to the end of list
}
new(pl);
pl^.value := x;
pl^.col_num := j;
pl^.next := nil;

if pl_first = nil then pl_first := pl
else pl_last^.next := pl;
pl_last := pl;

inc(j);
end;

end;
readln(f);

if pl_first <> nil then begin
new(pv);
pv^.row_num := i;
pv^.next := nil;

if pv_first = nil then pv_first := pv
else pv_last^.next := pv;
pv_last := pv;
end;

inc(i);
end;

close(f);

{ Теперь в pv_first хранится указатель на начало списка списков }
end.

Автор: kase666 24.12.2005 1:48

good.gif

Код

texmode(3);
clrscr;
gotoxy(15,10);
write('БОЛЬШОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО!!!');