1.邻接表存储方式(边点,顶点,顶点集(图))
typedef struct EdgeNode//边点
{
int adjvex;
struct EdgeNode *next;
}edge;
typedef struct vertexnode//顶点
{
int data;
edge* firstedge;
}vertexnode,Adjlist[105];
typedef struct LGraph//图
{
int edgenum,nodenum;
Adjlist adjlist;
}LGraph;
2.头插法的使用
3.深度优先遍历(递归,对每一个未访问过的顶点穷尽式发掘,再层层原路返回)
int FLAG=0;//判断是否能通过v2的标志,全局变量
void DFS(LGraph*G,int adjvex,int v2)//深度搜索
{
edge*p;
visited[adjvex]=1;//标记已经访问过
p=G->adjlist[adjvex].firstedge;
if(visited[v2]==1) FLAG=1;
while(p)
{
if(visited[p->adjvex]==0)//并不是单独的一个adjvex,而是随p而变的adjvex
DFS(G,p->adjvex,v2);
p=p->next;
}
}
int DFSTraverse(LGraph *G,int v1,int v2)
{
int i;
for(i=1;i<=(G->nodenum);i++)//首先都初始化为未访问过的状态,本题中下标从1开始
{
visited[i]=0;
}
DFS(G,v1,v2);//从v1点开始深度搜索
return FLAG;
}
4.哨兵数组visited【105】
头插法在本题的使用:
代码:
#include#include int visited[105]; typedef struct EdgeNode//边点 { int adjvex; struct EdgeNode *next; }edge; typedef struct vertexnode//顶点 { int data; edge* firstedge; }vertexnode,Adjlist[105]; typedef struct LGraph//图 { int edgenum,nodenum; Adjlist adjlist; }LGraph; LGraph* creategraph( )//创建图 { LGraph*G=(LGraph*)malloc(sizeof(LGraph)); scanf("%d %dn",&(G->nodenum),&(G->edgenum)); int i,j; for(i=1;i<=(G->nodenum);i++)//填充顶点表 { int temp; scanf("%d",&temp); G->adjlist[temp].data=temp;//顶点表下标是输入的temp而不是i! G->adjlist[temp].firstedge=NULL;//勿漏 } for(j=1;j<=(G->edgenum);j++)//填充边表 { int temp1,temp2; scanf("%d %dn",&temp1,&temp2);//读入有向边的”入“,”出“ edge*e=(edge*)malloc(sizeof(edge)); e->adjvex=temp2; e->next=G->adjlist[temp1].firstedge;//头插法!!!! G->adjlist[temp1].firstedge=e; //e->adjvex=temp2; //e->next=G->adjlist[temp1].firstedge->next;//为什么不行?firstedge都初始化为NULL!同时尾插法不合适本题 //G->adjlist[temp2].firstedge->next=e; } return G; } int FLAG=0;//判断是否能通过v2的标志,全局变量 void DFS(LGraph*G,int adjvex,int v2)//深度搜索 { edge*p; visited[adjvex]=1;//标记已经访问过 p=G->adjlist[adjvex].firstedge; if(visited[v2]==1) FLAG=1; while(p) { if(visited[p->adjvex]==0)//并不是单独的一个adjvex,而是随p而变的adjvex DFS(G,p->adjvex,v2); p=p->next; } } int DFSTraverse(LGraph *G,int v1,int v2) { int i; for(i=1;i<=(G->nodenum);i++)//首先都初始化为未访问过的状态,本题中下标从1开始 { visited[i]=0; } DFS(G,v1,v2);//从v1点开始深度搜索 return FLAG; } int main() { LGraph*G; G=creategraph(); int v1,v2,flag=0; scanf("%d %d",&v1,&v2);//要寻找的路径的两端下标 flag=DFSTraverse(G,v1,v2); if(flag==1) printf("yes"); else printf("no"); return 0; }



