Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.01.2016, 00:57
Graf16 Graf16 вне форума
Прохожий
 
Регистрация: 17.01.2016
Сообщения: 16
Версия Delphi: Delphi 7
Репутация: 10
Печаль Односвязный линейный список

Изучила динамические структуры и пытаюсь выполнить задание: создать односвязный линейный список,содержащий список ребер графа и вывести его на экран в стринггрид.

В стрингриде находится матрица смежности графа,а чтобы составить список ребер я прохожусь по элементам матрицы,стоящих выше главной диагонали и на ней,и если нахожу цифру 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  
Старый 17.01.2016, 01:06
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

В списке хранится только 1 индекс. Как по одному числу определить, что и с чем связано? Это же два числа должно быть - "что" и "с чем". Потом, зачем i от 1 до n и j от 1 до n, если при i > j ничего не делается? Не проще брать j от 1 до i?
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 17.01.2016 в 01:11.
Ответить с цитированием
  #3  
Старый 17.01.2016, 12:22
Graf16 Graf16 вне форума
Прохожий
 
Регистрация: 17.01.2016
Сообщения: 16
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
В списке хранится только 1 индекс. Как по одному числу определить, что и с чем связано? Это же два числа должно быть - "что" и "с чем". Потом, зачем i от 1 до n и j от 1 до n, если при i > j ничего не делается? Не проще брать j от 1 до i?
В смысле 1 индекс,немного не понимаю вас? Если можете,то укажите на ошибку сказу в коде
Код:
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  
Старый 17.01.2016, 12:30
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

У вас ведь есть глобально-общедоступная blist типа uk, можно предположить, что изменения должны откладываться в этой переменной, а на деле они происходят лишь в локальных под тем же названием, попробуйте убрать все blist:uk из параметров процедур и функций
Ответить с цитированием
  #5  
Старый 17.01.2016, 15:10
Graf16 Graf16 вне форума
Прохожий
 
Регистрация: 17.01.2016
Сообщения: 16
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
У вас ведь есть глобально-общедоступная blist типа uk, можно предположить, что изменения должны откладываться в этой переменной, а на деле они происходят лишь в локальных под тем же названием, попробуйте убрать все blist:uk из параметров процедур и функций
Убрала blist из параметров процедур и функций, но после запуска программы выдало, что список пустой
Ответить с цитированием
  #6  
Старый 18.01.2016, 16:36
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Ну как-то так
Код:
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;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:07.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025