In recent days, the examination of reviewing data structure is also a process of checking the defects and making up the omissions, so write down the handwritten code. In addition, the problem that it's better not to duplicate the name of the actual participating parameter in c/c + + class has puzzled and drunk for a long time
The function pointer void (*visit) can receive a function name and take the function as a parameter, similar to the function programming in python
The return value of the pointer function int *visit is an address value. The return value of a function must be accepted by a pointer variable of the same type, that is to say, a pointer function must have a return value of a function, and in a calling function, the return value of a function must be assigned to a pointer variable of the same type.
Note that in c/c + +, a member function and a member parameter cannot have the same name,
class A
{
private:
int a;
public:
A(int a){a=a;} //This method is not available. The scope of parameter a will override the scope of member variable, so member variable a will not be assigned
}
Next are two traversal methods of Graphs
The first is DFS (depth first traversal), which recursively accesses the nearest neighbor vertex from a vertex until the end returns to the vertex with other neighbors for recursion
template<class T>
void AdjListUndirGraph<T>::DFS(int v,void (*(visit)(const T &e)))const
{
SetTag(v,true);
T e;
GetElem(v,e);
(*visit)(e);
for(int w=FirstAdjVex(v);w>=0;w=NextAdjVex(v,w))
if(!GetTag(w))
DFS(w);
}
template<class T>
void AdjListUndirGraph<T>::DFSTraverse(void (*(visit)(const T &e)))const
{
int v;
for(v=0;v<GetVexNum();v++)
SetTag(v,false);
for(v=0;v<GetVexNum();v++)
if(!GetTag(v))
DFS(v,visit);
}
The second is BFS (breadth first traversal). All adjacent vertices of a vertex are queued and visited, then queued in turn, and then the adjacent vertices of the adjacent vertices are queued, then queued in turn, and repeated until the end of the visit
template<class T>
void AdjListDirGraph<T>::BFS(int v,void (*visit)(const T &e))const
{
SetTag(v,true);
T e;
GetElem(v,e);
(*visit)(e);
LinkQueue q;
q.InQueue(v);
while(!q.Empty())
{
int u,w;
q.OutQueue(u);
for(w=FirstAdjVex(u);w>=0;w=NextAdjVex(u,w))
if(!GetTag(w))
{
SetTag(w,true);
GetElem(w,e);
(*visit)(e);
q.InQueue(w);
}
}
template<class T>
void AdjListDirGraph<T>::BFSTraverse(void (*visit)(const T &e))const
{
int v;
for(v=0;v<GetVexNum;v++)
SetTag(v,false);
for(v=0;v<GetVexNum;v++)
if(!GetTag(v))
BFS(v,visit);
}