目录
不清楚图的存储结构的朋友,请移步至此
http://t.csdn.cn/QEX5Ehttp://t.csdn.cn/QEX5E
领接矩阵
//一个数组代表顶点集合
//一个二维数组来代表边集
#define MaxVertices 100
#define MaxWeight 32767 //带权图 点不邻接的时候 无穷大
typedef struct {
int Vertices[MaxVertices];//顶点的数组信息
int Edge[MaxVertices][MaxVertices];//边的信息
int numV;//顶点的个数
int numE;//边的个数
}AdjMatrix;
void CreateGraph(AdjMatrix* G)
{
int n, e;
int vi, vj, w;
//先输入图的顶点的个数和边的个数
scanf_s("%d,%d", &n, &e);
G->numV = n; G->numE = e;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++)
{
if (i == j)
{
G->Edge[i][j] = 0;
}
else
{
G->Edge[i][j] = MaxWeight;
}
}
}
//把顶点放到数组当中
for (int i = 0; i < G->numV; i++)
{
//开始输入顶点的信息
scanf("%d", &G->Vertices[i]);
}
//输入边的信息
for (int i = 0; i < G->numE; i++)
{
//输入边的信息 邻接点的两端 如果是带权图 输入边的权值
scanf_s("%d%d%d", &vi, &vj, &w);
//还要在查找 找到对应的下标
G->Edge[vi][vj] = w;
//如果是无向图 是个对称矩阵
G->Edge[vj][vi] = w;
}
}
邻接表
#include<stdio.h>
//邻接表
//边表结点
typedef struct EdgeNode
{
int adjvex;//邻接的结点 这里是位置或者下标 也可以存数据,但比较麻烦,默认这里都存下标
struct EdgeNode* next;
int weight;//权值
}EdgeNode;
//顶点信息 存数据 同时还是 链表的头
typedef struct VertexNode
{
char data;//数据 顶点信息
struct EdgeNode* firstedge;
}VertexNode,AdjList[100];
//有了边和顶点集合 领接表的结构
typedef struct GraphadjList {
AdjList adjlist;//顶点表的结点数组
int numV, numE;//顶点个数和边的个数
};
//结构体套结构体
//建表
//无向图的邻接表的创建
void CreatALGraph(GraphadjList* G) {
int vi, vj;
//先输入定点信息和边的信息
scanf("%d%d", G->numV, &G->numE);
for (int i = 0; i < G->numV; i++) {
scanf("%d", &G->adjlist[i].data);
getchar();//清空回车符
G->adjlist[i].firstedge = NULL;
}
//建立边表
for (int i = 0; i < G->numE; i++) {
//输入每条边邻接的两个顶点
scanf("%d%d", &vi, &vj);
//如果输入的是真实的数据,也可以,不过要找下标,很麻烦
EdgeNode* e = (EdgeNode*)malloc(sizeof(EdgeNode));
//头插
e->adjvex = vj;
e->next = G->adjlist[vi].firstedge;
G->adjlist[vi].firstedge = e;
//无向图 两次
e->adjvex = vi;
e->next = G->adjlist[vj].firstedge;
G->adjlist[vj].firstedge = e;
}
}
十字链表
#include<stdio.h>
#include<stdlib.h>
//边集的数据
typedef struct ArcBox {
int tailvex, headvex;//
struct ArcBox* hlink,* tlink;
int weight;
};
//顶点的数据
typedef struct VexNode {
int data;
ArcBox* firstin, * firstout;
}VexNode;
typedef struct {
VexNode xlist[20];
int numV, numE;
}OLGraph;
void CreateDG(OLGraph* G) {
//输入顶点数和边数
scanf("%d%d", &(G->numV), &(G->numE));
for (int i = 0; i < G->numV; i++) {
scanf("%d", &G->xlist[i].data);
G->xlist[i].firstin = NULL;
G->xlist[i].firstout = NULL;
}
//构建十字链表
for (int i = 0; i < G->numE; i++) {
int v1, v2;
scanf("%d%d", &v1, &v2);
//输入的是数据的话,要查找相应下标
ArcBox* p = (ArcBox*)malloc(sizeof(ArcBox));
p->tailvex = v1;
p->headvex = v2;
//头插
p->hlink = G->xlist[v2].firstin;
p->tlink = G->xlist[v1].firstout;
G->xlist[v2].firstin = p;
G->xlist[v1].firstout = p;
}
}
邻接多重表
#include<stdio.h>
#include<stdlib.h>
//邻接多重表 无向图没有弧头弧尾之分了
//边表集合
typedef struct node {
int ivex, jvex;
struct node* vi, * vj;
}ArcNode;
//结点 就是存储数据和头指针
typedef struct {
char vertex;
ArcNode* firstEdge;
}VNode;
typedef struct {
VNode Dvex[50];
int numV, numE;
}Graph;
void Creat(Graph*G) {
//先输入顶点数和边数
scanf("%d%d", &(G->numV), &(G->numE));
for (int i = 0; i < G->numV; i++) {
scanf("%d", &G->Dvex[i].vertex);
G->Dvex[i].firstEdge = NULL;
}
for (int i = 0; i < G->numE; i++) {
//输入边对应的下标
int vi, vj;
//建立边
ArcNode* new_node = (ArcNode*)malloc(sizeof(ArcNode));
new_node->ivex = vi;
new_node->jvex = vj;
new_node->vi = G->Dvex[vi].firstEdge;
G->Dvex[vi].firstEdge = new_node;
new_node->vj = G->Dvex[vj].firstEdge;
G->Dvex[vj].firstEdge = new_node;
}
}