无向网的创建(无向图,有向网,有向图思路类似,稍做改动即可)
代码
#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable:6031)
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
#define oo 999
typedef struct
{
int vexnumber;//根节点个数
int edgenumber;//边的个数
char vex[MAX];//根节点数组
int edge[MAX][MAX];//边表
}mgraph;
void create_m(mgraph* M);//创建邻接矩阵
void traverse_m(mgraph* M);//遍历邻接矩阵
int main()
{
mgraph M;
create_m(&M);
printf("输出邻接矩阵:\n");
traverse_m(&M);
return 0;
}
void create_m(mgraph* M)
{
printf("请输入顶点的个数和边的个数:");
scanf("%d%d", &M->vexnumber, &M->edgenumber);
int i=0;
int j = 0;
for (i = 0; i < M->vexnumber; i++)//将边表初始化
{
for (j = 0; j < M->vexnumber; j++)
{
if (j == i)
{
M->edge[i][j] = 0;//对角线均为0
}
else
{
M->edge[i][j] = oo;//除去对角线外均为无穷(如果是没有权值的话,就为0(无向图,有向图))
}
}
}
printf("输入所有顶点值:\n");
scanf("%s", M->vex);//将顶点数据存入字符串vex中
printf("输出初始化邻接矩阵:\n");
traverse_m(M);//遍历输出初始化之后的邻接矩阵
int t = 0;
char vexl[100];
for (t = 0; t < M->edgenumber; t++)
{
printf("请输入两个顶点:\n");
scanf("%s", vexl);//将两个有边连接的顶点输入
int weight=0;
printf("请输入权值:");
scanf("%d", &weight);//输入两个顶点之间的权值(如果是图的话,就不需要输入,weight=1)
//printf("vex1=%c,vex2=%c,weight=%d\n", vexl[0], vexl[1], weight);
int m = 0;
int n = 0;
for (m = 0; m < M->vexnumber; m++)
{
if (vexl[0] == M->vex[m])
{
break;//找到第一个字符在存放顶点的字符串中的下标
}
}
for (n = 0; n < M->vexnumber; n++)
{
if (vexl[1] == M->vex[n])
{
break;//找到第二个字符在存放顶点的字符串中的下标
}
}
//printf("m=%d,n=%d,weight=%d\n", m,n,weight);
M->edge[m][n] = weight;
M->edge[n][m] = weight;//输入权值(如果这是有向的,就不需要第二步,只需要存出度)
}
}
void traverse_m(mgraph* M)
{
int i = 0;
printf(" ");
for (i = 0; i < M->vexnumber; i++)
{
printf("%4c", M->vex[i]);//依次输出顶点,形成表头
}
printf("\n");
int j;
for (i = 0; i < M->vexnumber; i++)
{
printf("%4c", M->vex[i]);//在每一行开头输出顶点
for (j = 0; j < M->vexnumber; j++)
{
printf("%4d", M->edge[i][j]);//依次输出边表
}
printf("\n");
}
}
2.思路
结构
创建无向网主要是分为储存顶点和储存顶点之间边的关系;储存顶点可以用一个字符串储存,储存顶点之间是否存在边这一关系可以用一个边表实现(二维数组)
过程
先将其初始化,因为一个顶点不会有一条边连接到它自己,所以边表的对角线都初始化为0,其余部分初始化为无穷(可以用一个很大的数代替oo),如果有边就存入它的权值。