Помощь - Поиск - Пользователи - Календарь
Полная версия: Графы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
not_programmer
Доброго времени суток.
Сделал вот прогу, но она почему-то не работает. Помогите в решении проблемы.

Вот условие:
1) Написать процедуру удаления из графа всех вершин с заданным значением информационного поля.
2) Написать процедуру «стягивания» в одну вершину всех вершин, информационное поле которых содержит заданное значение. При «стягивании» в графе остается только одна вершина, содержащая заданное значение, остальные вершины удаляются, но все исходящие из них и входящие в них дуги «передаются» оставшейся вершине. При этом петли, связывающие вершину с собой, не создаются. Не создаются также и параллельные дуги.

Вот код:


Program G4;

Uses
Crt;

Type
RefNode = ^Node;
RefArc = ^Arc;
Node = Record
ID : Integer;
InfNode : Integer;
Next : RefNode;
ArcList : RefArc;
END;
Arc = Record
InfArc : Integer;
Next : RefArc;
Adj : RefNode;
END;

Procedure Browse(Graph : RefNode);
Var
A : RefArc;
CountNode, CountArc : Integer;
BEGIN
CountNode := 0;
CountArc := 0;
While Graph <> NIL Do
BEGIN
WriteLn(' Top ',Graph^.ID,' with weight ',Graph^.InfNode);
Write(' ArcList: ');
A := Graph^.ArcList;
If A = NIL Then
Write('Empty');
While A <> NIL Do
BEGIN
WriteLn(' Arc to Top ',(A^.Adj)^.ID,' weight of Arc ', A^.InfArc);
CountArc := CountArc + 1;
A := A^.Next;
END;
CountNode := CountNode + 1;
Graph := Graph^.Next;
END;
WriteLn;
WriteLn(' In Graph: ',CountNode,' Top and ',CountArc,' Arc ');
END;

Procedure Destroy(Graph : RefNode);
Var
A, P : RefArc;
Q : RefNode;
BEGIN
While Graph <> NIL Do
BEGIN
A := Graph^.ArcList;
While A <> NIL Do
BEGIN
P := A^.Next;
Dispose(A);
A := P;
END;
Q := Graph^.Next;
Dispose(Graph);
Graph := Q;
END;
END;

Procedure AddNode(Var Graph : RefNode; NumberID, Weight : Integer);
Var
P : RefNode;
BEGIN
New(P);
With P^ Do
BEGIN
ID := NumberID;
InfNode := Weight;
ArcList := NIL;
Next := Graph;
END;
Graph := P;
END;

Procedure AddArc(U, V : RefNode; Weight : Integer);
Var
A : RefArc;
BEGIN
If (U = NIL) OR (V = NIL) Then
WriteLn(' Error : Top is not ')
Else
BEGIN
New(A);
With A^ Do
BEGIN
InfArc := Weight;
Adj := V;
Next := U^.ArcList;
END;
U^.ArcList := A;
END;
END;

Procedure DeleteArc(U, V : RefNode);
Var
A, Before : RefArc;
Run : Boolean;
BEGIN
If U <> NIL Then
BEGIN
A := U^.ArcList;
Run := True;
While (A <> NIL) AND Run Do
If A^.Adj = V Then
Run := False
Else
BEGIN
Before := A;
A := A^.Next;
END;
If A <> NIL Then
BEGIN
If A = U^.ArcList Then
U^.ArcList := A^.Next
Else
Before^.Next := A^.Next;
Dispose(A);
END;
END;
END;

Procedure DeleteNode(Var Graph : RefNode; V : RefNode);
Var
P, Q : RefNode;
A, After : RefArc;
BEGIN
P := Graph;
While P <> NIL Do
BEGIN
Q := P^.Next;
If P <> V Then
DeleteArc(P, V)
Else
BEGIN
If P = Graph Then
Graph := Q;
A := P^.ArcList;
While A <> NIL Do
BEGIN
After := A^.Next;
Dispose(A);
A := After;
END;
Dispose(P);
END;
P := Q;
END;
END;

Procedure Tightener(Var Graph : RefNode; V : RefNode);
Var
P, Q, R : RefNode;
A, After : RefArc;
BEGIN
P := Graph;
While P <> V Do
P := P^.Next;
R := P;
While P <> NIL Do
BEGIN
Q := P^.Next;
If P = V Then
BEGIN
If P = Graph Then
Graph := Q;
A := P^.ArcList;
While A <> NIL Do
BEGIN
After := A^.Next;
Dispose(A);
A := After;
END;
Dispose(P);
END;
P := Q;
END;
END;

Procedure Menu;
BEGIN
ClrScr;
WriteLn(' 1) Add element in Graph ');
WriteLn(' 2) Add Arc in Graph ');
WriteLn(' 3) Browse Graph ');
WriteLn(' 4) Delete element from Graph ');
WriteLn(' 5) Tightener of Graph ');
WriteLn(' 6) Destroy Graph ');
WriteLn(' 7) Exit ');
WriteLn;
Write(' Your choose: ');
END;


{=======MAIN PROGRAM=======}


Var
Graph, U, V : RefNode;
Selector, NumberID, Weight : Integer;
BEGIN
Repeat
Menu;
Read(Selector);
WriteLn;
Case Selector Of
1 : BEGIN
Write(' Enter ID of element: ');
ReadLn(NumberID);
Write(' Enter weight: ');
ReadLn(Weight);
AddNode(Graph, NumberID, Weight);
END;
2 : BEGIN
Write(' One to Two: ');
WriteLn;
Write('Enter weight of Arc: ');
ReadLn(Weight);
AddArc(Graph^.ID, Graph, Weight);
Write(' Two to One: ');
WriteLn;
Write('Enter weight of Arc: ');
ReadLn(Weight);
AddArc(Graph, Graph^.ID, Weight);
END;
3 : BEGIN
Browse(Graph);
ReadLn;
ReadLn;
END;
4 : BEGIN
Write(' Enter meaning of element: ');
ReadLn(V^.InfNode);
DeleteNode(Graph, V);
END;
5 : BEGIN
Write(' Enter meaning of element: ');
ReadLn(V^.InfNode);
Tightener(Graph, V);
END;
6 : Destroy(Graph);
7 : ClrScr;
END;
Until Selector = 7;
END.



Заранее благодарю за помощь.
not_programmer
У меня проблема с процедурой создания дуги, а именно я сам хочу выбирать вершины графа между которыми буду создавать дугу.
Также у меня есть сомнения в работе процедуры удаления вершины графа: почемуто не удаляется вершина с заланным значением.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.