为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

数据结构图的存储结构及基本操作

2019-03-15 23页 doc 46KB 29阅读

用户头像

is_005190

暂无简介

举报
数据结构图的存储结构及基本操作1. 实验目的 通过上机实验进一步掌握图的存储结构及基本操作的实现。 2. 实验内容与要求 要求: ⑴能根据输入的顶点、边/弧的信息建立图; ⑵实现图中顶点、边/弧的插入、删除; ⑶实现对该图的深度优先遍历; ⑷实现对该图的广度优先遍历。 备注:单号基于邻接矩阵,双号基于邻接表存储结构实现上述操作。 3. 数据结构设计 逻辑结构:图状结构 存储结构:顺序存储结构、链式存储结构 4. 算法设计 #include #include #include #define MAX_VERTEX_NUM 20 typedef str...
数据结构图的存储结构及基本操作
1. 实验目的 通过上机实验进一步掌握图的存储结构及基本操作的实现。 2. 实验内容与要求 要求: ⑴能根据输入的顶点、边/弧的信息建立图; ⑵实现图中顶点、边/弧的插入、删除; ⑶实现对该图的深度优先遍历; ⑷实现对该图的广度优先遍历。 备注:单号基于邻接矩阵,双号基于邻接表存储结构实现上述操作。 3. 数据结构 逻辑结构:图状结构 存储结构:顺序存储结构、链式存储结构 4. 算法设计 #include #include #include #define MAX_VERTEX_NUM 20 typedef struct ArcNode { int adjvex; struct ArcNode *nextarc; }ArcNode; typedef struct VNode { char data[2];        //顶点就设置和书上V1等等一样吧 ArcNode *firstarc; }VNode,AdjList[MAX_VERTEX_NUM]; typedef struct { AdjList vertices; int vexnum,arcnum; }ALGraph; typedef struct { int data[MAX_VERTEX_NUM+10]; int front; int rear; }queue; int visited[MAX_VERTEX_NUM]; queue  q; int main() { ALGraph G; int CreateUDG(ALGraph &G); int DeleteUDG(ALGraph &G); int InsertUDG(ALGraph &G); void BFSTraverse(ALGraph G, int (*Visit)(ALGraph G,ArcNode v)); int PrintElement(ALGraph G,ArcNode v); void menu(); void depthfirstsearch(ALGraph *g,int  vi); void travel(ALGraph  *g); void    breadfirstsearch(ALGraph    *g); int i; G.arcnum = G.vexnum = 0; while(1) { menu(); do { printf ( "请输入要进行的操作\n" ); scanf ("%d",&i); if (i<1||i>6) printf("错误数字,请重新输入\n"); }while (i<1||i>6); switch (i) { case 1: CreateUDG(G); system("pause"); system("cls"); break; case 2: DeleteUDG(G); system("pause"); system("cls"); break; case 3: InsertUDG(G); system("pause"); system("cls"); break; case 4: travel(&G); system("pause"); system("cls");  break; case 5: breadfirstsearch(&G); system("pause"); system("cls"); break; case 6: exit(0); break; } } return 1; } void enterqueue(int v) { q.data[q.rear]=v; q.rear++; } int deletequeue() { int t; t=q.data[q.front]; q.front++; return(t); } int empty() { if(q.front==q.rear) return  1; return      0; } int LocateVex(ALGraph G,char node[2]) { int i; for(i = 0 ; i < G.vexnum ; i++) { if(strcmp(G.vertices[i].data,node)==0) return i; } return -1; } int CreateUDG(ALGraph &G) { int LocateVex(ALGraph G,char node[2]); void PrintUDG(ALGraph G); int i,j,k; char node1[2],node2[2]; ArcNode *p,*q; printf("请输入顶点数和弧数\n"); printf("例如:5,6\n"); scanf("%d,%d",&G.vexnum,&G.arcnum); printf("请输入各顶点\n"); for(i = 0 ; i < G.vexnum ; i++) { printf("第%d个\n",i+1); scanf("%s",&G.vertices[i]); G.vertices[i].firstarc = NULL; } //这里开始构造边 printf("请输入边的信息\n"); printf("例如:v1 v2\n"); for(i = 0 ; i < G.arcnum ; i++) { printf("第%d条边\n",i+1); scanf("%s %s",&node1,&node2); j = LocateVex(G,node1); k = LocateVex(G,node2); p = (ArcNode *)malloc(sizeof(ArcNode)); q = (ArcNode *)malloc(sizeof(ArcNode)); p->adjvex = k; q->adjvex = j; p->nextarc = G.vertices[j].firstarc; G.vertices[j].firstarc = p; q->nextarc = G.vertices[k].firstarc; G.vertices[k].firstarc = q; } PrintUDG(G); return 1; } int DeleteUDG(ALGraph &G) { int i,j; ArcNode *p,*q; char node[2]; int LocateVex(ALGraph G,char node[2]); void PrintUDG(ALGraph G); if(G.arcnum == 0) { printf("请先生成图\n"); return 0; } printf("请输入要删除的节点\n"); scanf("%s",&node); i = LocateVex(G,node); if(i == -1) { printf("无此节点\n"); return 0; } else { G.vexnum--; if((p = q = G.vertices[i].firstarc) != NULL) { G.arcnum--; p = p->nextarc; G.vertices[i].firstarc = p; free(q); q = p; while(p != NULL) { G.arcnum--; p = p->nextarc; G.vertices[i].firstarc = p; free(q); q = p; } } for(j = 0 ; j < G.vexnum ; j++ ) { if(j >= i) { strcpy(G.vertices[j].data , G.vertices[j+1].data); G.vertices[j].firstarc = G.vertices[j+1].firstarc; } if(G.vertices[j].firstarc->nextarc != NULL) { p = G.vertices[j].firstarc; q = p->nextarc; if(p->adjvex == i) { G.vertices[j].firstarc = q; p = q; q = q->nextarc; continue; } else if(p->adjvex > i) p->adjvex--; while(q != NULL) { if(q->adjvex == i) { p->nextarc = q->nextarc; free(q); q = p->nextarc; } else if(q->adjvex > i) q->adjvex--; else { p = p->nextarc; q = q->nextarc; } } } else if( (G.vertices[j].firstarc->nextarc == NULL) && (G.vertices[j].firstarc != NULL) ) if( G.vertices[j].firstarc->adjvex == i ) { G.vertices[j].firstarc = NULL; } } } PrintUDG(G); return 1; } int InsertUDG(ALGraph &G) { //默认一次插入一个节点吧,不然太麻烦 int i,j,k,l; char node1[2],node2[2]; ArcNode *p,*q; int LocateVex(ALGraph G,char node[2]); void PrintUDG(ALGraph G); if(G.arcnum == 0) { printf("请先生成图\n"); return 0; } printf("请输入插入节点的名称\n"); printf("WARNING:绝不可以和之前的节点重名!\n"); scanf("%s",&G.vertices[G.vexnum].data); G.vertices[G.vexnum].firstarc = NULL; printf("请输入需要插入的边的数目\n"); scanf("%d",&i); G.arcnum += i; G.vexnum++; printf("请输入边的信息\n"); printf("例如:v6 v2\n"); printf("WARNING:一定要包含刚加入的节点名称!\n"); for(j = 0 ; j < i ; j++) { printf("第%d条边\n",j+1); scanf("%s %s",&node1,&node2); l = LocateVex(G,node1); k = LocateVex(G,node2); p = (ArcNode *)malloc(sizeof(ArcNode)); q = (ArcNode *)malloc(sizeof(ArcNode)); p->adjvex = k; q->adjvex = l; p->nextarc = G.vertices[l].firstarc; G.vertices[l].firstarc = p; q->nextarc = G.vertices[k].firstarc; G.vertices[k].firstarc = q; } PrintUDG(G); return 1; } void depthfirstsearch(ALGraph *g,int  vi) { ArcNode *rear; printf("%s\t",g->vertices[vi].data); visited[vi]=1; rear=g->vertices[vi].firstarc; while((rear!=NULL)&&(!visited[rear->adjvex])) { depthfirstsearch(g,rear->adjvex); rear=rear->nextarc; } } void travel(ALGraph  *g) { int v; for(v=0;vvexnum;v++) if(!visited[v]) depthfirstsearch(g,v); } void breadfirstsearch(ALGraph *g) { int v,t,i; ArcNode *rear; for(i = 0 ; i vexnum ; i++) visited[i] = 0; for(v=0;vvexnum;v++) { if(!visited[v]) { printf("%s",g->vertices[v].data); visited[v]=1; enterqueue(v); } while(!empty()) { t=deletequeue(); rear=g->vertices[t].firstarc; while((rear!=NULL)&&(!visited[rear->adjvex])) { printf("%s\t",g->vertices[rear->adjvex].data); visited[rear->adjvex]=1; enterqueue(rear->adjvex); rear=rear->nextarc; } } } } void menu() { printf("*********************************************\n"); printf("*                作者:Dick                *\n"); printf("*      信计1001          xxxxxxxxxx      *\n"); printf("*********************MENU********************\n"); printf("1 建立无向图\n"); printf("2 删除图中节点\n"); printf("3 插入节点\n"); printf("4 深度优先遍历图\n"); printf("5 广度优先遍历图\n"); printf("6 退出程序\n"); } void PrintUDG(ALGraph G) { int i; ArcNode *p; for(i = 0 ; i < G.vexnum ; i++) { if(G.vertices[i].firstarc != NULL) { printf("与节点%s相邻的节点为:\n",G.vertices[i].data); p = G.vertices[i].firstarc; while(p != NULL) { printf("%s\t",G.vertices[p->adjvex].data); p = p->nextarc; } printf("\n"); } else printf("无与节点%s相邻的节点\n",G.vertices[i].data); } } 5. 测试结果 图一:菜单项 图五:深度优先遍历图 图四:广度优先遍历图 图三:插入节点 图二:建立图 图一:菜单项 图二:建立图 图三:插入节点
/
本文档为【数据结构图的存储结构及基本操作】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索