图论系列:图的表示( 二 )

NumVertex+j)<
2.邻接表
邻接表由表头顶点和边表节点组成,因此要先定义头顶点和边表节点的数据结构 。
typedef char VertexType;//边表节点typedef struct _EdgeNode{int adjvex;//边表顶点号,用于存放于头表顶点邻接的顶点Vj的序号jint weight;//权值struct _EdgeNode * next; //指向下一个边表节点}EdgeNode;typedef struct _VNode//头顶点信息{VertexType data;//存放顶点的信息 。。。EdgeNode *firstEdge;}VNode;
定义好头节点和边节点之后,就可以定义邻接表数据结构了,同邻接矩阵一样,也有2种方法:
#define MAXVERTEXNUM 100typedefstruct AdjList{VNode adjList[MAXVERTEXNUM];int NumVertex;int Numedges;}LGraph;//用指针来实现 typedefstruct AdjList_P{VNode *adjList;//需要分配内存int NumVertex;int Numedges;}LPGraph;
使用第一种数据类型构建一张图:
void CreateGraph_AL(LGraph *G){int i=0;int s,t,w;VertexType data;cout<<"请输入顶点数和边数:";cin>>G->NumVertex>>G->Numedges;//初始化表头for(i=0;iNumVertex;i++){cout<<"请输入第"<>data;G->adjList[i].data=http://www.kingceram.com/post/i;G->adjList[i].firstEdge=NULL;}for(i=0;iNumedges;i++){cout<<"请输入第"<>s>>t>>w;EdgeNode *p=(EdgeNode*)malloc(sizeof(EdgeNode)); //定义一个边表节点指针,并为其分配内存if(p==NULL){cout<<"内存分配失败";return;}//修改指针,每次在表头节点后面插入新的节点,其它节点后移p->next=G->adjList[s].firstEdge;G->adjList[s].firstEdge=p;p->adjvex=t;p->weight=w;}}void print_AL(LGraph *G){int i=0;for(i=0;iNumVertex;i++){if(G->adjList[i].firstEdge==NULL){cout<<"第"<adjList[i].data<<" 邻接表:->NULL";cout<adjList[i].data<<" 邻接表:";EdgeNode *q=G->adjList[i].firstEdge;while(q!=NULL){cout<<"->"<adjList[q->adjvex].data;q=q->next;}cout<

图论系列:图的表示

文章插图
使用第二种数据类型构建一张图:需要为头顶点指针分配内存
【图论系列:图的表示】void CreateGraph_ALP(LPGraph *G){int i=0;int s,t,w;VertexType data;cout<<"请输入顶点数和边数:";cin>>G->NumVertex>>G->Numedges;G->adjList=(VNode *)malloc(G->NumVertex*sizeof(VNode));if(G->adjList==NULL){printf("内存分配失败");return;}//1.初始化for(i=0;iNumVertex;i++){cout<<"请输入第"<>data;G->adjList[i].data=http://www.kingceram.com/post/data;G->adjList[i].firstEdge=NULL;}//2.记录边与权值for(i=0;iNumedges;i++){cout<<"请输入第"<>s>>t>>w;EdgeNode *p=(EdgeNode*)malloc(sizeof(EdgeNode)); //定义一个边表节点指针,并为其分配内存if(p==NULL){cout<<"内存分配失败";return;}//修改指针,每次在表头节点后面插入新的节点,其它节点后移p->next=G->adjList[s].firstEdge;G->adjList[s].firstEdge=p;p->adjvex=t;p->weight=w;}}void print_ALP(LPGraph *G){int i=0;for(i=0;iNumVertex;i++){if(G->adjList[i].firstEdge==NULL){cout<<"第"<adjList[i].data<<" 邻接表:->NULL";cout<adjList[i].data<<" 邻接表:";EdgeNode *q=G->adjList[i].firstEdge;while(q!=NULL){cout<<"->"<adjList[q->adjvex].data;q=q->next;}cout<
运行效果:
图论系列:图的表示

文章插图
三、图的两种表示方法比较
(1)找顶点的所有邻接顶点
邻接矩阵:可以判断对应顶点序号的一维数组的值,例如:A[1][...]=? 若=0,邻接;=1邻接