c_数据结构_图_邻接表
课程设计------邻接表
图的遍历实现课程设计:https://files.cnblogs.com/files/Vera-y/图的遍历_课程设计.zip
#include<stdio.h> #include<stdlib.h> #include<windows.h> #define OK 1 #define MAX_VERTEX_NUM 20 //最大顶点个数 //邻接表存储结构 typedef struct ArcNode { //邻接顶点信息链表 int adjvex; //该弧指向的结点位置 struct ArcNode *nextarc; //指向下一个弧的指针 }ArcNode; typedef struct VNode { //顶点信息数组 char data; //顶点信息 ArcNode *firstarc; //指向第一条依附该顶点的弧指针 }VNode,AdjList[MAX_VERTEX_NUM]; typedef struct { //图的邻接表存储结构 AdjList vertices; int vexnum,arcnum; }ALGraph; /*定位顶点*/ int LocateVex(ALGraph G,int v){ int i; for(i=0;i<G.vexnum;i++) if(G.vertices[i].data == v) return i; return -1; } /*边的连接*/ int CreateSide(ALGraph &G){ int m,n,v1,v2;ArcNode *s; printf("\n请输入两顶点间的关系(用空格隔开):"); fflush(stdin); scanf("%d %d",&v1,&v2); m = LocateVex(G,v1); n = LocateVex(G,v2); while (m==-1||n==-1) { printf("!!!顶点输入错误!!!"); if(CreateSide(G))break; } s = (ArcNode * )malloc(sizeof(ArcNode)); s->adjvex = n; // 新的顶点指向结点位置的信息 s->nextarc = G.vertices[m].firstarc; // 新的顶点的next指向m位置的next G.vertices[m].firstarc = s; // m 位置的next指向新节点 return OK; } /*图的创建*/ void Create(ALGraph &G){ int i,x; printf("\n请输入顶点数和弧数(用空格隔开):"); scanf("%d",&G.vexnum); // 顶点数 scanf("%d",&G.arcnum); // 弧数 x=G.vexnum; if(G.vexnum<20 && G.arcnum<=(x*(x-1))/2){ printf("\n请输入%d 个顶点值(用空格隔开):",G.vexnum); for(i=0;i<G.vexnum;i++){ // 循环存入顶点值 scanf("%d",&G.vertices[i].data); G.vertices[i].firstarc=NULL; } for(i=0;i<G.arcnum;i++){ CreateSide(G); } }else{ printf("\n!!!您输入的总顶点数 大于 20 了或者是输入的总边数 不符合 n(n-1)/2 !!!\n"); Create(G); } } /*打印输出邻接关系*/ void Print(ALGraph G){ int i; ArcNode *p; printf("邻接表:\n"); for(i=0;i<G.vexnum;i++){ printf("%d ->",G.vertices[i].data); p = G.vertices[i].firstarc; while(p){ printf("%d-> ",G.vertices[p->adjvex].data); p = p->nextarc; } printf("NULL\n"); } } /*图的深度遍历*/ int visited[MAX_VERTEX_NUM]; // 辅助数组 void DFS(ALGraph &G,int i){ ArcNode *p; visited[i]=1; printf("\n访问到顶点%d \n",G.vertices[i].data); p = G.vertices[i].firstarc; while(p){ if(visited[p->adjvex]==0){ // 如果结点未被访问 DFS(G,p->adjvex); } p = p->nextarc; } } /* 保证非连通图被遍历*/ void DFSTraverse(ALGraph &G){ int i,m,x;ArcNode *p; printf("\n深度优先遍历\n"); for(i=0;i<G.vexnum;i++){ // 初始化辅助数组 visited[i] = 0; } printf("\n请输入遍历起点:"); scanf("%d",&x); printf("\n遍历起点为:%d \n",x); m = LocateVex(G,x); if(m!=-1){ visited[m]=1; p = G.vertices[m].firstarc; while(p){ if(visited[p->adjvex]==0){ // 如果结点未被访问 DFS(G,p->adjvex); } p = p->nextarc; } for(i=0;i<G.vexnum;i++){ // 保证非连通图被遍历 if(visited[i]==0){ DFS(G,i); } } }else{ printf("\n!!!您输入的起点不在顶点表内!!!\n"); DFSTraverse(G); } } /*菜单*/ void OperateMenu(){ printf("\n--------------请选择元素处理方式---------\n\n"); printf("!!!!!注:测试程序过程中,输入应全为数字!!!!!\n\n"); printf("0> :退出\n\n"); printf("1>: 建立无向无权图\n\n"); printf("2>:深度遍历图\n\n"); printf("3>:打印邻接顶点间的关系\n\n"); printf("请选择对元素的处理:"); } /*主函数*/ void main(){ ALGraph G; int w,m; OperateMenu(); scanf("%d",&w); if(w!=1){ printf("\n您未完成建图,是否继续(1-建图,0-退出):"); scanf("%d",&m); if(m==1){ w=1; Create(G); } else w=0; } while(w){ switch(w){ case 0:break; case 1:printf("已经建立邻接表!!\n");break; case 2:DFSTraverse(G);break; case 3:Print(G);break; } OperateMenu(); scanf("%d",&w); } }