大家好,今天不讲程序不顺服,所以还是更新一篇关于“用邻接表存储有向图”的文章吧!
如果程序有错,请见谅
////////////////////////////////// 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);
}
好吧,希望你会看的懂