临近期末考了,所以思路来不及整理了,但大家还是可以仿照我的上几篇文章,“先动笔,再代码”的思路还是不变的。
#include#include #define MAX_VERTEX_NUM 120 #define FALSE 0 #define TRUE 1 #define YES 1 #define NO 0 int visited[MAX_VERTEX_NUM]={FALSE}; int flag=NO; typedef struct ArcNode{ //弧 int adjvex; //该弧所指向的顶点的位置 struct ArcNode *nextarc; //指向下一条弧的指针 }ArcNode; typedef struct VNode{ //顶点 int data; //顶点信息 ArcNode *firstarc; //指向第一条依附该顶点的弧的指针 }VNode; typedef struct ALGraph{ //图 VNode vertices[MAX_VERTEX_NUM]; //图的各个顶点 int vexnum,arcnum; //图的当前结点数和弧数 }ALGraph; void graph_initialize(ALGraph* graph){ //图的初始化 graph->vexnum=0; graph->arcnum=0; for(int i=0;i vertices[i].data=0; graph->vertices[i].firstarc=NULL; } } void arcnode_initialize(ArcNode* arcnode){ //弧结点的初始化 arcnode->adjvex=0; arcnode->nextarc=NULL; } ArcNode* arcnode_create(){ //弧结点的创建 ArcNode *arcnode=(ArcNode*)malloc(sizeof(ArcNode)); arcnode_initialize(arcnode); return arcnode; } ALGraph* graph_create(){ //图的创建 ALGraph* graph=(ALGraph*)malloc(sizeof(ALGraph)); graph_initialize(graph); int n,m; //n是顶点数,m是边数 scanf("%d %d",&n,&m); graph->vexnum=n; graph->arcnum=m; for(int i=0;i vexnum;i++){//读入顶点信息 int temp; scanf("%d",&temp); graph->vertices[i].data=temp; graph->vertices[i].firstarc=NULL; } for(int j=0;j arcnum;j++){ //读入弧信息 int a,b; scanf("%d %d",&a,&b); //下面找到弧要插入的位置 int i=0; while(i vexnum){ if(graph->vertices[i].data==a) break; i++; } ArcNode *arcnode=arcnode_create(); arcnode->adjvex=b; //下面用头插法插入一个结点 arcnode->nextarc=graph->vertices[i].firstarc; graph->vertices[i].firstarc=arcnode; } return graph; } int Recursion(ALGraph* graph,int head,int tail){ int i; for(i=0;i vexnum;i++){ if(graph->vertices[i].data==head){ visited[i]=TRUE; break; } } ArcNode *temp=graph->vertices[i].firstarc; while(temp!=NULL){ if(temp->adjvex!=tail){ Recursion(graph,temp->adjvex,tail); }else{ flag=YES;break; } if(flag==YES) break; } } int main(){ ALGraph* graph=graph_create(); int begin,end; scanf("%d %d",&begin,&end); //读入待搜索的弧信息 Recursion(graph,begin,end); if(flag==YES){ printf("yes"); }else{ printf("no"); } return 0; }



