一、采用邻接矩阵创建无向图(Adjacency Matrix邻接矩阵)
1、算法思想
- 输入总顶点数和总边数
- 依次输入点的信息存入顶点表中
- 初始化邻接矩阵,使每个权值初始化为最大值
- 构造邻接矩阵
2、代码实现
(见pta----图的基本题—程序题1)
#include <stdio.h>
#define MVNum 100 //最大顶点数
typedef struct{
char vexs[MVNum]; //存放顶点的一维数组
int arcs[MVNum][MVNum]; //邻接矩阵
int vexnum,arcnum; //图的当前顶点数和边数
}MGraph;
void CreatMGraph(MGraph *G);/* 创建图 */
void printGraph(MGraph G);/*输出图 */
int main()
{
MGraph G;
CreatMGraph(&G);
printGraph(G);
return 0;
}
void CreatMGraph(MGraph *G)
{
int i,j,k;
char a;
scanf("%d%d",&G->vexnum,&G->arcnum);
getchar();//消掉回车符
for(i=0;i<G->vexnum;i++)
scanf("%c",&(G->vexs[i]));//读入所有的顶点
for(i=0;i<G->vexnum;i++)
for(j=0;j<G->vexnum;j++)
G->arcs[i][j]=0;//对邻接矩阵操作,把所有的边都初始化为0
for(k=0;k<G->arcnum;k++) //一行一行的读入
{
scanf("%d%d",&i,&j);
G->arcs[i][j]=1;//两个1的放入
G->arcs[j][i]=1;
}
}
void printGraph(MGraph G)
{
int i,j;
for(i=0;i<G.vexnum;i++)
{
printf("%c:",G.vexs[i]);
for(j=0;j<G.vexnum;j++)
if (G.arcs[i][j]) printf(" %d",j);
printf("\n");
}
}
二、采用邻接表创建无向图(Adjacencylist邻接表)
1、算法思想
- 输入总顶点数和总边数
- 依次输入点的信息存入顶点表中,使每个表头的指针域初始化为NULL
- 创建邻接表
2、代码实现
(见pta----图的基本题—程序题2)
#include <stdio.h>
#include <stdlib.h>
#define MVNum 100 //最大顶点数
typedef struct ArcNode{ //表结点
int adjvex; //邻接点的位置
struct ArcNode * nextarc; //指向下一个表结点的指针
}ArcNode;
typedef struct VNode{
char data; //顶点信息
ArcNode * firstarc; //指向第一个表结点的指针
}VNode, AdjList[MVNum]; //AdjList表示邻接表类型
typedef struct{
AdjList vertices; //头结点数组
int vexnum, arcnum; //图的当前顶点数和边数
}ALGraph;
void CreatMGraph(ALGraph *G);/* 创建图 */
void printGraph(ALGraph G);/*输出图 */
int main()
{
ALGraph G;
CreatMGraph(&G);
printGraph(G);
return 0;
}
void CreatMGraph(ALGraph *G)
{
int i,j,k;
ArcNode *s;
scanf("%d%d",&G->vexnum,&G->arcnum);
getchar();//清掉回车符
for(i=0;i<G->vexnum;i++)//读入所有顶点信息
scanf("%c",&(G->vertices[i].data));
for(i=0;i<G->vexnum;i++)
G->vertices[i].firstarc=NULL;//每个头结点后为空
for(k=0;k<G->arcnum;k++) {
scanf("%d%d",&i,&j); //读入i和j,i和j之间有边,创建两个结点插入
s=(ArcNode*)malloc(sizeof(ArcNode));//插到头部
s->adjvex=j;//插入第i行的是j ,创建的新节点的邻边是j
s->nextarc=G->vertices[i].firstarc;//新节点的后继是原来的头指针指向的结点
G->vertices[i].firstarc=s;//原来头指针指向的结点改向新节点 s
s=(ArcNode*)malloc(sizeof(ArcNode));//再来创建一个新节点插入第j行
s->adjvex=i;//插入第j行的是i;
s->nextarc=G->vertices[j].firstarc;
G->vertices[j].firstarc=s;
}
}
void printGraph(ALGraph G)
{
int i,j;
ArcNode *p;
for(i=0;i<G.vexnum;i++)
{
printf("%c:",G.vertices[i].data);
for(p=G.vertices[i].firstarc;p;p=p->nextarc)
printf(" %d",p->adjvex);
printf("\n");
}
}