用C语言实现:邻接表创建无向图,并且用DFS和BFS方式遍历输出该图结构,需源码。
2条回答 默认 最新
- 语言-逆行者 2022-11-22 21:47关注
我有源码
#include<stdio.h> #include<stdlib.h> #define MaxWeight 1000//如果二维数组的某数据为1000,则输出符号∞ #define MaxVert 100 //邻接表最大顶点个数 typedef char DataType; //2.1.1邻接表结构体类型 typedef struct ArcNode { DataType adjvex; //邻接边的顶点值 int weight; //权值 struct ArcNode *nextarc; // 单链表的下一个顶点指针 } ArcNode; //2.1.2顶点表的结构体 typedef struct Vnode { DataType data; //顶点元素 ArcNode *firstarc; //邻接边的头指针 } VNode; //2.1.3顶点数组表的结构体 typedef struct { VNode vertices[MaxVert]; //邻接表指针代替一维数组 int vexnum,arcnum; //图的当前顶点数和边数 } ALGraph; //判断邻接表顶点是否存在,并找到在数组中的下标位置 int FindV(ALGraph *G,DataType V) { int i; for(i=0;i<G->vexnum;i++) { if(V==G->vertices[i].data) return i; } printf("该顶点不存在!"); return -1; } //邻接表初始化 void InitiateBiao(ALGraph *g) { int i; g->arcnum=0; g->vexnum=0; for(i=0;i<MaxVert;i++) { g->vertices[i].firstarc=NULL;//置邻接边单链表头指针为空 } } //2.2创建有n个顶点序号和m条边的无向图,用邻接表来储存 void CreateMGraphBiao(ALGraph *g,int n,int m) { int i,j,k,value; DataType v1,v2; ArcNode *p1=NULL,*p2=NULL; g->arcnum=m; g->vexnum=n; //顶点数表据域填值初始化顶点表指针域 for(i=0;i<n;i++) { printf("输入顶点%d元素:",i+1); getchar(); scanf_s("%c",&(g->vertices[i].data));//填数据 g->vertices[i].firstarc=NULL; //顶点结构体指针域为空 } printf("\n"); //输入边的信息构造邻接表 printf("请输入边的信息(两顶点和权值):(空格隔开)\n"); for(i=0;i<g->arcnum;i++) {//输入边的信息,并确定v1,v2在G中的位置,即顶点在vertices指针所指向的一维下标 printf("请输入第%d条边信息:",i+1); getchar(); scanf("%c %c %d",&v1,&v2,&value); j=FindV(g,v1); k=FindV(g,v2); if(j==-1&&k==-1) { printf("该顶点不存在!"); return ; } p1=(ArcNode*)malloc(sizeof(ArcNode)); p1->adjvex=g->vertices[k].data;//寻找下标k对应的值赋值给结点ANode中的adjvex p1->weight=value; p1->nextarc=g->vertices[j].firstarc;//改链,头插法 g->vertices[j].firstarc=p1; /* 对称插点 */ p2=(ArcNode*)malloc(sizeof(ArcNode)); p2->adjvex=g->vertices[j].data;//寻找下标j对应的值赋值给结点ANode中的adjvex p2->weight=value; p2->nextarc=g->vertices[k].firstarc;//改链,头插法 g->vertices[k].firstarc=p2; } } //2.3输出邻接表 void OutputBiao(ALGraph *G) //输出邻接表G { printf("\n"); printf(" 无向图的邻接表如下:\n"); int i; ArcNode *p; for (i=0; i<G->vexnum; i++) { printf("\n vertices[%d]%c:",i,G->vertices[i].data); p=G->vertices[i].firstarc; while (p!=NULL) { printf("-->%c权值[%d]",p->adjvex,p->weight); p=p->nextarc; } printf("\n"); } } //4.0 void Visit(DataType item) { printf("%c-->",item); } //5.2邻接表:图的广度优先遍历 int main() { int n,m,e,sz; char vi,vj; ALGraph g; int N,M; printf("| 图的储存方式 |\n"); printf("| 1、邻接表 |\n"); printf("输入顶点数和边数:(空格隔开)"); getchar();//吃掉回车符 scanf_s("%d%d",&N,&M); InitiateBiao(&g); CreateMGraphBiao(&g,N,M); OutputBiao(&g); return 0; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥15 Qt 不小心删除了自带的类,该怎么办
- ¥15 我需要在PC端 开两个抖店工作台客户端.(语言-java)
- ¥15 有没有哪位厉害的人可以用C#可视化呀
- ¥15 可以帮我看看代码哪里错了吗
- ¥15 设计一个成绩管理系统
- ¥15 PCL注册的选点等函数如何取消注册
- ¥15 问一下各位,为什么我用蓝牙直接发送模拟输入的数据,接收端显示乱码呢,米思齐软件上usb串口显示正常的字符串呢?
- ¥15 Python爬虫程序
- ¥15 crypto 这种的应该怎么找flag?
- ¥15 代码已写好,求帮我指出错误,有偿!