图(C)
图的顺序存储结构
邻接矩阵
四种图分别实现 下面只给出了有向图的实现,其他三种仅修改最后存储结果即可(网需要读入权重)
#include<stdio.h> #define NumOfVertex 200 #define VertexType int typedef enum{Digraph,Undigraph,DirectedNet,UndirectedNet}GraphKind; typedef struct{ int relation; //无权图用01表示是否相连接 网直接表示权重 //Info; }rlt,rltionMatrix[NumOfVertex][NumOfVertex]; typedef struct{ VertexType Vex[NumOfVertex]; //存顶点 int NumOfVex,NumOfArc; //存顶点和边的数量 rltionMatrix Matrix; // 矩阵 GraphKind kind; //图的类型 }MyGraph; //定位顶点在表中位置 int LocateVex(MyGraph*g,VertexType v){ for(int i = 0;i<g->NumOfVex;i++){ if(g->Vex[i]==v) return i; } printf("None"); return -1; } //创建有向图 void CreatDG(MyGraph *g){ int VNum,ANum; scanf("%d %d",&(g->NumOfVex),&(g->NumOfArc)); //存顶点数据 for(int i =0;i<g->NumOfVex;i++) scanf("%d",&(g->Vex[i])); //printf("RUN HERE"); //初始化矩阵全置为0 for(int i =0;i<g->NumOfVex;i++) for(int j = 0;j<g->NumOfVex;j++) { g->Matrix[i][j].relation=0; //info } //构造矩阵 for(int i = 0;i<g->NumOfArc;i++) { int v1,v2; scanf("%d %d", &v1, &v2); int pos1 = LocateVex(g,v1); int pos2 = LocateVex(g,v2); if(pos1==-1||pos2==-1) return; else g->Matrix[pos1][pos2].relation=1; ////无向图的二阶矩阵沿主对角线对称 //网读入权存入矩阵 } } //void CreateGraph(MyGraph* G) { // //选择图的类型 // scanf("%d", &(G->kind)); // //根据所选类型,调用不同的函数实现构造图的功能 // switch (G->kind) { // case DG: // return CreateDG(G); // break; // case DN: // return CreateDN(G); // break; // case UDG: // return CreateUDG(G); // break; // case UDN: // return CreateUDN(G); // break; // default: // break; // } //} void printG(MyGraph *g){ for (int i = 0;i<g->NumOfVex;i++){ for(int j = 0;j<g->NumOfVex;j++) { printf(" %d ",g->Matrix[i][j].relation); } printf("\n"); } } int main(){ MyGraph g; CreatDG(&g); printG(&g); }
图的邻接表存储结构
#include<stdio.h> #include<malloc.h> #include<stdlib.h> #define NumOfVertex 200 #define VertexType char //typedef enum{Digraph,Undigraph,DirectedNet,UndirectedNet}GraphKind; typedef struct ArcNode{ int pos; //点下标 struct ArcNode* next; //info }ArcNode; typedef struct VexNode{ VertexType data; ArcNode * firstArc; //顶点后第一个节点 前插法 //info }VexNode,List[NumOfVertex]; //有几个点就有几个链 typedef struct{ List lists; int Vnum,Anum; }MyGraph; void createGraph(MyGraph*g){ scanf("%d %d",&g->Vnum,&g->Anum); getchar(); //存顶点 for (int i =0;i<g->Vnum;i++){ scanf("%c",&g->lists[i].data); // printf(" %d %d \n",i,g->lists[i].data); getchar(); g->lists[i].firstArc = NULL; // printf("Suc1"); } //存储弧 for(int i = 0;i<g->Anum;i++){ ArcNode *node = NULL; int st,end; scanf("%c %c",&st,&end); getchar(); // node = (ArcNode*)malloc(sizeof(ArcNode)); node->next = NULL; node->pos = -1; //找下标(另一个点 ) for(int j =0;j<g->Vnum;j++){ if(g->lists[j].data==end) { node->pos = j; break; } } //没找到结束 if(node->pos ==-1) { printf("FAILED"); exit(0); } //将 node 结点以头插法的方式添加到相应链表中 for(int j =0;j<g->Vnum;j++){ if(g->lists[j].data==st) { node->next = g->lists[j].firstArc; g->lists[j].firstArc = node; } } } } int InDegree(MyGraph* g,char v){ int ans = 0; int pos = -2; //找位置先 for(int i = 0;i<g->Vnum;i++){ if(g->lists[i].data==v) { pos = i; break; } } if(pos ==-2){ printf("没找到捏"); exit(0); } //遍历每一个链 for(int i = 0;i<g->Vnum;i++){ ArcNode* t = g->lists[i].firstArc; while(t){ if(t->pos==pos) ans++; t = t->next; } } return ans; } int OutDegree(MyGraph*g,char v){ int ans = 0; for(int i = 0;i<g->Vnum;i++){ if(g->lists[i].data==v) { ArcNode* t = g->lists[i].firstArc; while(t) { ans++; t = t->next; } } } return ans; } int main(){ MyGraph g; createGraph(&g); printf("%c 顶点的出度为 %d\n", 'A', OutDegree(&g, 'A')); printf("%c 顶点的入度为 %d", 'A', InDegree(&g, 'A')); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具