user-0 提问: c语言版数据结构图的一些基本操作函数如下，有三个地方不了解，请各位帮帮忙？

回复:
user: user-1
content: 1. 使用函数指针，可以避免很多问题，在VisitFunc调用的地方，完全可控。现在是直接printf，将来如果是写入文件呢，只需要修改那个print函数就可以了 2. 不是很理解你问的意思 3. 在CreateGraph中传入的G是指针，而在调用LocalVex需要的参数实际是传值。因此在函数里调用的时候使用取值运算符*，目的是将G所指向的值传递给LocalVex

user: user-2
content: 代码排版太烂，无意看下去  int i=0;

user: user-0
content: #include"string.h"  #include"stdio.h"  #include"stdlib.h"  typedef int InfoType;  #define MAX_NAME 3  typedef char VertexType[MAX_NAME]; #define MAX_VERTEX_NUM 20  typedef enum{DG,DN,AG,AN}GraphKind;   typedef struct ArcNode  {  	int adjvex;  	struct ArcNode *nextarc;  	InfoType *info; }ArcNode;  typedef struct  {  	VertexType data;  	ArcNode *firstarc; }VNode,AdjList[MAX_VERTEX_NUM];   typedef struct  {  	AdjList vertices;  	int vexnum,arcnum;  	int kind; }ALGraph;   int LocateVex(ALGraph G,VertexType u)  { 	int i;  	for(i=0;i<G.vexnum;++i)  		if(strcmp(u,G.vertices[i].data)==0)  			return i;  	return -1;  }  void CreateGraph(ALGraph *G)  {  	int i,j,k;  	int w;  	VertexType va,vb;  	ArcNode *p;   	scanf("%d",&(*G).kind);   	scanf("%d%d",&(*G).vexnum,&(*G).arcnum);  	for(i=0;i<(*G).vexnum;++i)  	{  		scanf("%s",(*G).vertices[i].data);  		(*G).vertices[i].firstarc=NULL;  	}   	for(k=0;k<(*G).arcnum;++k)  	{  		if((*G).kind==1||(*G).kind==3)  		scanf("%d%s%s",&w,va,vb);  		else   		scanf("%s%s",va,vb);  		i=LocateVex(*G,va);  		j=LocateVex(*G,vb);   		p=(ArcNode*)malloc(sizeof(ArcNode));  		p->adjvex=j;  		if((*G).kind==1||(*G).kind==3)  		{  			p->info=(int *)malloc(sizeof(int));  			*(p->info)=w;  		}  		else  		p->info=NULL;  		p->nextarc=(*G).vertices[i].firstarc; 		(*G).vertices[i].firstarc=p;  		if((*G).kind>=2)  		{  			p=(ArcNode*)malloc(sizeof(ArcNode));  			p->adjvex=i;  			if((*G).kind==3)  			{  				p->info=(int*)malloc(sizeof(int));  				*(p->info)=w;  			}  			else  			p->info=NULL;  			p->nextarc=(*G).vertices[j].firstarc; 			(*G).vertices[j].firstarc=p;  		}  	}	  }   VertexType* GetVex(ALGraph G,int v)  {  	if(v>=G.vexnum||v<0)  		exit(0);  	return &G.vertices[v].data;  }   int FirstAdjVex(ALGraph G,VertexType v)  { 	ArcNode *p;  	int v1;  	v1=LocateVex(G,v); 	p=G.vertices[v1].firstarc;  	if(p)  		return p->adjvex;  	else  		return -1;  }   int NextAdjVex(ALGraph G,VertexType v,VertexType w)  {  	ArcNode *p;  	int v1,w1;  	v1=LocateVex(G,v);  	w1=LocateVex(G,w); 	p=G.vertices[v1].firstarc;  	while(p&&p->adjvex!=w1)  		p=p->nextarc;  	if(!p||!p->nextarc)  		return -1;  	else 		return p->nextarc->adjvex; }  int visited[MAX_VERTEX_NUM]; void(*VisitFunc)(char* v);  void DFS(ALGraph G,int v)  {  	int w; 	visited[v]=1; 	VisitFunc(G.vertices[v].data); 	for(w=FirstAdjVex(G,G.vertices[v].data);w!=-1;w=NextAdjVex(G,G.vertices[v].data,G.vertices[w].data)) 		if(!visited[w])           DFS(G,w);  }  void DFSTraverse(ALGraph G,void(*print)(char*))   {  	int i;     VisitFunc=print; 	for(i=0;i<G.vexnum;i++) 		visited[i]=0; 	for(i=0;i<G.vexnum;i++) 		if(!visited[i]) 			DFS(G,i); 	printf("\n");  }   void print(char *i)  {  	printf("%s ",i);  }   int main()  {  	ALGraph g;  	CreateGraph(&g);  	DFSTraverse(g,print);  	return 1; }

user: user-3
content: C/C++ code ? 1 2 3 4 5 6 7 8 9 10 11 void DFSTraverse(ALGraph G,void(*print)(char*))   {      int i;     VisitFunc=print;     for(i=0;i<G.vexnum;i++)         visited[i]=0;     for(i=0;i<G.vexnum;i++)         if(!visited[i])             DFS(G,i);     printf("\n");  }   1、楼主的DFSTraverse函数的第二个参数在函数体没有用到，可以删掉。

user: user-4
content: void DFSTraverse(ALGraph G,void(*print)(char*))   {  	int i; 	VisitFunc=print; 	for(i=0;i<G.vexnum;i++) 		visited[i]=0; 	for(i=0;i<G.vexnum;i++) 		if(!visited[i]) 			DFS(G,i); 	printf("\n");  }   1、楼主的DFSTraverse函数的第二个参数在函数体没有用到，可以删掉。

user: user-5
content: 同排版太烂。