voidCreateUDG(ALGraph *G){printf("请输入顶点数和边数:\n");scanf("%d %d",&G->vexnum,&G->arcnum);for(int i =0; i < G->vexnum;++i){printf("请输入第%d个顶点:",(i +1));scanf(" %c",&G->vertices[i]->data);//初始化顶点
G->vertices[i]->fistarc =NULL;}for(int i =0; i < G->arcnum;++i){char v1, v2;printf("输入第%d个边:",(i +1));scanf(" %c%c",&v1,&v2);int m =LocateVex(G, v1);int n =LocateVex(G, v2);//分别找到边的两个顶点的下标
ArcNode *p1 =(ArcNode*)malloc(sizeof(ArcNode));//然后用头插法进行连接,如果是有向图连接一次就行了
p1->adjvex = n;
p1->nextarc = G->vertices[m]->fistarc;
G->vertices[m]->fistarc = p1;
ArcNode *p2 =(ArcNode*)malloc(sizeof(ArcNode));
p2->adjvex = m;
p2->nextarc = G->vertices[n]->fistarc;
G->vertices[n]->fistarc = p2;}}intLocateVex(ALGraph *G,char v){for(int i =0; i < G->vexnum; i++){if(G->vertices[i]->data == v){return i;}}return-1;}
图的深度优先遍历
/**
深度优先遍历
*/voidDFS(ALGraph *G,int i,int*visited){
ArcNode *an;
visited[i]=1;//表名第i个顶点已经被访问过,并打印它的值printf("%c ", G->vertices[i]->data);
an = G->vertices[i]->fistarc;//找到该顶点与之相连的下个顶点的位置//通过递归算法挨个遍历该顶点的邻接点while(an){if(!visited[an->adjvex]){DFS(G, an->adjvex, visited);}
an = an->nextarc;}}voidTraDFS(ALGraph *G){int visited[MVNum];//初始化一个标记数组for(int i =0; i < MVNum; i++){
visited[i]=0;}for(int i =0; i < G->vexnum; i++){if(!visited[i]){DFS(G, i, visited);//挨个遍历没有访问过的顶点}}}
图的广度优先遍历
/**
图的广度优先遍历需要用到队列的出队、入队
*/voidTraBFS(ALGraph *G){
LinkQueue *q =(LinkQueue *)malloc(sizeof(LinkQueue));int visited[MVNum];//创建标记数组并进行初始化for(int i =0; i < MVNum; i++){
visited[i]=0;}InitQueue(q);//初始化队列for(int i =0; i < G->vexnum; i++){if(!visited[i]){printf("%c ", G->vertices[i]->data);
visited[i]=1;EnQueue(q, i);//当前顶点入队while(!QueueEmpty(q)){PopQueue(q,&i);
ArcNode *an = G->vertices[i]->fistarc;//找到当前顶点的临接点while(an){//并依次遍历,直到为空if(!visited[an->adjvex]){printf("%c ", G->vertices[an->adjvex]->data);
visited[an->adjvex]=1;EnQueue(q, an->adjvex);}
an = an->nextarc;}}}}}