Gij={1,无向图(vi,vj)或有向图的
#include
#include
typedef char E;//定点存放的数据类型
#define MaxVertex 5
typedef struct MatrixGraph {int vertexCount;//顶点数int edgeCount;//边数int matrix[MaxVertex][MaxVertex];//矩阵的长,宽E data[MaxVertex];//各个顶点对应的数据
}* Graph;//创建矩阵
Graph Create();
//添加各个顶点的数据
void addVertex(Graph graph,E element);
//存储边的关系
void addEdge(Graph graph,int i,int j);
#include "Map.h"
//创建矩阵
Graph Create() {//将结构体创建出来,注意使用动态内存,否则函数结束,栈空间会被回收//结构体中的数组也会创建出来Graph graph= (Graph)malloc(sizeof(struct MatrixGraph));graph->vertexCount=0;graph->edgeCount=0;//因为内存中的数据随机值,所以将其初始化为0,方便后续的使用for(int i=0;ifor(int j=0;jgraph->matrix[i][j]=0;}}return graph;
}//添加各个顶点的数据
void addVertex(Graph graph,E element) {//当结点数量大于等于节点数时,结束函数if(graph->vertexCount>=MaxVertex) return;//采用后置加加的方式,将元素存储进去graph->data[graph->vertexCount++]=element;
}//存储边的关系
void addEdge(Graph graph,int i,int j) {//初始化时已经将全部的数据置为0if(graph->matrix[i][j]==0) {//注意如果时无向图的话,就将[i][j]和[j][i]都置为1graph->matrix[i][j]=1;graph->edgeCount++;//边的条数+1}
}
//打印邻接矩阵
void printGraph(Graph graph) {for(int i=-1;ivertexCount;i++) {for(int j=-1;jvertexCount;j++) {if(j==-1) {//打印第一行的字母printf("%c",'A'+i);}else if(i==-1) {//打印从第二行起的首字母printf("%3c",'A'+j);}else {//打印矩阵的内容printf("%3d",graph->matrix[i][j]);}}putchar('\n');}
}
#include "Map.h"
int main() {Graph graph=Create();for(int c='A';c<='D';c++)addVertex(graph,(char)c);addEdge(graph,0,1);//A->BaddEdge(graph,1,2);//B->CaddEdge(graph,2,3);//C->DaddEdge(graph,3,0);//D->AaddEdge(graph,2,0);//C->AprintGraph(graph);return 0;
}
#include
#include
#define MaxVertex 5
typedef char E;
//结点和头节点分开定义,普通结点记录邻接顶点信息
typedef struct node {int nextVertex;struct node *next;
} *Node;
//头节点记录元素
struct HeadNode {E element;struct node * next;
};typedef struct AdjacencyGraph {int vertexCount;//顶点数int edgeCount;//边数struct HeadNode vertex[MaxVertex];
}* Graph;
//初始化
Graph create();
//添加顶点
void addVertex(Graph graph,E element);
//添加边的关系
void addEdge(Graph graph,int a,int b);
//打印邻接表
void printGraph(Graph graph);
#include "Map2.h"
//创建
Graph create() {Graph graph=(Graph) malloc(sizeof(struct AdjacencyGraph));graph->vertexCount=graph->edgeCount=0;return graph;
};
//添加顶点
void addVertex(Graph graph,E element) {if(graph->vertexCount>=MaxVertex) return;//添加新节点graph->vertex[graph->vertexCount].element=element;graph->vertex[graph->vertexCount].next=NULL;graph->vertexCount++;//顶点数更新
}
void addEdge(Graph graph,int a,int b) {//定义一个指向链表的头结点的下一结点指向Node node=graph->vertex[a].next;//开辟顶点空间Node newNode=(Node) malloc(sizeof(struct node));newNode->next=NULL;newNode->nextVertex=b;//如果头结点下面没有东西,就直接连接;否则,就遍历到最后一个结点后,添加新节点if(!node) {graph->vertex[a].next=newNode;//注意这里不能使用node,因为我们要真实地改变头节点的next指向}else {do{//如果已经连接到对应的结点,直接返回if(node->nextVertex==b) {free(newNode);newNode=NULL;return ;}//否则一直遍历到最后一个结点if(node->next) node=node->next;else break;//如果遭到了最后一个结点,直接结束}while(true);node->next=newNode;}graph->edgeCount++;//边数计数+1
}
//打印
void printGraph(Graph graph) {for(int i=0;ivertexCount;i++) {printf("%d | %c",i,graph->vertex[i].element);Node node=graph->vertex[i].next;while(node) {printf("-> %d",node->nextVertex);node=node->next;}printf("\n");}
}
#include "Map2.h"
int main() {Graph graph=create();for(int c='A';c<='D';c++) {addVertex(graph,(char)c);}addEdge(graph,0,1);//A->BaddEdge(graph,1,2);//B->CaddEdge(graph,2,3);//C->DaddEdge(graph,3,0);//D->AaddEdge(graph,2,0);//C->AprintGraph(graph);
}