图不可能用简单的顺序存储结构表示
一.邻接矩阵
1.无向图
基本思想:用一维数组存储图的顶点,用矩阵 n*n(二维数组)表示图中各顶点之间的邻接关系。有边指向顶点就用1表示,没有就用0
该矩阵是对称矩阵,因为是无向图
2.有向图
出度对应行 入度对应列
3.网
4.建立无向网图的邻接矩阵代码实现
typedef char VertexType;
typedef int EdgeType;
#define MAXVEX 100
#define INFINITY 65535 //用65535来表示无穷
typedef struct MGraph{
VertexType vexs[MAXVEX]; //顶点表
EdgeType arc[MAXVEX][MAXVEX]; //邻接矩阵 可看作边表
int numVertexes, numEdges;
}MGraph;
//建立无向网图
void CreateMGraph(MGraph *G)
{
int i, j, k, w;
printf("输入顶点数和边数:\n");
scanf("%d%d", &G -> numVertexes, &G -> numEdges);
for(i = 0; i < G -> numVertexes; i++) //建立顶点表
{
scanf(&G -> vexs[i]);
}
for(i = 0; i < G -> numVertexes; i++)
{
for(j = 0; j < G -> numVertexes; j++)
{
G -> arc[i][j] = INFINITY;
}
}
for(k = 0; k < G -> numEdges; k++)
{
printf("输入边(vi, vj)上的下标i, 下标j和权w:\n");
scanf("%d%d%d", &i, &j, &w);
G -> arc[i][j] = w;
G -> arc[j][i] = G -> arc[i][j]; //无向图 矩阵对称
}
}
二.邻接表
因而引出邻接表
1.概念
2.无向图
3.有向图
对于有向图 邻接表只能表示一个度 后面的十字链表会弥补这个不足
3.网
对于网 在数据域加上一个权值即可
4.代码实现
应用了在单链表创建中的头插法 对于无向图,一条边对应都是两个顶点,所以在循环中,一次就针对i和j分别进行了插入
//创建邻接表
typedef char VertexType;
typedef int EdgeType;
typedef struct EdgeNode{ //边表结点
int adjvex; //存储顶点对应的下标
EdgeType weight;
struct EdgeNode *next;
}EdgeNode;
typedef struct VertexNode{ //顶点表结点
VertexType data;
EdgeType *firstedge;
}VertexNode, AdjList[MAXVEX];
typedef struct GraphAdList{
AdjList adjList;
int numVertexes, numEdges;
}GraphAdjList;
void CreateALGraph(GraphAdjList *G)
{
int i, j, k;
EdgeNode *e;
printf("输入顶点数和边数:\n");
scanf("%d%d", &G -> numVertexes, &G -> numEdges);
for(i = 0; i < G -> numVertexes; i++)
{
scanf(&G -> adjList[i].data);
G -> adjList[i].firstedge = NULL; //将边表置为空表
for(k = 0; k < G -> numEdges; k++)
{
printf("输入边(vi, vj)上的顶点序号:\n");
scanf("%d%d", &i, &j);
e = (EdgeNode*)malloc(sizeof(EdgeNode));
e -> adjvex = j;
e -> next = G -> adjList[i].firstedge;
G -> adjList[i].firstedge = e;
e = (EdgeNode*)malloc(sizeof(EdgeNode));
e = adjvex = i;
e -> next = G -> adjList[j].firstedge;
G -> adjList[j].firstedge = e;
}
}
}
三.十字链表
四.邻接多重表
对于关注点在顶点,则邻接表是个不错的选择。但是关注边的操作,则需要找到这条边的两个边表结点进行操作,相对比较麻烦。
具体实现
五.边集数组