用邻接表存储有向图

来源:互联网 发布:xmind mac 破解版 编辑:程序博客网 时间:2024/05/16 06:59
大家好,今天不讲程序不顺服,所以还是更新一篇关于“用邻接表存储有向图”的文章吧!
如果程序有错,请见谅

//////////////////////////////////    hrad.h    ////////////////////////////////////////
#include <iostream>
using namespace std;

#define MAX_VERTEX_NUM 20   

///弧的存储结构
struct ArcNode 
{
int adjvex;                //该弧指向的顶点位置
ArcNode *nextArc;    //指向的下一条弧
int weight;               ///弧上的权重
};

///顶点的存储结构
struct VNode 
{
char data;               //顶点的信息
ArcNode *firstArc;  //这个顶点依附的第一条弧
};

///邻接表的存储结构
struct ALGraph
{
VNode vertices[MAX_VERTEX_NUM];     //所有顶点组成的数组
int vecNum;                                         //顶点个数
int arcNum;                                         //边的数目
};


void CreateGraph( ALGraph &G )
{
ArcNode *p;
int v1, v2, weight;
cout<<"输入有向图的顶点个数:  ";
cin>>G.vecNum;

cout<<"输入有向图的边数:";
cin>>G.arcNum;

for( int i=0; i<G.arcNum; i++ )
{
cout<<"输入第"<<i+1<<"个顶点的信息:";
cin>>G.vertices[i].data;
G.vertices[i].firstArc=NULL;      //首先将每一个顶点所依附的第一条弧初始化
}

for(  int  i=0; i<G.arcNum;  i++ )   //构造边表
{
p=(ArcNode *) malloc ( sizeof(ArcNode) );
if( !p )
{
exit(-1);
}
cout<<"输入第 "<<i+1<<"条弧的头部:";
cin>>v1;
cout<<"输入第 "<<i+1<<"条弧的尾部:";
cin>>v2;
cout<<"输入该弧的权重:";
cin>>weight;

p->adjvex=v2;
p->weight=weight;
p->nextArc=G.vertices[v1].firstArc;   //这里的操作只是让当前的弧能找到下一条弧的位置
G.vertices[v1].firstArc=p;                  //还需要下面这句话把p赋值给顶点的firstArc(很重要)
                                                       //还有的是这里不能倒过来写,不然会丢失指针的
}
}


void ShowGraph( ALGraph G )
{
ArcNode *p;
cout<<"打印边表:"<<endl;

for( int i=0 ; i<G.arcNum;  i++ )
{
cout<<i<<"    "<<G.vertices[i].data<<"==>";
p=G.vertices[i].firstArc;
while( p!=NULL )
{
cout<<"-->"<<p->adjvex;
p=p->nextArc;
}
cout<<endl;
}
}

/////////////////////////////////  main.cpp   /////////////////////////////////////
#include "head.h"

void ShowGraph( ALGraph G );
void CreateGraph( ALGraph &G );

void main()
{
ALGraph G;
CreateGraph(G);
ShowGraph(G);
}

好吧,希望你会看的懂
原创粉丝点击