Рис. 40. Разреженная матрица, представленная в виде структуры мультисписка
Описание элемента хранения разреженной матрицы.
Const | |||||
Nrow = 10; | { количество строк } | ||||
Ncol = 20; | { количество столбцов } | ||||
Type | |||||
PMatrix: ^ Matrix; | { тип – указатель на узел мультисписка } | ||||
Matrix = record | { описание элемента хранения узла мультисписка} | ||||
val: word; | { значение элемента } | ||||
row, col: word; | { номер строки, номер столбца } | ||||
frow, fcol: PMatrix; | { атрибуты связи в списках по строке и по столбцу } | ||||
end; | |||||
Prow=array[1..Nrow] of PMatrix; | { тип – массив указателей на первые узлы списков строк } | ||||
Pcol=array[1..Ncol] of PMatrix; | { тип – массив указателей на первые узлы списков столбцов } | ||||
Var | |||||
r: Prow; | { массив указателей на первые узлы списков строк } | ||||
c: Pcol; | { массив указателей на первые узлы списков столбцов } | ||||
Пример обработки разреженной матрицы – процедура, распечатывающая значения элементов матрицы по строкам.
Procedure Print_Matrix(var fr: Prow); | { fr – массив указателей на списки строк } | ||||
Var p: PMatrix; i: byte; | { p – вспомогательный указатель для прохода по строке } | ||||
begin | |||||
for i:=1 to Nrow do begin | { просмотр строк } | ||||
p:=fr[i]; | { установка вспогательного указателя на первый элемент списка строки } | ||||
while (p<> nil) do begin | { список строки не пуст? } | ||||
writeln ('Matrix[', p^.row, ',', p^.col, ']=', p^.val); | { вывод значения} | ||||
p:=p^.frow; | { переход к следующему элементу в строке } | ||||
end; | |||||
end; | |||||
end; | |||||
Примечание. Массив указателей на списки строк передается по ссылке, чтобы избежать копирования массива в стеке при передаче параметров процедуры.
|
|
По составу элементов списки подразделяются на однородные и разнородные. Все виды списков, рассматриваемые до сих пор, являются однородными, т.к. они состоят из элементов одного и того же типа. Если список включает элементы различных типов, то он называется разнородным. Особенности обработки разнородных списков состоят в том, что в каждый элемент списка вводится дополнительный атрибут, позволяющий определить тип элемента списка и соответствующим образом интерпретировать содержимое его информационных полей (5.2.1).
Примером разнородного списка является список, содержащий информацию о геометрических фигурах, составляющих некоторый проект (рис. 41).