将一个无向图的邻接表转换为邻接矩阵算法

合集下载

图的邻接矩阵和邻接表相互转换

图的邻接矩阵和邻接表相互转换

图的邻接矩阵和邻接表相互转换图的邻接矩阵存储方法具有如下几个特征:1)无向图的邻接矩阵一定是一个对称矩阵。

2)对于无向图的邻接矩阵的第i 行非零元素的个数正好是第i 个顶点的度()i v TD 。

3)对于有向图,邻接矩阵的第i 行非零元素的个数正好是第i 个顶点的出度()i v OD (或入度()i v ID )。

4)用邻接矩阵方法存储图,很容易确定图中任意两个顶点之间是否有边相连;但是,要确定图中有多少条边,则必须按行、按列对每个元素进行检测,所发费得时间代价大。

邻接表是图的一种顺序存储与链式存储相结合的存储方法。

若无向图中有n 个顶点、e 条边,则它的邻接表需n 个头结点和2e 个表结点。

显然,在边稀疏的情况下,用邻接表表示图比邻接矩阵存储空间。

在无向图的邻接表中,顶点i v 的度恰好是第i 个链表中的结点数,而在有向图中,第i 个链表中结点个数是顶点i v 的出度。

在建立邻接表或邻逆接表时,若输入的顶点信息即为顶点的编号,则建立临接表的时间复杂度是)(e n O +;否则,需要通过查找才能得到顶点在图中位置,则时间复杂度为)*(e n O 。

在邻接表上容易找到任意一顶点的第一个邻接点和下一个邻接点,但要判断任意两个顶点之间是否有边或弧,则需要搜索第i 个或第j 个链表,因此,不及邻接矩阵方便。

邻接矩阵和邻接表相互转换程序代码如下:#include<iostream.h>#define MAX 20//图的邻接表存储表示typedef struct ArcNode{int adjvex; //弧的邻接定点 char info; //邻接点值struct ArcNode *nextarc; //指向下一条弧的指针}ArcNode;typedef struct Vnode{ //节点信息char data;ArcNode *link;}Vnode,AdjList[MAX];typedef struct{AdjList vertices;int vexnum; //节点数int arcnum; //边数}ALGraph;//图的邻接矩阵存储表示typedef struct{int n; //顶点个数char vexs[MAX]; //定点信息int arcs[MAX][MAX]; //边信息矩阵}AdjMatrix;/***_____________________________________________________***///函数名:AdjListToMatrix(AdjList g1,AdjListMatrix &gm,int n)//参数:(传入)AdjList g1图的邻接表,(传入)int n顶点个数,(传出)AdjMatrix gm图的邻接矩阵//功能:把图的邻接表表示转换成图的邻接矩阵表示void AdjListToAdjMatrix(ALGraph gl,AdjMatrix &gm){int i,j,k;ArcNode *p;gm.n=gl.vexnum;for(k=0;k<gl.vexnum;k++)gm.vexs[k]=gl.vertices[k].data;for(i=0;i<MAX;i++)for(j=0;j<MAX;j++)gm.arcs[i][j]=0;for(i=0;i<gl.vexnum;i++){p=gl.vertices[i].link; //取第一个邻接顶点while(p!=NULL){ //取下一个邻接顶点gm.arcs[i][p->adjvex]=1;p=p->nextarc;}}}/***________________________________________________***///函数名:AdjMatrixToAdjListvoid AdjMatrixToAdjList(AdjMatrix gm,ALGraph &gl){int i,j,k,choice;ArcNode *p;k=0;gl.vexnum=gm.n;cout<<"请选择所建立的图形是无向图或是有向图:";cin>>choice;for(i=0;i<gm.n;i++){gl.vertices[i].data=gm.vexs[i];gl.vertices[i].link=NULL;}for(i=0;i<gm.n;i++)for(j=0;j<gm.n;j++)if(gm.arcs[i][j]==1){k++;p=new ArcNode;p->adjvex=j;p->info=gm.vexs[j];p->nextarc=gl.vertices[i].link;gl.vertices[i].link=p;}if(choice==1)k=k/2;gl.arcnum=k;}void CreateAdjList(ALGraph &G){int i,s,d,choice;ArcNode *p;cout<<"请选择所建立的图形是有向图或是无向图:";cin>>choice;cout<<"请输入节点数和边数:"<<endl;cin>>G.vexnum>>G.arcnum;for(i=0;i<G.vexnum;i++){cout<<"第"<<i<<"个节点的信息:";cin>>G.vertices[i].data;G.vertices[i].link=NULL;}if(choice==1){for(i=0;i<2*(G.vexnum);i++){cout<<"边----起点序号,终点序号:";cin>>s>>d;p=new ArcNode;p->adjvex=d;p->info=G.vertices[d].data;p->nextarc=G.vertices[s].link;G.vertices[s].link=p;}}else{for(i=0;i<G.vexnum;i++){cout<<"边----起点序号,终点序号:";cin>>s>>d;p=new ArcNode;p->adjvex=d;p->info=G.vertices[d].data;p->nextarc=G.vertices[s].link;G.vertices[s].link=p;}}}void CreateAdjMatrix(AdjMatrix &M){int i,j,k,choice;cout<<"请输入顶点个数:";cin>>M.n;cout<<"请输入如顶点信息:"<<endl;for(k=0;k<M.n;k++)cin>>M.vexs[k];cout<<"请选择所建立的图形是无向图或是有向图:";cin>>choice;cout<<"请输入边信息:"<<endl;for(i=0;i<M.n;i++)for(j=0;j<M.n;j++)M.arcs[i][j]=0;switch(choice){case 1:{for(k=0;k<M.n;k++){cin>>i>>j;M.arcs[i][j]=M.arcs[j][i]=1;}};break;case 2:{for(k=0;k<M.n;k++){cin>>i>>j;M.arcs[i][j]=1;}};break;}}void OutPutAdjList(ALGraph &G){int i;ArcNode *p;cout<<"图的邻接表如下:"<<endl;for(i=0;i<G.vexnum;i++){cout<<G.vertices[i].data;p=G.vertices[i].link;while(p!=NULL){cout<<"---->("<<p->adjvex<<" "<<p->info<<")";p=p->nextarc;}cout<<endl;}}void OutPutAdjMatrix(AdjMatrix gm){cout<<"图的邻接矩阵如下:"<<endl;for(int i=0;i<gm.n;i++){。

(完整)东南大学十套数据结构试题及答案,推荐文档

(完整)东南大学十套数据结构试题及答案,推荐文档

数据结构试卷(一)三、计算题(每题 6分,共24 分) 3.已知一个图的顶点集 V 和边集E 分别为:V={1,2,3,4,5,6,7};E={(1,2)3,(1,3)5,(1,4)8,(2,5)10,(2,3)6,(3,4)15, (3,5)12,(3,6)9,(4,6)4,(4,7)20,(5,6)18,(6,7)25}; 用克鲁斯卡尔算法得到最小生成树,试写出在最小生成树中依次得到的各条边。

4.画出向小根堆中加入数据4, 2, 5, 8, 3时,每加入一个数据后堆的变化。

四、 阅读算法(每题 7分,共14分)1. LinkList mynote(LinkList L){//L 是不带头结点的单链表的头指针if(L&&L-> next){q=L ; L=L — >next ; p=L ;S1: while(p — >n ext) p=p — >next ; S2: p — >next=q ; q — >next=NULL ;}return L ;}请回答下列问题: (1 )说明语句S1的功能; (2) 说明语句组S2的功能;(3) 设链表表示的线性表为(a 1,a 2,…,a n ),写出算法执行后的返回值所表示的线性 表。

2. void ABC(BTNode * BT){if BT {ABC (BT->left); ABC (BT->right); cout<<BT->data<<''; } }该算法的功能是:五、 算法填空(共 8分) 二叉搜索树的查找 一谗归算法:bool Fi nd(BTreeNode* BST,ElemType & item){if (BST==NULL) return false; // 查找失败 else { if (item==BST->data){ item=BST->data;// 查找成功 return_______________________ ;}else if(item<BST->data) return Find( ,item);1.在如下数组A 中链接存储了一个线性表,A [0].next ,试写出该线性表。

计算机学科专业基础综合数据结构-图(二)_真题-无答案

计算机学科专业基础综合数据结构-图(二)_真题-无答案

计算机学科专业基础综合数据结构-图(二)(总分100,考试时间90分钟)一、单项选择题(下列每题给出的4个选项中,只有一个最符合试题要求)1. 具有6个顶点的无向图至少应有______条边才能确保是一个连通图。

A.5 B.6 C.7 D.82. 设G是一个非连通无向图,有15条边,则该图至少有______个顶点。

A.5 B.6 C.7 D.83. 下列关于无向连通图特性的叙述中,正确的是______。

①所有顶点的度之和为偶数②边数大于顶点个数减1③至少有一个顶点的度为1A.只有① B.只有② C.①和② D.①和③4. 对于具有n(n>1)个顶点的强连通图,其有向边的条数至少是______。

A.n+1B.nC.n-1D.n-25. 下列有关图的说法中正确的是______。

A.在图结构中,顶点不可以没有任何前驱和后继 B.具有n个顶点的无向图最多有n(n-1)条边,最少有n-1条边 C.在无向图中,边的条数是结点度数之和 D.在有向图中,各顶点的入度之和等于各顶点的出度之和6. 对于一个具有n个顶点和e条边的无向图,若采用邻接矩阵表示,则该矩阵大小是______,矩阵中非零元素的个数是2e。

A.n B.(n-1)2 C.n-1 D.n27. 无向图的邻接矩阵是一个______。

A.对称矩阵 B.零矩阵 C.上三角矩阵 D.对角矩阵8. 从邻接矩阵可知,该图共有______个顶点。

如果是有向图,该图共有4条有向边;如果是无向图,则共有2条边。

A.9 B.3 C.6 D.1 E.5 F.4 G.2 H.09. 下列说法中正确的是______。

A.一个图的邻接矩阵表示是唯一的,邻接表表示也唯一 B.一个图的邻接矩阵表示是唯一的,邻接表表示不唯一 C.一个图的邻接矩阵表示不唯一,邻接表表示唯一 D.一个图的邻接矩阵表示不唯一,邻接表表示也不唯一10. 用邻接表存储图所用的空间大小______。

A.与图的顶点数和边数都有关 B.只与图的边数有关 C.只与图的顶点数有关 D.与边数的二次方有关11. 采用邻接表存储的图的深度优先搜索算法类似于二叉树的______,广度优先搜索算法类似于二叉树的层次序遍历。

中国石油大学期末考试复习题 070109数据结构-18

中国石油大学期末考试复习题 070109数据结构-18

《数据结构》综合复习资料一、填空题1、数据结构是()。

2、数据结构的四种基本形式为集合、()、()和()。

3、线性结构的基本特征是:若至少含有一个结点,则除起始结点没有直接前驱外,其他结点有且仅有一个直接();除终端结点没有直接()外,其它结点有且仅有一个直接()。

4、堆栈的特点是(),队列的特点是(),字符串中的数据元素为()。

5、字符串s1=“I am a student!”(单词与单词之间一个空格),s2=“student”,则字符串s1的长度为(),串s2是串s1的一个()串,串s2在s1中的位置为()。

6、KMP算法的特点:效率较();()回溯,对主串仅需要从头到尾扫描()遍,可以边读入边匹配。

7、广义表((a),((b),c),(((d))))的长度为(),表头为(),表尾为()。

8、ADT称为抽象数据类型,它是指()。

9、求下列程序的时间复杂度,并用大O表示方法表示()。

for( i=1 ; i<=n ; + + i)for( j=1 ; j<=i; + + j ){ ++x;a[i][j] = x;}10、以下运算实现在链栈上的退栈操作,请在_____处用适当句子予以填充。

int Pop(LstackTp *ls,DataType *x){ LstackTp *p;if(ls!=NULL){ p=ls;*x= ;ls= ;;return(1);}else return(0);}11、用堆栈求中缀表达式a+b*c/d+e*f的后缀表达式,求出的后缀表达式为()。

12、C语言中存储数组是采用以()为主序存储的,在C语言中定义二维数组float a[8][10],每个数据元素占4个字节,则数组共占用()字节的内存。

若第一个数据元素的存储地址为8000,则a[5][8]的存储地址为()。

13、含零个字符的串称为()串,用 表示。

其他串称为()串。

任何串中所含字符的个数称为该串的()。

数据结构导论自考题模拟6_真题-无答案

数据结构导论自考题模拟6_真题-无答案

数据结构导论自考题模拟6(总分100,考试时间90分钟)一、单项选择题在每小题列出的四个备选项中只有一个是符合题目要求的1. 能正确地实现预定的功能,满足具体问题的需要是指算法的______A. 正确性B. 易读性C. 健壮性D. 时空性2. 若某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则最节省运算时间的存储方式是______A. 单链表B. 仅有头指针的单循环链表C. 双链表D. 仅有尾指针的单循环链表3. 已知一个顺序存储的线性表,设每个结点需占m个存储单元,若第一个结点的地址为d,则第i个结点的地址为______A. d+(i-1)*mB. d+i*mC. d-i*mD. d+(i+1)*m4. 如果以链表作为栈的存储结构,则退栈操作时______A. 必须判别栈是否满B. 必须判别栈是否空C. 判别栈元素的类型D. 对栈不作任何判别5. 若用一个有6个单元的数组来实现循环队列,rear和front的初值分别为0和3。

则从队列中删除一个元素,再添加两个元素后,rear和front的值分别为______A. 1和5B. 2和4C. 4和2D. 5和16. 根据定义,树的叶子结点的度数______A. 必大于0B. 必等于0C. 必等于1D. 必等于27. 在一棵深度为H的完全二叉树中,所含结点的个数不少于______A.2H-1-1******8. 二叉树若采用二叉链表结构表示,则对于n个结点的二叉树一定有______A. 2n个指针域,其中n个指针为NULLB. 2n个指针域,其中n+1个指针为NULLC. 2n-1个指针域,其中n个指针为NULLD. 2n-1个指针域,其中n+1个指针为NULL9. 下列有关图的遍历的说法中不正确的是______A. 连通图的深度优先搜索是一个递归过程B. 图的广度优先搜索中邻接点的寻找具有“先进先出”的特征C. 非连通图不能用深度优先搜索法D. 图的遍历要求每一结点仅被访问一次10. 判断一个有向图是否存在回路,除了可以利用拓扑排序方法,还可以利用______A. 求关键路径的方法B. 求最短路径的Dijkstra方法C. 广度优先遍历方法D. 深度优先遍历方法11. 散列表中由于散列到同一个地址而引起的“堆积”现象,是由______A. 同义词之间发生冲突引起的B. 非同义词之间发生冲突引起的C. 同义词之间或非同义词之间发生冲突引起的D. 散列表“溢出”引起的12. 数据在计算机存储器内表示时,根据结点的关键字直接计算出该结点的存储地址,这种方法称为______A. 索引存储方法B. 顺序存储方法C. 链式存储方法D. 散列存储方法13. 下列说法中不正确的是______A. 无向图的极大连通子图称为连通分量B. 连通图的广度优先搜索中一般要采用队列来暂存刚访问过的顶点C. 连通图的深度优先搜索中一般要采用栈来暂存刚访问过的顶点D. 有向图的遍历不可采用广度优先搜索算法14. 一组记录的键值为(46,74,18,53,14,20,40,38,86,65),利用堆排序的方法建立的初始堆为______A. (14,18,38,46,65,40,20,53,86,74)B. (14,38,18,46,65,20,40,53,86,74)C. (14,18,20,38,40,46,53,65,74,86)D. (14,86,20,38,40,46,53,65,74,18)15. 对序列(22,86,19,49,12,30,65,35,18)进行一趟排序后得到的结果如下:(18,12,19,22,49,30,65,35,86),则可以认为使用的排序方法是______A. 选择排序B. 冒泡排序C. 快速排序D. 插入排序二、填空题请在每小题的空格中填上正确答案。

数据结构第六章图理解练习知识题及答案解析详细解析(精华版)

数据结构第六章图理解练习知识题及答案解析详细解析(精华版)

图1. 填空题⑴设无向图G中顶点数为n,则图G至少有()条边,至多有()条边;若G为有向图,则至少有()条边,至多有()条边。

【解答】0,n(n-1)/2,0,n(n-1)【分析】图的顶点集合是有穷非空的,而边集可以是空集;边数达到最多的图称为完全图,在完全图中,任意两个顶点之间都存在边。

⑵任何连通图的连通分量只有一个,即是()。

【解答】其自身⑶图的存储结构主要有两种,分别是()和()。

【解答】邻接矩阵,邻接表【分析】这是最常用的两种存储结构,此外,还有十字链表、邻接多重表、边集数组等。

⑷已知无向图G的顶点数为n,边数为e,其邻接表表示的空间复杂度为()。

【解答】O(n+e)【分析】在无向图的邻接表中,顶点表有n个结点,边表有2e个结点,共有n+2e个结点,其空间复杂度为O(n+2e)=O(n+e)。

⑸已知一个有向图的邻接矩阵表示,计算第j个顶点的入度的方法是()。

【解答】求第j列的所有元素之和⑹有向图G用邻接矩阵A[n][n]存储,其第i行的所有元素之和等于顶点i的()。

【解答】出度⑺图的深度优先遍历类似于树的()遍历,它所用到的数据结构是();图的广度优先遍历类似于树的()遍历,它所用到的数据结构是()。

【解答】前序,栈,层序,队列⑻对于含有n个顶点e条边的连通图,利用Prim算法求最小生成树的时间复杂度为(),利用Kruskal 算法求最小生成树的时间复杂度为()。

【解答】O(n2),O(elog2e)【分析】Prim算法采用邻接矩阵做存储结构,适合于求稠密图的最小生成树;Kruskal算法采用边集数组做存储结构,适合于求稀疏图的最小生成树。

⑼如果一个有向图不存在(),则该图的全部顶点可以排列成一个拓扑序列。

【解答】回路⑽在一个有向图中,若存在弧、、,则在其拓扑序列中,顶点vi, vj, vk的相对次序为()。

【解答】vi, vj, vk【分析】对由顶点vi, vj, vk组成的图进行拓扑排序。

数据结构单元8练习参考答案

数据结构单元8练习参考答案

单元练习8一.判断题〔以下各题,正确的请在前面的括号内打√;错误的打╳〕〔√〕〔1〕图可以没有边,但不能没有顶点。

〔ㄨ〕〔2〕在无向图中,〔V1,V2〕与〔V2,V1〕是两条不同的边。

〔ㄨ〕〔3〕邻接表只能用于有向图的存储。

〔√〕〔4〕一个图的邻接矩阵表示是唯一的。

〔ㄨ〕〔5〕用邻接矩阵法存储一个图时,所占用的存储空间大小与图中顶点个数无关,而只与图的边数有关。

〔ㄨ〕〔6〕有向图不能进展广度优先遍历。

〔√〕〔7〕假设一个无向图的以顶点V1为起点进展深度优先遍历,所得的遍历序列唯一,则可以唯一确定该图。

〔√〕〔8〕存储无向图的邻接矩阵是对称的,因此只要存储邻接矩阵的上三角〔或下三角〕局部就可以了。

〔ㄨ〕〔9〕用邻接表法存储图时,占用的存储空间大小只与图中的边数有关,而与结点的个数无关。

〔√〕〔10〕假设一个无向图中任一顶点出发,进展一次深度优先遍历,就可以访问图中所有的顶点,则该图一定是连通的。

二.填空题(1)图常用的存储方式有邻接矩阵和邻接表等。

(2)图的遍历有:深度优先搜和广度优先搜等方法。

(3)有n条边的无向图邻接矩阵中,1的个数是_2n____。

(4)有向图的边也称为_ 弧___。

(5)图的邻接矩阵表示法是表示__顶点____之间相邻关系的矩阵。

(6)有向图G用邻接矩阵存储,其第i行的所有元素之和等于顶点i的__出度____。

(7)n个顶点e条边的图假设采用邻接矩阵存储,则空间复杂度为: O〔n2〕。

(8)n个顶点e条边的图假设采用邻接表存储,则空间复杂度为: O〔n+e〕。

(9)设有一稀疏图G,则G采用_邻接表____存储比拟节省空间。

(10)设有一稠密图G,则G采用_邻接矩阵____存储比拟节省空间。

(11)图的逆邻接表存储构造只适用于__有向____图。

(12) n个顶点的完全无向图有 n(n-1)/2_ 条边。

(13)有向图的邻接表表示适于求顶点的出度。

(14)有向图的邻接矩阵表示中,第i列上非0元素的个数为顶点V i的入度。

数据结构试卷(十)

数据结构试卷(十)

数据结构试卷(十)一、选择题(24分)1.下列程序段的时间复杂度为()。

i=0,s=0;while (s<n) {s=s+i;i++;}(A) O(n1/2) (B) O(n1/3) (C) O(n) (D) O(n2)2.设某链表中最常用的操作是在链表的尾部插入或删除元素,则选用下列()存储方式最节省运算时间。

(A) 单向链表(B) 单向循环链表(C) 双向链表(D) 双向循环链表3.设指针q指向单链表中结点A,指针p指向单链表中结点A的后继结点B,指针s指向被插入的结点X,则在结点A和结点B插入结点X的操作序列为()。

(A) s->next=p->next;p->next=-s;(B) q->next=s; s->next=p;(C) p->next=s->next;s->next=p;(D) p->next=s;s->next=q;4.设输入序列为1、2、3、4、5、6,则通过栈的作用后可以得到的输出序列为()。

(A) 5,3,4,6,1,2 (B) 3,2,5,6,4,1(C) 3,1,2,5,4,6 (D) 1,5,4,6,2,35.设有一个10阶的下三角矩阵A(包括对角线),按照从上到下、从左到右的顺序存储到连续的55个存储单元中,每个数组元素占1个字节的存储空间,则A[5][4]地址与A[0][0]的地址之差为()。

(A) 10 (B) 19 (C) 28 (D) 556.设一棵m叉树中有N1个度数为1的结点,N2个度数为2的结点,……,Nm个度数为m的结点,则该树中共有()个叶子结点。

(A) ∑=-miiNi1)1((B) ∑=miiN1(C) ∑=miiN2(D) ∑=-+miiNi2)1(17. 二叉排序树中左子树上所有结点的值均()根结点的值。

(A) < (B) > (C) = (D) !=8. 设一组权值集合W=(15,3,14,2,6,9,16,17),要求根据这些权值集合构造一棵哈夫曼树,则这棵哈夫曼树的带权路径长度为()。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include<stdio.h>
#include<stdlib.h>
#define max 20
#define digit 1
#define zero 0
typedef struct{
int num;
char data;
}Vertex;
typedef struct{
int n; //顶点数
int e; //弧数
Vertex vexs[max];
int edges[max][max];
}MGraph;
typedef struct node{
int adjvex;
node *nextarc;
char info;
}ARCNODE; //邻接表的结点结构typedef struct{
char vexdata;
ARCNODE *firstarc;
}VEXNODE; //邻接表的表头结点typedef struct{
int vexnum,arcnum; //顶点数、弧数
VEXNODE ve[max];
}ALGraph; //邻接表类型
ALGraph *Creat_alg(){ //创建邻接表ALGraph *alg;
int i,n,e,b,a;
char ch;
ARCNODE *AR;
alg=(ALGraph
*)malloc(sizeof(ALGraph));
printf("输入顶点数:");
scanf("%d",&n);
printf("输入弧数:");
scanf("%d",&e);
alg->vexnum=n;
alg->arcnum=e;
printf("输入顶点信息:\n");
for(i=0;i<n;i++){
scanf("%s",&ch);
alg->ve[i].vexdata=ch;
alg->ve[i].firstarc=NULL;
}
printf("输入弧的信息(弧的两端点):\n");
for(i=0;i<e;i++){
scanf("%d%d",&a,&b);
AR=(ARCNODE
*)malloc(sizeof(ARCNODE));
AR->adjvex=b;
AR->info=alg->ve[b].vexdata;
AR->nextarc=alg->ve[a].firstarc;
alg->ve[a].firstarc=AR;
AR=(ARCNODE
*)malloc(sizeof(ARCNODE));
AR->adjvex=a;
AR->info=alg->ve[a].vexdata;
AR->nextarc=alg->ve[b].firstarc;
alg->ve[b].firstarc=AR;
}
return alg;
}
void ALGout(ALGraph *alg){ //邻接表输出
int i,n1;
ARCNODE *p;
VEXNODE *q;
n1=alg->vexnum;
for(i=0;i<n1;i++){
q=&alg->ve[i];
printf("%c",q->vexdata);
p=q->firstarc;
while(p!=NULL){
printf("─→");
printf("%c",p->info);
p=p->nextarc;
}
printf("\n");
}
}
MGraph *ALG_change_MG(ALGraph *alg){ //将邻接表转换为邻接矩阵
MGraph *mg;
int i,n1;
mg=(MGraph *)malloc(sizeof(MGraph));
mg->n=alg->vexnum;
mg->e=alg->arcnum;
n1=mg->n;
for(i=0;i<n1;i++){
mg->vexs[i].num=i;
mg->vexs[i].data=alg->ve[i].vexdata;
}
ARCNODE *p;
for(i=0;i<n1;i++){
p=alg->ve[i].firstarc;
while(p!=NULL){
mg->edges[i][p->adjvex]=1;
mg->edges[p->adjvex][i]=1;
p=p->nextarc;
}
}
return mg;
}
void MGout(MGraph *mg){ //输出邻接矩阵
int i,j,k;
k=mg->n;
for(i=0;i<k;i++){
for(j=0;j<k;j++){
if(mg->edges[i][j]==1)
printf("%-5d",digit);
else
printf("%-5d",zero);
}
printf("\n");
}
}
void main(){
MGraph *mg;
ALGraph *alg;
printf("建立无向图的邻接表:\n");
alg=Creat_alg();
printf("邻接表输出:\n");
ALGout(alg);
mg=ALG_change_MG(alg);
printf("邻接矩阵输出:\n");
MGout(mg);
}。

相关文档
最新文档