实验报告(实验七)专业班级姓名学号课程名称数据结构学年2009 --2010 学期1□/ 2□课程类别专业必修□限选□任选□实践□●实验内容:实验时间:2010年7月2日1.编写函数,采用邻接矩阵表示法,构造一个无向网。
2.编写函数,实现从键盘输入数据,建立一个有向图的邻接表。
3.编写函数,输出该邻接表。
4.编写函数,采用邻接表存储实现无向图的深度优先非递归遍历。
5.编写函数,采用邻接表存储实现无向图的广度优先遍历。
6.编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法。
●实验目的及要求:1.掌握图的存储思想及其存储实现2.掌握图的深度、广度优先遍历算法思想及其程序实现3.掌握图的常见应用算法的思想及其程序实现●方法与步骤:详见从第2页开始的源代码●实验结果:●小结:分数:批阅老师:2010年月日实验报告(附页)源代码:#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX_VERTEX_NUM 10 //顶点最大个数#define STACK_INIT_SIZE 100//邻接矩阵的类型定义#define INFINITY 888 /* 用888代替∞*/typedef struct ArcCell{int adj;}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct{int vexs[MAX_VERTEX_NUM];AdjMatrix arcs;int vexnum,arcnum;}MGraph;//构造无向网MGraph *CreateUDN(MGraph *N){int i,j,k,w;int v1,v2;printf("输入顶点的个数:");scanf("%d",&N->vexnum);printf("输入边数:");scanf("%d",&N->arcnum);printf("输入%d个顶点的元素:",N->vexnum);for(i=0;i<N->vexnum;i++){scanf("%d",&N->vexs[i]);}for(i=0;i<N->vexnum;i++)for(j=0;j<N->vexnum;j++)N->arcs[i][j].adj=INFINITY;for(k=0;k<N->arcnum;k++){printf("输入第%d条边所依附的顶点:",k+1);scanf("%d%d",&v1,&v2);printf("输入权值:");scanf("%d",&w);for(i=0;i<N->vexnum;i++)if(v1==N->vexs[i])break;for(j=0;j<N->vexnum;j++)if(v2==N->vexs[j])break;N->arcs[i][j].adj=w;N->arcs[j][i]=N->arcs[i][j];}printf(" ");for(i=0;i<N->vexnum;i++)printf(" v%d",N->vexs[i]);printf("\n");for(i=0;i<N->vexnum;i++){printf(" v%d",N->vexs[i]);for(j=0;j<N->vexnum;j++)printf(" %3d ",N->arcs[i][j].adj);printf("\n");}return N;}//邻接表的类型定义typedef struct ArcNode{int adjvex;struct ArcNode *nextarc;int weight; //边的权}ArcNode; //表结点typedef struct VNode{int degree,indegree;//顶点的度,入度int data;ArcNode *firstarc;}VNode,AdjList[MAX_VERTEX_NUM];typedef struct{AdjList vertices;int vexnum,arcnum;//顶点的实际数,边的实际数}ALGraph;#define TRUE 0#define FALSE -1//确定位置int LocateVex(ALGraph *G,int v){int i;for( i=0;v!=G->vertices[i].data&&i<G->vexnum;++i);if(i>G->vexnum)return -1;return i;}//创建有向图的邻接表ALGraph *createDG(ALGraph *G){int i,j,k;int v1,v2;ArcNode *p;printf("输入顶点的个数:");scanf("%d",&G->vexnum);printf("输入边数:");scanf("%d",&G->arcnum);printf("输入%d个顶点的元素:",G->vexnum);for(i=0;i<G->vexnum;++i){scanf("%d",&G->vertices[i].data);G->vertices[i].firstarc=NULL;}for(k=0;k<G->arcnum;++k){printf("输入第%d条边所依附的顶点:",k+1);scanf("%d%d",&v1,&v2);i=LocateVex(G,v1);j=LocateVex(G,v2);p=(ArcNode *)malloc(sizeof(ArcNode));p->adjvex=j;p->nextarc=G->vertices[i].firstarc;G->vertices[i].firstarc=p;}printf("创建成功邻接表!\n");return G;}//输出邻接表void printfAdjList(ALGraph *G){int i;ArcNode *p;printf(" %s %s %s\n","编号","顶点","相邻边编号");for (i=0;i<G->vexnum;++i){printf("%4d v%d",i,G->vertices[i].data);for(p=G->vertices[i].firstarc;p;p=p->nextarc)printf("->%2d", p->adjvex);printf("\n");}}//顺序栈类型定义typedef struct{int *base;int *top;int stacksize;}SqStack;//栈初始化SqStack *InitStack(){SqStack *s;s=(SqStack *)malloc(sizeof(SqStack));s->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));s->top=s->base;s->stacksize=STACK_INIT_SIZE;return s;}//入栈SqStack *PushStack(SqStack *s,int i){(*s->top)=i;s->top++;return s;}//出栈int PopStack(SqStack *s){int i;if(s->top==s->base)return NULL;s->top--;i=(*s->top);return i;}//深度优先非递归遍历void DFSTraverse(ALGraph *G){int i,u;char visited[MAX_VERTEX_NUM]={0};SqStack *s;ArcNode *p;s=InitStack();for(i=0;i<G->vexnum;i++)visited[i]=FALSE;for(i=0;i<G->vexnum;i++)if(visited[i]){visited[i]=TRUE;printf("%d ",G->vertices[i].data);s=PushStack(s,i);while((s->base!=s->top)){u=PopStack(s);s=PushStack(s,u);for(p=G->vertices[u].firstarc;p;p=p->nextarc){if(visited[p->adjvex]){visited[p->adjvex]=TRUE;printf("%d ",G->vertices[p->adjvex].data);s=PushStack(s,p->adjvex);break;}else{u=PopStack(s);}}}}}//创建无向图的邻接表ALGraph *createUDG(ALGraph *G){int i,j,k;int v1,v2;ArcNode *p,*q;printf("输入顶点的个数:");scanf("%d",&G->vexnum);printf("输入边数:");scanf("%d",&G->arcnum);printf("输入%d个顶点的元素:",G->vexnum);for(i=0;i<G->vexnum;++i){scanf("%d",&G->vertices[i].data);G->vertices[i].firstarc=NULL;}for(k=0;k<G->arcnum;++k){printf("输入第%d条边所依附的顶点:",k+1);scanf("%d%d",&v1,&v2);i=LocateVex(G,v1);j=LocateVex(G,v2);p=(ArcNode *)malloc(sizeof(ArcNode));p->adjvex=j;p->nextarc=G->vertices[i].firstarc;G->vertices[i].firstarc=p;q=(ArcNode *)malloc(sizeof(ArcNode));q->adjvex=i;q->nextarc=G->vertices[j].firstarc;G->vertices[j].firstarc=q;}printf("创建成功邻接表!\n");return G;}//单链队列的类型定义typedef struct QNode{int data;struct QNode *next;}QNode,*QueuePtr;typedef struct{QueuePtr front;//队头指针QueuePtr rear;//队尾指针}*LinkQueue,Queue;//创建队列LinkQueue InitLinkQueue(){LinkQueue Q;Q=(LinkQueue)malloc(sizeof(Queue));Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));Q->front->next=NULL;return Q;}//入队LinkQueue EnLinkQueue(LinkQueue Q,int data){QueuePtr p;p=(QueuePtr)malloc(sizeof(QNode));p->data=data;p->next=NULL;Q->rear->next=p;Q->rear=p;return Q;}//出队int DeLinkQueue(LinkQueue Q){QueuePtr p;int data;p=Q->front->next;data=p->data;Q->front->next=p->next;if(Q->rear==p)Q->rear=Q->front;free(p);return data;}//广度优先遍历void BFSTraverse(ALGraph *G){LinkQueue Q;ArcNode *p;int i,u;char visited[MAX_VERTEX_NUM];Q=InitLinkQueue();for(i=0;i<G->vexnum;i++)visited[i]=FALSE;for(i=0;i<G->vexnum;i++)if(visited[i]){visited[i]=TRUE;printf("%d ",G->vertices[i].data);Q=EnLinkQueue(Q,i);while(Q->front!=Q->rear){u=DeLinkQueue(Q);for(p=G->vertices[u].firstarc;p;p=p->nextarc){if(visited[p->adjvex]){visited[p->adjvex]=TRUE;printf("%d ",G->vertices[p->adjvex].data);Q=EnLinkQueue(Q,p->adjvex);}}}}}//主函数void main(){int choice;MGraph *N;ALGraph *G;N=(MGraph *)malloc(sizeof(MGraph));G=(ALGraph *)malloc(sizeof(ALGraph));do{ printf("\t\t************************************************\n");printf("\t\t*1.采用邻接矩阵表示法,构造一个无向网*\n");printf("\t\t*2.实现从键盘输入数据,建立一个有向图的邻接表*\n");printf("\t\t*3.输出2中建立的有向图的邻接表*\n");printf("\t\t*4.构造一个无向图*\n");printf("\t\t*5.采用邻接表存储实现无向图的深度优先非递归遍历*\n");printf("\t\t*6.采用邻接表存储实现无向图的广度优先遍历*\n");printf("\t\t*0:退出*\n");printf("\t\t*请选择:0-6 *\n");printf("\t\t************************************************\n");scanf("%d",&choice);switch(choice){case 1:CreateUDN(N);break;case 2:G=createDG(G);break;case 3:printfAdjList(G);break;case 4:G=createUDG(G);break;case 5:DFSTraverse(G);printf("\n");break;case 6:BFSTraverse(G);printf("\n");break;}}while(choice!=0);}程序调试截图:主菜单:采用邻接矩阵表示法,构造一个无向网:实现从键盘输入数据,建立一个有向图的邻接表:输出2中建立的有向图的邻接表:构造一个无向图:采用邻接表存储实现无向图的深度优先非递归遍历:采用邻接表存储实现无向图的广度优先遍历:。