- 1.邻接矩阵的数据类型描述:
- 2.邻接链表的数据类型定义:
- 3.代码思路:
- 练习题6-1 有向图邻接矩阵转换为邻接表 (10 分)
#define MAXVEX 20 typedef char Vextype; typedef struct { int arcs[MAXVEX+1][MAXVEX+1]; Vextype vex[MAXVEX+1]; int vexnum; int arcnum; }AdjMatrix;2.邻接链表的数据类型定义:
typedef struct ArcNode { int adjvex; struct ArcNode *next; }ArcNode; typedef struct { Vextype vexdata; ArcNode *head; }VertexNode; typedef struct { VertexNode vertex[MAXVEX]; int vexnum; int arcnum; }AdjList;3.代码思路:
先将临界矩阵与邻接链表的顶点数目与边数目置为相等;
建立指向邻接链表的指针s,p;建立双重循环判断邻接矩阵中的arce[i][j]中的是否为1(1是图中没有带权值,且其对应的顶点之间有关系)再将矩阵中对应顶点关系的下标值赋值给邻接矩阵中的s所指的下标值。令p=vertex[i].head;
判断p是否为空,如果为空的话讲s赋值给p,若不为空将s中的值插到p的后面。
编写算法实现将有向图的邻接矩阵转换为邻接表
输入说明:
第一行,输入顶点总数n
第二行,连续输入n个字符,无间隔,依次为各个顶点的信息
第三行,输入弧总数e
第四行,连续输入e条弧,例如:
输出说明:
依照顶点顺序输出各个顶点的邻接表,每个顶点一行。
每行先输出顶点序号,顶点信息,然后依次输出各个邻接点的编号(注意:各邻接点按顶点序号升序排列),详见输出样例。
裁判测试程序样例:
#include#include void Creat_AdjMatrix(AdjMatrix *G); //创建邻接矩阵 int LocateVex_AdjMatrix(AdjMatrix *G,Vextype v); void Print_AdjList(AdjList *G); //输出邻接表 void AdjMatrixToAdjList(AdjMatrix *M,AdjList *L); //邻接矩阵转换为邻接表 main() { AdjMatrix gM; AdjList gL; Creat_AdjMatrix(&gM); AdjMatrixToAdjList(&gM,&gL); Print_AdjList(&gL); } void Creat_AdjMatrix(AdjMatrix *G)//创建邻接矩阵 { int i,j,k; char v1,v2; scanf("%dn",&(G->vexnum)); for(i=1;i<=G->vexnum;i++) { scanf("%c",&(G->vex[i])); for(j=1;j<=G->vexnum;j++) G->arcs[i][j]=0; } scanf("%dn",&(G->arcnum)); for(k=1;k<=G->arcnum;k++) { scanf("<%c,%c>",&v1,&v2); i=LocateVex_AdjMatrix(G,v1); j=LocateVex_AdjMatrix(G,v2); G->arcs[i][j]=1; } } int LocateVex_AdjMatrix(AdjMatrix *G,Vextype v)//输出邻接表 { int i; for(i=1;i<=G->vexnum;i++) if(G->vex[i]==v) return i; return 0; } void Print_AdjList(AdjList *G) { int i; ArcNode *p; for(i=1;i<=G->vexnum;i++) { printf("%d:(%c)",i,G->vertex[i].vexdata); for(p=G->vertex[i].head;p;p=p->next) { printf("->%d",p->adjvex); } printf("n"); } }
输入样例:
5 abcde 7结尾无空行
输出样例:
1:(a)->2->5 2:(b)->3 3:(c)->4 4:(d)->1->2 5:(e)->3 结尾无空行
代码实现:
void AdjMatrixToAdjList(AdjMatrix *M,AdjList *L){ L->vexnum=M->vexnum; L->arcnum=M->arcnum; int i,j; ArcNode *p,*s; for(i=1;i<=L->vexnum;i++){ L->vertex[i].vexdata=M->vex[i]; L->vertex[i].head=NULL; } for(i=1;i<=M->vexnum;i++){ for(j=1;j<=M->vexnum;j++){ if(M->arcs[i][j]==1){ s=(ArcNode*)malloc(sizeof(ArcNode)); s->adjvex=j; s->next=NULL; p=L->vertex[i].head; if(p==NULL) { L->vertex[i].head=s; } else{ while(p->next) p=p->next; s->next=p->next; p->next=s; } } } } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)