邻接矩阵创建无向网代码实现
#include<iostream>
using namespace std;
#define OK 1
#define Maxint 32767
typedef int status ;
typedef struct
{
char vexs[100];
int arcs[100][100];
int vexnum,arcnum;
}AMGraphy;
status LocateVex(AMGraphy G,int u)
{
int i;
for(i=0;i<G.vexnum;i++)
if(u==G.vexs[i]) return i;
return -1;
}
status CreateUDN(AMGraphy &G)
{//采用邻接矩阵表示法,创建无向网G
cin>>G.vexnum>>G.arcnum; //输入总顶点数,总边数
for(int i=0;i<G.vexnum;i++)
cin>>G.vexs[i]; //依次输入点的信息
for(int i=0;i<G.vexnum;i++) //初始化邻接矩阵,边的权值均为Maxint
for(int j=0;j<G.vexnum;j++)
G.arcs[i][j]=Maxint;
for(int k=0;k<G.arcnum;k++) //构造邻接矩阵
{
char v1,v2;
int w;
cin>>v1>>v2>>w; //输入一条边依附的顶点及权值
int i=LocateVex(G,v1);
int j=LocateVex(G,v2); //确定v1,v1在G中的位置,即顶点数组的下标
G.arcs[i][j]=w; //边<v1,v2>的权值置为w
G.arcs[j][i]=G.arcs[i][j]; //置<v1,v2>的对称边<v2,v1>的权值为w
}
return OK;
}
int main()
{
AMGraphy G;
CreateUDN(G);
cout<<"邻接矩阵为:"<<endl;
for(int i=0;i<G.vexnum;i++)
{
for(int j=0;j<G.vexnum;j++)
cout<<G.arcs[i][j]<<" ";
cout<<endl;
}
return 0;
}
按照这个无向网运行的:
邻接表创建无向图代码实现
#include<iostream>
using namespace std;
#define MVNum 100 //最大顶点数
#define OK 1
typedef int status;
typedef struct ArcNode //边结点
{
int adjvex; //该边所指向的顶点的位置
struct ArcNode *nextarc; //指向下一条边的指针
}ArcNode;
typedef struct VNode
{
char data; //顶点信息
ArcNode *firstarc; //指向第一条依附该顶点的指针
}VNode,AdjList[MVNum]; //AdjList表示邻接表类型
typedef struct
{
AdjList vertices; //vertics--vertex的负数
int vexnum,arcnum; //图的当前顶点数和弧数
}ALGraph;
status LocateVex(ALGraph &G,char u)
{
int i;
for(i=0;i<G.vexnum;i++)
if(u==G.vertices[i].data) return i;
return -1;
}
status CreateUDG(ALGraph &G)
{
cin>>G.vexnum>>G.arcnum; //输入总顶点数,总边数
for(int i=0;i<G.vexnum;i++)//输入各点,构造表头结点表
{
cin>>G.vertices[i].data; //输入顶点值
G.vertices[i].firstarc=NULL; //初始化表头结点的指针域
}
getchar();
for(int k=0;k<G.arcnum;k++) //输入各边构造邻接表
{
char v1,v2;
cin>>v1>>v2; //输入一条边依附的两个顶点
getchar();
int i=LocateVex(G,v1);
int j=LocateVex(G,v2);
ArcNode *p1,*p2;
p1=new ArcNode;
p1->adjvex=j; //邻接点序号为j
p1->nextarc=G.vertices[i].firstarc;
G.vertices[i].firstarc=p1; //将新结点*p1插入顶点vi的边表头部
p2=new ArcNode;
p2->adjvex=i; //邻接点序号为i
p2->nextarc=G.vertices[j].firstarc;
G.vertices[j].firstarc=p2; //将新结点*p2插入顶点vj的边表表头
}
return OK;
}
int main()
{
ALGraph G;
ArcNode *p;
CreateUDG(G);
cout<<"输出邻接表:"<<endl;
for(int i=0;i<G.vexnum;i++)
{
cout<<G.vertices[i].data;
for(p=G.vertices[i].firstarc;p!=NULL;p=p->nextarc)
printf("->%c",p->adjvex+'A');
cout<<endl;
}
cout<<endl;
return 0;
}
按照这个无向图运行的:
如果将printf(“->%c”,p->adjvex+‘A’);改成 printf(“->%d”,p->adjvex);
运行结果就为: