//结构代码如下:
/*图的邻接表存储结构*/
typedef struct EdgeNode1 /*边表结点结构*/
{
EdgType adjvex;/*邻接点域,存储该顶点对应的下标*/
EdgType weight;/*这里实现的是无向网图的邻接表存储结构,所以需要一个权值,代表两个顶点的距离*/
struct EdgeNode1* next;/*链域,指向下一个邻接点*/
}EdgeNode1;
typedef struct VertexNode1 /*顶点表结点结构*/
{
VerterType data; /*顶点域,存储顶点信息*/
EdgeNode1* firstedge; /*边表头指针*/
}VertexNode1,adjlist1[MAX];
typedef struct graph1
{
adjlist1 adj;
EdgType numVertexes; /*图中当前的顶点数*/
EdgType numEdges; /*图中当前的边数*/
}graph1;
(1)无向图
性质:
(1)我们要获取某个顶点的度,就要去查找这个顶点的边表中结点的个数。
(2)我们要判断vi到vj是否存在边,只需要测试vi的边表链表中是否存在结点vj的下标j即可。
(3)我们若是要获取顶点的所有邻接点,就是对此顶点的边表进行遍历。
(2)有向图
有向图由于有方向,我们是以顶点为弧尾来存储边表的,这样很容易就可以得到每个顶点的出度。但是由于有时也需要确定顶点的入度或以顶点作为弧头的弧,我们可以建立一个有向图的逆邻接表,即对每个顶点vi都建立一个链接为vi为弧头的表
(3)带权值的网图
//创建一个无向图(带权值)
void CreateGraph1(graph1* g)
{
int i = 0, j = 0, k = 0;
int w = 0;
EdgeNode1* p = NULL;
printf("请输入顶点数和边数:\n");
scanf_s("%d,%d", &g->numVertexes, &g->numEdges,4);
getchar(); //可以获取回车符
printf("请输入顶点信息:\n");
for (i = 0; i < g->numVertexes; i++)
{
scanf_s("%c", &g->adj[i].data,5);
//getchar(); //获取回车符
g->adj[i].firstedge = NULL;
}
getchar(); //获取回车符
for (k = 0; k < g->numEdges; k++)
{
printf("input edge(vi,vj) vertexs series and the weight:\n");
scanf_s("%d,%d,%d", &i, &j, &w,4);
getchar();
//头插法
p = (EdgeNode1*)malloc(sizeof(EdgeNode1)); /*向内存申请空间,生成边表结点*/
p->adjvex = j;
p->next = g->adj[i].firstedge;
p->weight = w;
g->adj[i].firstedge = p;
//头插法
p = (EdgeNode1*)malloc(sizeof(EdgeNode1)); //这里申请两次结点时因为,结构是无向图,比如v0-v1是相连的,那v1-v0也是相连的,边数为n,那么边表结点为2n
p->adjvex = i;
p->next = g->adj[j].firstedge;
p->weight = w;
g->adj[j].firstedge = p;
}
}
#include"graph.h"
int main(void)
{
graph1 gra;
CreateGraph1(&gra);
system("pause");
return 0;
}
//调试结果
//通过顶点数和边数的值以及调试结果就可以画出相关图形。