实验内容:1.掌握图的邻接矩阵的存储定义;
2.掌握图的邻接表的实现。 。
实验内容:
编写一个程序,设计带权图的邻接矩阵与邻接表的创建和输出运算,并在此基础上设计一个主程序完成以下功能:
建立如图1所示的有向图G的邻接矩阵,并输出;
建立如图1所示的有向图G的邻接表,并输出;
销毁图G的邻接表。

主要步骤
- 定义邻接矩阵类型;
- 定义邻接表类型;
- 创建邻接矩阵:输入顶点数和边数。
4.初始化邻接矩阵
for (i=0;i
for(j=0;j
G.edges[i][j]=INF;
}
}
5.有向图起始点、终点及权值的输入
for(i=0;i
int weight;
char F,T;
printf("第%d对:",i+1);
scanf("%c %c %d",&F,&T,&weight); //输入存在边的两顶点
getchar();
for (from=0;from
if(G.vexs[from]==F)
for(to=0;to
if(G.vexs[to]==T)
G.edges[from][to] = weight;
}
}
printf("\n");
}
6.输出邻接矩阵
printf("图G的邻接矩阵:\n");
for (i=0;i
{
for(j=0;j
{
printf("%d\t",G.edges[i][j]);
}
printf("\n");
}
- 创建邻接表:
8输出邻接表;销毁邻接表
9.主函数:定义有向图G的邻接矩阵,顶点数为6,边数为10,分别输出G的邻接矩阵和邻接表,销毁邻接表。
程序代码
#include
#include
#define INF 32767 //定义∞
#define Vmax 100 //最大顶点个数
typedef char VType; //顶点字符型
typedef int EType; //边,矩阵元素int型
typedef struct
{
VType vexs[Vmax]; //顶点表:存图的所有顶点,比如abcd四个顶点,放入数组中
EType edges[Vmax][Vmax]; //邻接矩阵—边表 值为0 1整数
int Vnum, Enum; // 图的顶点数和边数
}MGraph;
typedef struct node
{
EType adjvex; //该边的关联点编号
struct node *next; //指向下一条边的指针
int weight; //该边的相关信息,如权值(用整型表示)
}EdgeNode;//边结点
typedef struct
{
VType vertex;
EdgeNode *firstedge; //指向第一个边结点
}VertexNode;//顶点结点
typedef struct
{
VertexNode vexlist[Vmax];//顶点结点数组
int vexnum,arcnum;//顶点数、边数
}AdjGraph;//图的邻接表
/*创建邻接矩阵*/
void creatGraph(MGraph &G)
{
int i,j,from,to;
printf("请输入顶点的个数和边的条数:\n");
scanf("%d %d",&G.Vnum,&G.Enum);
getchar();
printf("请输入顶点:\n");
for(i=0;ivexlist[i].firstedge=NULL; //将邻接表中所有头结点的指针域置为空
for(i=0;i=0;j--) //检查邻接矩阵中的每个元素
if(G.edges[i][j]!=INF)
{
p=(EdgeNode *)malloc(sizeof(EdgeNode));
p->adjvex=j;
p->next=g->vexlist[i].firstedge; //头插法插入结点p
g->vexlist[i].firstedge=p;
}
g->vexnum=G.Vnum; G.Enum=g->arcnum;
//输出邻接表
printf("图G的邻接表:\n");
for(i=0;ivexnum;i++)
{
p=g->vexlist[i].firstedge;
printf("%c->",G.vexs[i]);
while(p!=NULL)
{
printf("%d->",p->adjvex);
p=p->next;
}
printf("NULL\n");
}
}
void DestroyAdj(AdjGraph *&G) //销毁图的邻接表
{ int i;
EdgeNode *pre,*p;
for (i=0;ivexnum;i++) //扫描所有的单链表
{ pre=G->vexlist[i].firstedge; //p指向第i个单链表的首结点
if (pre!=NULL)
{ p=pre->next;
while (p!=NULL) //释放第i个单链表的所有边结点
{ free(pre);
pre=p; p=p->next;
}
free(pre);
}
}
free(G); //释放头结点数组
}
int main()
{
MGraph G;
AdjGraph *g;
creatGraph(G); //建立邻接矩阵
printf("将g转换为邻接表G\n");
MatToList(G,g); //输出邻接表G
DestroyAdj(g); //销毁邻接表
return 1;
}