实验内容
建立有向图的邻接表存储并求出第i个顶点的出度并输出
有向图邻接表表示
代码内容
#include<iostream>
#define MVNum 100 //最大顶点数
#define OK 1;
#define ERROR 0;
typedef int Status;
typedef char VerTexType; //顶点的数据类型定为字符型
using namespace std;
//存储边的信息
typedef struct ArcNode{
Status adjvex; //该边所指向的顶点的位置
//ArcNode *nextarc;//和下面是一样的效果
struct ArcNode *nextarc; //指向下一条边的指针
Status arcs; //该条边的权值
}ArcNode;
//存储定点信息
typedef struct VNode{
VerTexType data; //存储顶点内容
ArcNode *firstarc; //指向第一条依附该顶点的边的指针
}VNode,AdjList[MVNum];//结构体数组,顺序结构存储
//邻接表
typedef struct ALGraph{
AdjList vertices;
Status vexnum,arcnum; //图当前顶点数和边数
}ALGraph;
//寻找v1,v2在G中的位置
Status LocateVex(ALGraph G,VerTexType v){
for(int i=0;i<G.vexnum;i++)
if(v==G.vertices[i].data)
return i;//返回下标
return ERROR;
}
//采用邻接表法创建有向图G
Status CreateDG(ALGraph &G){
cout<<"输入总顶点数,总边数:"<<endl;
cin>>G.vexnum>>G.arcnum; //输入总顶点数,总边数
cout<<"依次输入点的信息"<<endl;
for(int i=0;i<G.vexnum;i++){
cin>>G.vertices[i].data; //输入点信息
G.vertices[i].firstarc=NULL; //初始化表头结点的指针域为NULL
}
VerTexType v1,v2;
Status w,i,j;
for(int k=0;k<G.arcnum;k++){
cout<<"依次输入边的相邻两点以及权值"<<endl;
cin>>v1>>v2>>w;
//找到v1 v2的位置
i=LocateVex(G,v1);
j=LocateVex(G,v2);
ArcNode *p1=new ArcNode; //生成一个新的边节点*p1
p1->adjvex=j; //邻接点序号为j
p1->nextarc=G.vertices[i].firstarc; //nextarc(指针域)置空
G.vertices[i].firstarc=p1; //将新节点*p1插入顶点v1的边表 头部
p1->arcs=w; //边<v1,v2>的权值
}
return OK;
}
Status OutDegree(ALGraph G,int n){
int count=0;
ArcNode *p; //定义边的指针
p=G.vertices[n].firstarc; //指针指向要查找顶点的边
while(p!=NULL){
count++;
p=p->nextarc; //指向下一条边
}
return count;
}
int main(){
ALGraph G;
int n;
CreateDG(G);//邻接表创建有向图
cout<<"请输入要查找的顶点,输入 -1 退出"<<endl;
while(cin>>n&&n!=-1){
cout<<"第"<<n<<"个顶点的出度为:"<<OutDegree(G,n)<<endl;
}
return 0;
}
运行结果
总结
主要考察我们对邻接表的理解,出度的理解,结构体指针的使用
邻接表便于增加和删除顶点,便于统计边的数目,但不便于判断点与点之间是否有边,不便于计算各个顶点的度