Помощь - Поиск - Пользователи - Календарь
Полная версия: Разряженная матрица. Мультисписки.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
kase666
Вообщем тема...

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

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
kase666, погоди... У тебя уже задана матрица в виде мультисписка, или мультисписок еще надо организовать?
kase666
матрица нулевая А[X, X] ее необходимо загрузить
из файла в виде мультисписка и выполнить операции...
volvo
Повторяю вопрос: Мультисписок умеешь создавать, или нет?
(то, что работать с ним не умеешь - это понятно, но может уже есть хоть какая-то готовая реализация, в которую можно хотя-бы загрузить данные.)
kase666
список создавать могу, простой...
но не для двухмерных матриц, парюсь с указателями...
вот процедурка для линейного
толкаюсь от нее, но как 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
Да ладно, ты с тэгами...
буду ставить.

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

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
good.gif
Код

texmode(3);
clrscr;
gotoxy(15,10);
write('БОЛЬШОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО!!!');
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.