无向图邻接表的深度优先遍历

来源:互联网 发布:mac卸载梦幻西游 编辑:程序博客网 时间:2024/05/23 18:12
#include<stdio.h>  #include<malloc.h>  #define Max 50  int visited[Max];//边表节点  typedef struct EdgeNode  {      int adjvex;//储存对应顶点的下标      int weight;//用于储存权值      struct EdgeNode * p;//指向下一个边表节点  }EdgeNode;    //顶点表节点  typedef struct VertexNode  {      int date;//数据      EdgeNode * p;//指向边表节点  }VertexNode;  //图节点  typedef struct Graph  {      VertexNode agjList[Max];//顶点表数组      int numVextexes,numEdges;//当前顶点数和边数  }Graph;  //创建图的邻接表结构  void GreateGraph(Graph * G)  {      int i,j,k;      EdgeNode * e;      printf("输入顶点数和边数");      scanf("%d %d",&G->numVextexes,&G->numEdges);       for(i=0;i<G->numVextexes;i++)//输入顶点信息      {   printf("输入顶点的信息:");         scanf("%d",&G->agjList[i].date);          G->agjList[i].p=NULL;      }      /*     1>利用头插法     2>因为无向图没有方向,所以创建边表节点的时候,要重复创建两次     并进行相反的操作     */      for(k=0;k<G->numEdges;k++)//建立边表      {          printf("输入边(Vi,Vj)的下标i和j的值:");          scanf("%d %d",&i,&j);          e=(EdgeNode *)malloc(sizeof(EdgeNode));//动态分配空间来储存边表节点          e->adjvex=j;          e->p=G->agjList[i].p;          G->agjList[i].p=e;          e=(EdgeNode *)malloc(sizeof(EdgeNode));          e->adjvex=i;          e->p=G->agjList[j].p;          G->agjList[j].p=e;      }  }  void DFS(Graph G,int i){EdgeNode * p;visited[i]=1;//表示已经被访问printf("%d\n",G.agjList[i].date);p=G.agjList[i].p;while(p){if(visited[p->adjvex]==0){DFS(G,p->adjvex);}p=p->p;}}void DFS_search(Graph G){int i;//初始化标志为0代表该顶点没有被访问for(i=0;i<G.numVextexes;i++){visited[i]=0;}//判断是否被访问,如果未被访问,就执行深度遍历操作for(i=0;i<G.numVextexes;i++){if(visited[i]==0){DFS(G,i);}}}int main(){Graph G;GreateGraph(&G);DFS_search(G);return 0;}

说明:

 我在编写代码的时候发现了如果我顶点里面是存放的是char类型的数据的话,代码在执行过程中,会出现错误,我表示很疑问!

我会尽快找出这个问题;

0 0
原创粉丝点击