![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Изучила динамические структуры и пытаюсь выполнить задание: создать односвязный линейный список,содержащий список ребер графа и вывести его на экран в стринггрид.
В стрингриде находится матрица смежности графа,а чтобы составить список ребер я прохожусь по элементам матрицы,стоящих выше главной диагонали и на ней,и если нахожу цифру 1,то в односвязный линейный список добавляю i и j. 1. Что я делаю не так,потому что список не выводится (скорее всего неправильно где-то создаю)? Может кто-нибудь указать ошибку? 2. Можно ли в одну ячейку записать одновременно два значения через пробел? Пример: входные данные: 5 0 0 1 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 выходные данные: 1 3 2 3 2 5 Код:
type
matr=array [1..10,1..10] of integer;
mass=array [1..100] of integer;
uk=^list;
list=record
inf:integer;
next:uk;
end;
var
Form1: TForm1;
ms:matr;
x,y:mass;
i,j,n:Integer;
blist:uk;
flag:boolean;
str:string;
implementation
{$R *.xfm}
//Ïсоздание нового эл-та списка
procedure make(var blist:uk; inf:integer);
begin
new(blist);
blist^.inf:=inf;
blist^.next:=nil;
end;
//проверка на пустоту
function pust(blist:uk):boolean;
begin
if(blist<>nil) then
result:=false
else
result:=true
end;
//вставка эл-та в конец списка
procedure incertK(blist:uk; inf:integer);
var blist1:uk;
begin
if(pust(blist))then
begin
showmessage('Пустой');
exit;
end;
while(blist^.next<>nil) do
begin
blist:=blist^.next;
end;
make(blist1,inf);
blist^.Next:=blist1;
end;
//вывод на печать списка
procedure printspisok(blist:uk);
var
str:string;
begin
if pust(blist) then
begin
ShowMessage('Pustoy');
str:='';
Exit;
end;
str:='';
while(blist<>nil)do
begin
str:=str+inttostr(blist^.inf)+' ';
blist:=blist^.next;
end;
end;
//составление списка ребер графа
procedure TForm1.Button2Click(Sender: TObject);
var
i,j:Integer;
begin
for i:=1 to n do
begin
for j:=1 to n do
begin
if (i<=j) and (StrToInt(sd1.Cells[j,i])=1) then
begin
if blist=nil then
make(blist,i)
else
incertK(blist,i);
end;
end;
end;
printspisok(blist);
Label1.Caption:=str;
end; |
|
#2
|
||||
|
||||
|
В списке хранится только 1 индекс. Как по одному числу определить, что и с чем связано? Это же два числа должно быть - "что" и "с чем". Потом, зачем i от 1 до n и j от 1 до n, если при i > j ничего не делается? Не проще брать j от 1 до i?
Последний раз редактировалось Bargest, 17.01.2016 в 01:11. |
|
#3
|
|||
|
|||
|
Цитата:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
i,j:Integer;
fout:TextFile;
sp:matr;
begin
for i:=1 to n do
begin
for j:=1 to i do
begin
if (i<=j) and (StrToInt(sd1.Cells[j,i])=1) then
begin
if blist=nil then
begin
make(blist,i);
incertK(blist,j);
end
else
begin
incertK(blist,j);
incertK(blist,i);
end;
end;
end;
end;
printspisok(blist);
Label1.Caption:=str;
end; |
|
#4
|
||||
|
||||
|
У вас ведь есть глобально-общедоступная blist типа uk, можно предположить, что изменения должны откладываться в этой переменной, а на деле они происходят лишь в локальных под тем же названием, попробуйте убрать все blist:uk из параметров процедур и функций
|
|
#5
|
|||
|
|||
|
Цитата:
|
|
#6
|
|||
|
|||
|
Ну как-то так
Код:
type uk=^list; list=record i,j:Integer; next:uk; end; var blist:uk=nil; И не забывайте, если используются типизированные указатели, то значок ^ можно не писать Код:
procedure make(var ablist:uk; aI,aJ:Integer);
begin
new(ablist);
ablist.i:=ai;
ablist.j:=aj;
ablist.next:=nil;
end;
//вставка эл-та в конец списка
procedure incertK(ablist:uk);
var
temp:uk;
begin
if(pust(blist))then
begin
blist:=ablist;
exit;
end;
temp:=blist;
while(temp.next<>nil) do
begin
temp:=temp.next;
end;
temp.next:=ablist;
end;
function printspisok(blist:uk):tsring;
begin
if pust(blist) then
begin
Result:='Pustoy';
Exit;
end;
Result:='';
while(blist<>nil)do
begin
Result:=Result+#13#10+ //этот жуткий код-перевод строки
format([blist.i, blist.j]);
blist:=blist.next;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i,j:Integer;
temp:uk;
begin
for i:=1 to n do
begin
for j:=1 to i do
begin
if (StrToInt(sd1.Cells[j,i])=1) then
begin
make(temp,i,j);
incertK(temp);
end;
end;
end;
Label1.caption := printspisok(blist);
end;
end.
function printspisok(ablist:uk):tsring;
begin
if pust(ablist) then
begin
Result:='Pustoy';
Exit;
end;
Result:='';
while(ablist<>nil)do
begin
Result:=Result+#13#10+
format('%d %d,[ablist.i, ablist.j]);
ablist:=ablist.next;
end;
end; |