图的邻接矩阵与邻接表
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图的邻接矩阵与邻接表相关的知识,希望对你有一定的参考价值。
一、如何创建邻接表和邻接矩阵?
如图,根据上图建立一个无向图的邻接矩阵和邻接表~
输入的数据,第一行为两个整数n,e(0<n<=1000,0<e<=5000),表示有n个点和e条边,接下来的e行,每行包含2个整数,表示每条边所连接的两个点。
然后输出图。(无硬性要求)
输入数据:
5 8
1 0
1 2
1 3
2 3
2 4
3 4
3 0
4 0
输出数据(示例):
0->1->3->4->NULL
1->0->2->3->NULL
2->1->3->4->NULL
3->0->1->2->4->NULL
4->0->2->3->NULL
/*-------------------------------------------------------------------------------------------------------------------------------------------------------*/
二、如何实现邻接表和邻接矩阵的转换?
假若题目给定一个邻接矩阵,要怎么把它转换为邻接表呢?
或者题目给定一个邻接表,又要怎么把它转换为邻接矩阵呢?
/*------------------------------------------------------------------------------------------------------------------------------------------------------*/
以下是对上述两个问题的解题代码:
1 #include <stdio.h> 2 #include <stdlib.h> 3 typedef struct Node 4 { 5 int next; 6 struct Node *nextNode; 7 }Node; 8 Node *a[1001],*b[1001];//邻接表 9 int n,e;//n个点,e条边 10 int x[1001],y[1001],m[1001][1001],l[1001][1001];//m,l为邻接矩阵 11 void cM();//创建邻接矩阵 12 void cA();//创建邻接表 13 void cL_by_A();//根据邻接表创建邻接矩阵 14 void cB_by_M();//根据邻接矩阵创建邻接表 15 void putM(int m[1001][1001]);//输出矩阵 16 void putL(Node *a[]);//输出链表 17 int main() 18 { 19 int i,j; 20 scanf("%d%d",&n,&e); 21 for(i=0;i<n;i++) 22 { 23 a[i]=(Node *)malloc(sizeof(Node)); 24 b[i]=(Node *)malloc(sizeof(Node)); 25 } 26 for(i=0;i<e;i++) scanf("%d%d",&x[i],&y[i]); 27 cM(); 28 printf("print M:\\n"); 29 putM(m); 30 cA(); 31 printf("print A:\\n"); 32 putL(a); 33 cL_by_A(); 34 printf("print L:\\n"); 35 putM(l); 36 cB_by_M(); 37 printf("print B:\\n"); 38 putL(b); 39 return 0; 40 } 41 void cM()//创建邻接矩阵 42 { 43 int i,j; 44 for(i=0;i<e;i++) m[x[i]][y[i]]=m[y[i]][x[i]]=1; 45 } 46 void cA()//创建邻接表 47 { 48 int i; 49 Node *p,*q; 50 for(i=0;i<n;i++) a[i]->nextNode=NULL; 51 for(i=0;i<e;i++) 52 { 53 p=(Node *)malloc(sizeof(Node)); 54 q=(Node *)malloc(sizeof(Node)); 55 p->next=x[i];q->next=y[i]; 56 p->nextNode=a[y[i]]->nextNode; 57 q->nextNode=a[x[i]]->nextNode; 58 a[y[i]]->nextNode=p; 59 a[x[i]]->nextNode=q; 60 } 61 } 62 void cL_by_A()//根据邻接表创建邻接矩阵 63 { 64 Node *p; 65 for(int i=0;i<n;i++) 66 { 67 p=a[i]->nextNode; 68 while(p!=NULL) 69 { 70 l[i][p->next]=1; 71 p=p->nextNode; 72 } 73 } 74 } 75 void cB_by_M()//根据邻接矩阵创建邻接表 76 { 77 Node *p; 78 int i,j; 79 for(i=0;i<n;i++) b[i]->nextNode=NULL; 80 for(i=0;i<n;i++) 81 for(j=0;j<n;j++) 82 if(m[i][j]) 83 { 84 p=(Node *)malloc(sizeof(Node)); 85 p->next=j;p->nextNode=b[i]->nextNode; 86 b[i]->nextNode=p; 87 } 88 } 89 void putM(int m[1001][1001]) 90 { 91 for(int i=0;i<n;i++) 92 { 93 printf("%d->",i); 94 for(int j=0;j<n;j++) 95 if(m[i][j]) printf("%d->",j); 96 printf("NULL\\n"); 97 } 98 } 99 void putL(Node *a[]) 100 { 101 Node *p; 102 for(int i=0;i<n;i++) 103 { 104 printf("%d",i); 105 p=a[i]->nextNode; 106 while(p!=NULL) 107 { 108 printf("->%d",p->next); 109 p=p->nextNode; 110 } 111 printf("->NULL\\n"); 112 } 113 }
以上是关于图的邻接矩阵与邻接表的主要内容,如果未能解决你的问题,请参考以下文章