设计图结构实验1206.docx
- 文档编号:30554969
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:17
- 大小:45.01KB
设计图结构实验1206.docx
《设计图结构实验1206.docx》由会员分享,可在线阅读,更多相关《设计图结构实验1206.docx(17页珍藏版)》请在冰豆网上搜索。
设计图结构实验1206
实验6:
图
要求用菜单驱动方法完成下列各题
注:
以下请你任选两个题目,将它们编写在一个完整的程序中(两周内完成);如你不能这样做,则要求在下列三、四、五题中任选二题,对所选的每道题单独编成完整程序(每周完成一个)。
一、题目:
,
对下面给出的无向图,编写一个完整的程序,建立其邻接矩阵,并输出此邻接矩阵。
二、解题思路:
1顶点vi,vj之间无边;
2顶点vi,vj之间有边,
若图为非权图,则邻接矩阵A为:
aij=
称矩阵A为图的邻接矩阵。
矩阵A中的行、列号对应于图中顶点的序号。
例如:
邻接矩阵
G
三、所采用的数据结构与算法:
#definemax100//顶点数的最大值
typedefintdatatype
typedefstruct{
datatypeedges[max+1];//顶点信息
mattypeadmat{max+1}[max+1];//邻接矩阵0行0列不用,mattype是char或权值类型
intn,e;}graph;//n,e为顶点数和边数
建邻接矩阵(对无向图)参考算法:
voidCreate_Graph(graph*ga)
{
inti,j,k;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
ga->admat[i][j]=0;
for(i=1;i {scanf("%d,%d",&j,&k); ga->admat[j][k]=ga->admat[k][j]=1; } } 四、调试与小结 实验二 一、实验题目: 编写一个完整的程序,建立无向图的邻接表,要求其邻接表中的结点按顶点序号从大到小顺序排列。 二、解题思路: 由于要求邻点表中的结点按顶点序号的大小顺序排列,所以在邻接矩阵某行上求邻接点时,如果是从左向右扫描,则要用尾插法建邻点表;如果是从右向左扫描,则要用头插法建邻点表。 下面我们用后者建立邻接表。 三、所采用的数据结构与算法: 邻接表表示的类型定义如下: #definenmax100/*假设顶点的最大数为100*/ typedefstructnode*pointer; structnode{/*表结点类型*/ intvertex; structnode*next; }nnode; typedefstruct{/*表头结点类型,即顶点表结点类型*/ datatypedata; pointerfirst;/*边表头指针*/ }headtype; typedefstruct{/*表头结点向量,即顶点表*/ headtypeadlist[nmax+1]; intn,e;/*顶点数和边数*/ }lkgraph; 参考算法如下: voidmatt_ds(graph*gm,lkgraph*g1) inti,j,n,el; pointerp; g1->n=gm->n;g1->e=gm->e;//gm是实验一中已生成的邻接矩阵 for(i=1;i<=g1->n;i++)g1->adlist[i].first=NULL;//生成邻接表表头 for(i=1;i<=gm->n;i++)//找于第i个结点相邻接的结点 //并将其联到第i个邻接表表头的单链表中 for(j=gm->n;j>=l;j--)//由于是按顶点序号的大小顺序联入邻接表, //所以从后向前进行搜索与第i个结点相邻接的结点 {//若邻接阵相应j列的元素为0,则表示第i个结点与第j个结点不邻接。 if(gm->admat[i][j]==0)continue; p=newnode;//生成新结点 p->vertex=j;//插入到表头 p->next=g1->adlist[i].first; g1->adlist[i].first=p; } } 四、调试与小结 实验三 一、题目: 编写一个完整的程序实现,建立有向图G的邻接表。 编一个函数根据用户输入的偶对(以输入0表示结束)建立有向图G的邻接表,并输出这个邻接表。 二、解题思路: 本题的算法思想是: 先产生邻接表的n个头结点(其结点数值域从1到n),然后接受用户输入的 因此,实现本题功能的函数如下: 1 3 序号datafirstvertexnext 1 4∧ 3 1 2 4∧ 2 1 3 2 1 4 ∧ 如插入结点<4,1>,上图中兰色的结点就是刚插入的新结点。 voidcreatadjlist(lkgrath*g)/*g是指针类型*/ { inti,j,k; structnode*s; for(k=1;k<=n;k++)/*给头结点赋初值*/ { g[k].data=k; g[k].first=NULL;//g[k]应写成g->adlist[k] } printf(”输入一条边点对: ”); scanf(”%d,%d”,&i,&j); while(i! =0&&j! =0) { s=(structvexnode*)malloc(sizeof(structnode));/*产生一个单链表结点s*/ s->vertex=j;/*为结点s赋值*/ s->next=g[i].first;/*插入结点s*/ g[i].first=s;/*将s插到i为表头的单链表的最前面*/ printf(”输入一个偶对: ”); scanf(”%d,%d”,&i,&j); } } 实验四 一、题目: 编写一个用菜单驱动的完整的程序实现: 设图采用邻接表存储,编写一个函数利用深度优先搜索方法求出无向图中通过给定点Vi的简单回路。 二、解题思路: 本题即输出经过Vi且路径长度d大于等于2的路径。 实现本题功能的函数cycle()如下: intvisited[Vnum],A[Vnum]; voiddfspath(lkgrath*g,intvi,intvj,intd) { intv,i; nnode*p;//工作指针 visited[vi]=1; d++; A[d]=vi; If(vi==vj&&d>=2) { cout<<”路径: ”;//打印“路径: ” for(i=0;i<=d;i++) printf(”%d”,A[i]); printf(”\n”); } p=g[vi].link;/*找vi的第一个邻接顶点*/ while(p! =NULL) { v=p->vertex;/*v为vi的邻接顶点*/ if(visited[v]==0||v==vj)/*若该顶点未标记访问,或为vj,则递归访问之*/ dfspath(g,v,vj,d); p=p->next;/*找vi的下一个邻接顶点*/ } visited[vi]=0;/*取消访问标记,以使该顶点可重新使用*/ d--; } voidcycle(adjlist*g,intvi,intd) { dfspath(g,vi,vi,d); } 实验五: 一、实验题目: 编写一个用菜单驱动的完整的程序实现,图的深度优先遍历的非递归算法。 二、解题思路: 这里需要将访问过的顶点人栈。 三、所采用的数据结构与算法: 假设图以邻接表表示,算法如下: voiddfsL(lkgraph*g,intv)/*v是访问的起始顶点,g是表头结点的指针*/ {ints[maxx],top;/*定义,栈顶指针top*/ pointerp;/*定义工作指针p*/ top=-1;/*堆栈s置成空栈,栈的初始化*/ print(“%d”,v);visid[v]=1;/*访问出发点,假设为输出顶点序号,置其被访问标志为1*/ s[++top]=v;/*将访问过的出发点进栈,然后栈顶指针加1*/ do{ p=g->adlist[s->top].first;/*将边表头指针送入工作指针P中,*/ /*使p指向与顶点s->top相邻邦的邻接表的第一个结点*/ while(p! =NULL&&visid[p->vertex]) /*指针p后指结点的p->vertex域是顶点的编号,*/ /*visid[p->vertex]是p后指顶点的访问标志*/ {p=p->next;/*搜索栈顶未访问的一个邻接点*/ if(p==NULL)/*说明该邻接单链表中的所有结点均被访问过*/ top--;/*退到前一个顶点*/ else{ printf(“%d”,p->vertex);/*访问当前工作指针p所指顶点*/ visid[p->vertex]=l;/*置当前p所指顶点的访问标志为1*/ s[++top]=p->vertex;/*将刚访问过顶点p(出发点)入栈*/ } }while(top! =-1);/*直到栈空*/ } 四、调试与小结 答案: #include #include #definemax100//顶点数的最大值 #definenmax100/*假设顶点的最大数为100*/ typedefintdatatype; typedefstruct { datatypevexs[max+1];//顶点信息 intadmat[max+1][max+1];//邻接矩阵0行0列不可用 intn,e;//n,e为顶点数和边数 }graph; graph*G;//邻接矩阵类型 typedefstructnode*pointer;//表结点类型 structnode {/*表结点类型*/ intvertex;//表节点数据 structnode*next;//表结点指针 }nnode; typedefstruct {/*表头结点类型,即顶点表结点类型*/ datatypedata;//表头结点数据 pointerfirst;/*表头结点指针*/ }headtype; typedefstruct {/*表头结点向量,即顶点表*/ headtypeadlist[nmax+1];//图的顶点信息 intn,e;/*顶点数和边数*/ }lkgraph;//邻接表类型 voidCreat_Graph(graph*ga)//无向图邻接矩阵的建立 { inti,j,k; printf("请输入图的顶点数和边数: "); scanf("%d%d",&(ga->n),&(ga->e));//输入无向图的顶点数和边数 for(i=1;i<=ga->n;i++) for(j=1;j<=ga->n;j++) ga->admat[i][j]=0;//邻接矩阵赋初值 printf("请输入%d个顶点对! \n",ga->e); for(k=1;k<=ga->e;k++) { printf("请输入第%d个顶点对(i,j): ",k); scanf("%d%d",&i,&j);/*输入顶点对(i,j)*/ ga->admat[i][j]=1;//无向图连接的两点的矩阵值复制为1 ga->admat[j][i]=1; printf("\n"); } } voidPrint_Graph(graph*ga)//输出无向图的邻接矩阵 { inti,j; for(i=1;i<=ga->n;i++) { for(j=1;j<=ga->n;j++) printf("%3d",ga->admat[i][j]); printf("\n"); } printf("\n"); } voidMatt_ds(graph*gm,lkgraph*g1)//无向图的邻接表的建立 { inti,j,n,gl;//gm是题目一种已生成的邻接矩阵 pointerp;//工作表结点 g1->n=gm->n;//赋值顶点数 g1->e=gm->e;//赋值边数 for(i=1;i<=g1->n;i++) { g1->adlist[i].data=i;//生成领接表头并赋初值 g1->adlist[i].first=NULL; } for(i=1;i<=g1->n;i++)//查找与第i个结点相邻接的结点 {//并将其连接到第i个邻接表头的单链表中 for(j=1;j<=g1->n;j++)//由于是按顶点序号的大小顺序连入邻接表 {//因此从前向后搜索与第i个结点相邻接的结点 if(gm->admat[i][j]==0)//若邻接矩阵相应j列的元素为0,则表示第i continue;//点与第j个结点不邻接 p=(pointer)malloc(sizeof(pointer));//生成新结点 p->vertex=j; p->next=g1->adlist[i].first;//插入到表头 g1->adlist[i].first=p;//头插法 } } } voidprint_Matt_ds(lkgraph*g1)//输出无向图的邻接表 { inti,j; pointerp;//工作表结点 for(i=1;i<=g1->n;i++) { printf("%d->",g1->adlist[i].data); p=g1->adlist[i].first; do { printf("%d->",p->vertex); p=p->next; }while(p! =NULL); printf("NULL\n\n"); } } main() { graph*G;//邻接矩阵类型 lkgraph*G1;//邻接表类型 inti,j,x,y; G1=(lkgraph*)malloc(sizeof(lkgraph));//微量指针变量申请空间 G=(graph*)malloc(sizeof(graph)); do { printf("========主菜单=======\n"); printf("x=1...对无向图建立其邻接矩阵并输出此邻接矩阵! \n"); printf("x=2...建立无向图的邻接表且其邻接表中的结点按顶点序号从大到小顺序排列! \n"); printf("x=0...退出程序! \n"); printf("注意: 如果还没有建立无向图是不能建立无向图的邻接表的! \n\n"); printf("====================\n"); do { fflush(stdin);/*清除掉键盘缓冲区*/ printf("请输入x的值: "); scanf("%d",&x); if((x! =1)&&(x! =2)&&(x! =0)) { printf("请输入正确的x的值! \n\n"); } }while((x! =1)&&(x! =2)&&(x! =0)); switch(x) { case1: printf("\t无向图的建立及其临街矩阵的输出! \n");//无向图邻接矩阵的建立与输出 Creat_Graph(G); printf("建立无向图的邻接矩阵为: \n\n"); Print_Graph(G); printf("\n\n"); break; case2: printf("\t建立无向图的邻接表并输出! \n");//无向图邻接表的建立与输出 Matt_ds(G,G1); printf("输出无向图的邻接表: \n\n"); print_Matt_ds(G1); printf("\n\n"); break; } }while(x! =0); printf("\t再见! \n"); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计图 结构 实验 1206