【数据结构】图的存储和遍历实验报告
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
return temp; } } void CreateMGraph(MGraph *G) { int i,j,k; char ch1,ch2; printf("\n\t\t请输入定点数,边数并按回车(格式如:3,4):"); scanf("%d,%d",&(G->n),&(G->e)); for(i=0;i<G->n;i++) { getchar(); printf("\n\t\t请输入第%d个定点数并按回车:",i+1); scanf("%c",&(G->vexs[i])); } for(i=0;i<G->n;i++) for(j=0;j<G->n;j++) G->edges[i][j]=0; for(k=0;k<G->e;k++) { getchar(); printf("\n\t\t请输入第%d条边的顶点序号(格式如:i,j):",k+1); scanf("%c,%c",&ch1,&ch2); for(i=0;ch1!=G->vexs[i];i++); for(j=0;ch2!=G->vexs[j];j++); G->edges[i][j]=1; } } void DFSM(MGraph *G,int i) { int j; printf("\n\t\t深度优先遍历序列: %c\n",G->vexs[i]); visited[i]=TRUE; for(j=0;j<G->n;j++) if(G->edges[i][j]==1 && visited[j]!=1) //////////////// DFSM(G,j); }
《数据结构B》实验报告
系 计算机与电子 专业 级 01 ห้องสมุดไป่ตู้_班 姓名学号2010年1 0月 9日
1.
上机题目: 图的存储和遍历
2. 详细设计
#include<stdio.h> #define GRAPHMAX 10 #define FALSE 0 #define TRUE 1 #define error printf #define QueueSize 30 typedef struct { char vexs[GRAPHMAX]; int edges[GRAPHMAX][GRAPHMAX]; int n,e; }MGraph; int visited[10]; typedef struct { int front,rear,count; int data[QueueSize]; }CirQueue;
void BFSM(MGraph *G,int k) { int i,j; CirQueue Q; InitQueue(&Q); printf("\n\t\t广度优先遍历序列:%c\n",G->vexs[k]); visited[k]=TRUE; EnQueue(&Q,k); while(!QueueEmpty(&Q)) { i=DeQueue(&Q); for(j=0;j<G->n;j++) if(G->edges[i][j]==1 && visited[j]!=1) { visited[j]=TRUE; EnQueue(&Q,j); } } } void DFSTraverseM(MGraph *G) { int i; for(i=0;i<G->n;i++) visited[i]=FALSE; for(i=0;i<G->n;i++) if(!visited[i]) DFSM(G,i); } void BFSTraverseM(MGraph *G) { int i; for(i=0;i<G->n;i++) visited[i]=FALSE; for(i=0;i<G->n;i++) if(!visited[i]) BFSM(G,i); }
(2) 经验和体会:
必须培养严谨的科学态度。自己在编程时经常因为一些类似于“少了 分号”的小错误而导致错误,不够认真细致,这给自己带来了许多麻 烦。编程是一件十分严谨的事情,容不得马虎。所以在今后自己一定 要培养严谨的科学态度。我想这不仅是对于程序设计,做任何事都应 如此。
4. 测试结果
采用测试数据,列出实际的输入、输出结果。
case 0:ch1='n';break; default:printf("\n\t\t输出错误!清重新输入!"); } } }
3. 调试分析
(1) 调试过程中主要遇到哪些问题?是如何解决 的?
由于实习之初对邻接表的存储结构了解不是很清楚,所以在运行出了 一个小错误,即在输出邻接表时,每个结点都少了一个邻接点。通过 仔细分析,发现是输出邻接表的语句不对,其中的for()循环语句 中的控制条件:p->next!=NULL出了问题。将其改成p!=NULL后,邻 接表便可顺利输出。下面就是经修改后以有向图G1和无向图G2为例 的程序运行结果
void main() { MGraph *G,a; char ch1; int i,j,ch2; G=&a; printf("\n\t\t建立一个有向图的邻接矩阵表示\n"); CreateMGraph(G); printf("\n\t\t已建立一个有向图的邻接矩阵存储\n"); for(i=0;i<G->n;i++) { printf("\n\t\t"); for(j=0;j<G->n;j++) printf("%5d",G->edges[i][j]); } getchar(); ch1='y'; while(ch1=='y'||ch1=='Y') { printf("\n"); printf("\n\t\t 图的存储与遍历 "); printf("\n\t\t********************************"); printf("\n\t\t* 1-----更新邻接矩阵 *"); printf("\n\t\t* 2-----深度优先遍历 *"); printf("\n\t\t* 3-----广度优先遍历 *"); printf("\n\t\t* 0-----退 出 *"); printf("\n\t\t********************************"); printf("\n\t\t请选择菜单号(0----3)"); scanf("%d",&ch2); getchar(); switch(ch2) { case 1:CreateMGraph(G); printf("\n\t\t图的邻接矩阵存储建立完成\n");break; case 2:DFSTraverseM(G);break; case 3:BFSTraverseM(G);break;
void InitQueue(CirQueue *Q) { Q->front=Q->rear=0; Q->count=0; } int QueueEmpty(CirQueue *Q) { return Q->count=QueueSize; } int QueueFull(CirQueue *Q) { return Q->count==QueueSize; } void EnQueue(CirQueue *Q,int x) { if(QueueFull(Q)) error("Queue overflow"); else { Q->count++; Q->data[Q->rear]=x; Q->rear=(Q->rear+1)%QueueSize; } } int DeQueue(CirQueue *Q) { int temp; if(QueueEmpty(Q)) { error("Queue underflow"); return NULL; } else { temp=Q->data[Q->front]; Q->count--; Q->front=(Q->front+1)%QueueSize;