1.邻接矩阵保存图
保存图的结构体:
typedef struct
{
//图的信息
char Vertex[VERTEX_MAX];
int Edges[VERTEX_MAX][VERTEX_MAX];
int isTrav[VERTEX_MAX];
int VertexNum;
int EdgeNum;
int Graphtype;
}MatrixGraph;
结合下图来逐个理解结构体中的数据函数:
![](https://img-my.csdn.net/uploads/201204/10/1334066509_8180.jpg)
如上图:Vertex表示保存图中每个顶点的字符型值
Edges数组,其中两个下标表示一条边两边两个顶点序号,而该数组值表示该边的权值!
IsTrav数组表示顶点是否遍历,将在广度优先遍历与深度优先遍历中用到,这里不讨论
接下来的VertexNum与EdgeNum表示图中的顶点数和边的数量!
GraphType表示图的类型有有向图和无向图之分........
用邻接矩形创建图:
//实现创建图函数
void CreateGraph(MatrixGraph *G)
{
int i,j,k,weight;
char start,end;
printf("请输入图的顶点数,边数以及图的类型(0--无向图,1--有向图)\n");
scanf("%d%d%d",&G->VertexNum,&G->EdgeNum,&G->Graphtype);
for(i=0 ; i<G->VertexNum ; i++)
for(j=0 ; j<G->VertexNum ; j++)
G->Edges[i][j]=MAXVALUE;
printf("请输入各顶点\n");
for(i=0 ; i<G->VertexNum; i++)
{
getchar();
printf("第 %d 个顶点:\n",i+1);
scanf("%c",&( G->Vertex[i]) );
}
printf("确定各边是否相连,每次请输入起点和终点以及权值\n");
for(k=0;k<G->EdgeNum;k++)
{
getchar();
printf("第 %d 条边\n",k+1);
scanf("%c,%c,%d",&start,&end,&weight);
for(i=0 ; start!=G->Vertex[i] ; i++);
for(j=0 ; end !=G->Vertex[j] ; j++);
G->Edges[i][j]=weight;
if(G->Graphtype==0)
G->Edges[j][i]=weight;
}
}
图创建过程中赋值MAXVALUE表示当前数组中下标的两个点不相连,规定该边权值为一个在当前数值类型下计算机能表示的最大值,图中每一个顶点都是单个字符所以只有在输入边的首尾start , end时再找到该顶点对应的下标值i和j,再赋予相应的权值,最后还要判断图的类型如果是无向图则边i,j和j,i都要赋予相同的权值.2邻接表保存图的结构体:
//图的结构体定义
typedef struct edgeNode
{
int Vertex;
int weight;
struct edgeNode *next;
}EdgeNodes;
typedef struct
{
EdgeNodes* AdjList[VERTEX_MAX];
int VertexNum,EdgeNum;
int Graphtype;
}ListGraph;
其中EdgeNodes表示一个顶点的链表,在图的结构中将要用到。
ListGraph表示图的结构,其中EdgeNodes数组指针表示图中每一个顶点的相连顶点都存放在指针数组中。
其中每个顶点链表存放相连顶点的顺序是任意的。
//创建图
void CreateGraph(ListGraph *G)
{
int start,end;
int i,weight;
EdgeNodes* s;
for(i=1 ; i<=G->VertexNum ; i++)
G->AdjList[i]=NULL;
for(i=1 ; i<=G->EdgeNum ; i++)
{
getchar();
printf("第 %d 条边\n",i);
scanf("%d,%d,%d",&start,&end,&weight);
s=(EdgeNodes*)malloc(sizeof(EdgeNodes));
s->next=G->AdjList[start];
s->Vertex=end;
s->weight=weight;
G->AdjList[start]=s;
if(G->Graphtype==0)
{
s=(EdgeNodes*)malloc(sizeof(EdgeNodes));
s->next=G->AdjList[end];
s->Vertex=start;
s->weight=weight;
G->AdjList[end]=s;
}
}
}