C数据结构学习历程(6) 图之邻接表表示法

来源:互联网 发布:强殖装甲知乎 编辑:程序博客网 时间:2024/05/02 01:34

我是参照《严蔚敏数据结构ppt》http://wenku.baidu.com/view/3ff16fc20242a8956aece41d.html以及《大话数据结构》来写的,因为ppt上有些错,而视频上的代码不全,自己另写了。ppt上错哪,我就不指出了,大家可以对照着看,就能发现不同之处。


struct 有3个,层层套用 ,学习struct的灵活运用。

#include<iostream>using namespace std;typedef char VertexType; //顶点类型typedef int EdgeType; //边上的权值类型#define MAXVEX 100typedef struct EdgeNode  //边表结点{int adjvex;     //邻接点域,存储该顶点的下标。怎么做到呢?是因为包含关系,被包含VertexNode里面EdgeType weight; //权值struct EdgeNode *next;  //链域,指向下一个邻接点}EdgeNode;typedef struct VertexNode  //顶点表结点{VertexType data;    //这是顶点的名称(字母表示),这个和AdjList[MAXVEX] 中下标相对应EdgeNode *firstedge;  }VertexNode,AdjList[MAXVEX];typedef struct{AdjList adjList;int numVertexes,numEdges;  }GraphAdjList;//建立图的邻接表结构void CreateALGraph(GraphAdjList *G){int i,j,k;EdgeNode *e;cout<<"输入顶点数和边数"<<endl;cin>>G->numVertexes >>G->numEdges ;for(i=0;i<G->numVertexes ;i++){cout<<"输入顶点变量:"<<endl;cin>>G->adjList[i].data ;       //建立顶点表G->adjList [i].firstedge =NULL; //初始化,还没有内存,在下面出现}for(k=0;k<G->numEdges ;k++)    //建立边表{cout<<"输入边(vi,vj)上的顶点序号:"<<endl;//对于这里的编号应该与上面的一致,不然的话就用一个函数去求Location()cin>>i>>j;//向内存申请空间,指针初始化e=(EdgeNode *)malloc(sizeof(EdgeNode));e->adjvex =j;   //邻接序号为j;e->next =G->adjList [i].firstedge ;G->adjList [i].firstedge=e;      //相当于头结点一直在动,链表里的头插法//因为是无向图,所以需要下面的e=(EdgeNode *)malloc(sizeof(EdgeNode));e->adjvex =i;   //邻接序号为j;e->next =G->adjList [j].firstedge ;G->adjList [j].firstedge=e;  }}//邻接表深度优先typedef int Boolean;Boolean visited[MAXVEX];void DFS(GraphAdjList GL,int i){EdgeNode *p;visited[i]=true;cout<<GL.adjList [i].data <<endl;p=GL.adjList [i].firstedge ;while(p)               //为空就结束了{if(!visited[p->adjvex ]){DFS(GL,p->adjvex);}p=p->next;}}void DFSTraverse(GraphAdjList GL){for(int i=0;i<MAXVEX;i++){visited[i]=false;}for(int i=0;i<GL.numVertexes ;i++){if(!visited[i]){DFS(GL,i);}}}int main(){ GraphAdjList p; CreateALGraph(&p); DFSTraverse(p);return 0;}


随便画的一个图,遍历如下 无向图




遍历结果:


0 0