图的链表 dfs

来源:互联网 发布:网络口的最大数据来源 编辑:程序博客网 时间:2024/06/15 23:53
#include<iostream>#include<stdio.h>using namespace std;#define MAX_VERTEX_NUM 20int visited[MAX_VERTEX_NUM];typedef struct ArcNode//弧结点{intadjex;//该弧所指向的顶点的位置struct  ArcNode     *nextarc;//该弧所指向的下一条弧的指针}ArcNode;typedef struct VNode//点结点{ArcNode   *firstarc;//指向第一条依附该顶点的弧的指针}VNode,AdjList[MAX_VERTEX_NUM];typedef struct {AdjList vertices;intvexum,arcnum;//图的当前顶点数和弧数}ALGraph;ALGraph graph;void input(){int a,b;while(scanf("%d %d",&a,&b)){if(a==0&&b==0)return ;else{//如果说顶点结点没有连接的弧if(graph.vertices[a].firstarc==NULL){//开辟一个弧结点空间ArcNode *p;p=(ArcNode*)malloc(sizeof(ArcNode));//加到顶点结点的末尾graph.vertices[a].firstarc=p;//把这个指针指向空。//初始化部分p->nextarc=NULL;p->adjex=b;}//如果说顶点结点已经有连接的弧else{//首先要查到末尾ArcNode *p;p=graph.vertices[a].firstarc;while(p->nextarc!=NULL){p=p->nextarc;}//开辟一个弧结点ArcNode *m;m=(ArcNode*)malloc(sizeof(ArcNode));//加到末尾p->nextarc=m;//初始化部分m->nextarc=NULL;m->adjex=b;}}}}void dfs(int v){//打印输出visited[v]=1;printf("%d\t",v);//把v这个顶点所指向的链域的头一个地址取出来赋给pArcNode *p;p=graph.vertices[v].firstarc;for(1;p!=NULL;p=p->nextarc){if(!visited[p->adjex])dfs(p->adjex);}}int main(){//初始化cout<<"输入顶点数和弧数"<<endl;scanf("%d %d",&graph.vexum,&graph.arcnum);input();dfs(0);return 0;}/*                      0 / \/   \     1     2  / \    |\                 /   \   | \3     4  5  6 \    |  |  |                  \   |  |  |                   \  |  |  |                    \ |  | /                               7输入数据8 100 10 21 01 31 42 02 52 63 13 74 14 75 25 76 26 77 37 47 57 6输出数据0 1 3 7 4 5 2 6 *//*1 malloc相当于开辟空间。哈哈。终于理解啦。*/

原创粉丝点击