无向图的邻接矩阵法代码
#include<iostream>
#include <iomanip>
#define MAX 100
using namespace std;
typedef struct VertexType{
int id; //顶点编号
char code; //顶点信息
}VertexType;//顶点类型
typedef struct{
int arcs[MAX][MAX];//邻接矩阵
int vexnum,arcnum;//顶点数、边数
VertexType Vex[MAX];//顶点表
}MGraph;
//创建无向图
void creat_arcs(MGraph &G){
cout<<"请输入顶点数:"<<endl;
cin>>G.vexnum;
cout<<"请输入各顶点编号:"<<endl;
for(int i=0;i<G.vexnum;i++)
{
cin>>G.Vex[i].code;
G.Vex[i].id=i;
}
//邻接矩阵初始化为0
for (int i = 0; i < G.vexnum; i++) {
for (int j = 0; j < G.vexnum; j++) {
G.arcs[i][j] = 0; //邻接矩阵初始化,将所有元素的初始值设为0
}
}
cout<<"请输入边的个数:"<<endl;
cin>>G.arcnum;
cout<<"请输入各边起点v->w终点(由于矩阵是从0行0列开始的,所以输入时,最小编号为0):"<<endl;
int v,w;
for(int i=0;i<G.arcnum;i++){
cin>>v>>w;
G.arcs[v][w]=1;
G.arcs[w][v]=1;
}
}
//打印邻接矩阵
void printf_arcs(MGraph G){
cout<<"该图的邻接矩阵为"<<endl;
cout<< setw(4) <<"";
for(int i=0;i<G.vexnum;i++)
cout<<setw(4)<<G.Vex[i].code;
puts("");
for(int i=0;i<G.vexnum;i++){
cout<<setw(4)<<G.Vex[i].code;
for(int j=0;j<G.vexnum;j++){
cout<<setw(4)<<G.arcs[i][j];
}
puts("");
}
cout<<endl;
}
int main(){
MGraph G;
creat_arcs(G);
printf_arcs(G);
cout<<endl;
return 0;
}
运行结果
无向图的邻接表法代码
#include<iostream>
#include <iomanip>
#define MAX 100
using namespace std;
typedef struct VertexType{//顶点类型
int id; //顶点编号
char code; //顶点信息
}VertexType;
typedef struct ArcNode{//边表结点
int adjvex; //该弧指向的顶点的位置
struct ArcNode *next;//指向下一条弧的指针
}ArcNode;
typedef struct VNode{//顶点表结点
VertexType data;//顶点信息
ArcNode *first;//指向第一条依附该顶点的弧的指针
}VNode,AdjList[MAX];
typedef struct{
AdjList vertices;//邻接表
int vexnum,arcnum;//顶点数、弧数
}ALGraph;//邻接表存储图的类型
//创建无向图的邻接表
void creat_arcs(ALGraph &G){
cout<<"请输入顶点数:"<<endl;
cin>>G.vexnum;
cout<<"请输入弧数:"<<endl;
cin>>G.arcnum;
cout<<"请输入各顶点编号:"<<endl;
for(int i=0;i<G.vexnum;i++){
G.vertices[i].data.id=i;
cin>>G.vertices[i].data.code;
G.vertices[i].first=NULL;//因为此时没有链表连在后面,所以将指向弧的指针置空
}
cout<<"输出起点v->w终点"<<endl;
for(int i=0;i<G.arcnum;i++){
int v,w;
cin>>v>>w;
//创建弧结点
ArcNode *node_v=(ArcNode*)malloc(sizeof(ArcNode));
node_v->adjvex=w;//相当于这个结点的值
//使用头插法
node_v->next=G.vertices[v].first;
G.vertices[v].first=node_v;
//要同时更新w顶点的邻接边链表,因为无向图的边是双向的
ArcNode *node_w=(ArcNode*)malloc(sizeof(ArcNode));
node_w->adjvex=v;//相当于这个结点的值
node_w->next=G.vertices[w].first;
G.vertices[w].first=node_w;
}
}
//打印邻接矩阵
void printf_arcs(ALGraph G){
cout<<"该图的邻接表为"<<endl;
for(int i=0;i<G.vexnum;i++){
cout<<G.vertices[i].data.code<<":";
ArcNode *node=G.vertices[i].first;
while(node!=NULL){
cout<<"->"<<G.vertices[node->adjvex].data.code;
node=node->next;
}
cout<<endl;
}
}
int main(){
ALGraph G;
creat_arcs(G);
printf_arcs(G);
cout<<endl;
return 0;
}
运行结果