课程设计------邻接表
图的遍历实现课程设计: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(" 请输入两顶点间的关系(用空格隔开):"); 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(" 请输入顶点数和弧数(用空格隔开):"); scanf("%d",&G.vexnum); // 顶点数 scanf("%d",&G.arcnum); // 弧数 x=G.vexnum; if(G.vexnum<20 && G.arcnum<=(x*(x-1))/2){ printf(" 请输入%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(" !!!您输入的总顶点数 大于 20 了或者是输入的总边数 不符合 n(n-1)/2 !!! "); Create(G); } } /*打印输出邻接关系*/ void Print(ALGraph G){ int i; ArcNode *p; printf("邻接表: "); 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 "); } } /*图的深度遍历*/ int visited[MAX_VERTEX_NUM]; // 辅助数组 void DFS(ALGraph &G,int i){ ArcNode *p; visited[i]=1; printf(" 访问到顶点%d ",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(" 深度优先遍历 "); for(i=0;i<G.vexnum;i++){ // 初始化辅助数组 visited[i] = 0; } printf(" 请输入遍历起点:"); scanf("%d",&x); printf(" 遍历起点为:%d ",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(" !!!您输入的起点不在顶点表内!!! "); DFSTraverse(G); } } /*菜单*/ void OperateMenu(){ printf(" --------------请选择元素处理方式--------- "); printf("!!!!!注:测试程序过程中,输入应全为数字!!!!! "); printf("0> :退出 "); printf("1>: 建立无向无权图 "); printf("2>:深度遍历图 "); printf("3>:打印邻接顶点间的关系 "); printf("请选择对元素的处理:"); } /*主函数*/ void main(){ ALGraph G; int w,m; OperateMenu(); scanf("%d",&w); if(w!=1){ printf(" 您未完成建图,是否继续(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("已经建立邻接表!! ");break; case 2:DFSTraverse(G);break; case 3:Print(G);break; } OperateMenu(); scanf("%d",&w); } }