图的邻接矩阵与邻接表

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 }
View Code















以上是关于图的邻接矩阵与邻接表的主要内容,如果未能解决你的问题,请参考以下文章

邻接矩阵和邻接表存储的图的基本操作及完整代码

数据结构与算法学习笔记 图

数据结构与算法学习笔记 图

数据结构学习笔记——图的存储结构(邻接矩阵和邻接表)

数据结构学习笔记——图的存储结构(邻接矩阵和邻接表)

数据结构学习笔记——图的存储结构(邻接矩阵和邻接表)