图的邻接矩阵和邻接表表示法
来源:互联网 发布:傅园慧网络直播回看 编辑:程序博客网 时间:2024/05/17 02:50
链表是一种线性存储结构,是一对一对应关系。而树是一种层次存储结构,是一对多的对应关系。而图则是一种关系存储结构,是多对多对应关系。树和图类似于数据库中的层次模型和关系模型。图的存储结构主要有两种,分别为邻接矩阵和邻接表法,其中邻接表较难,但本质相同,都是记录结点与其邻接结点,只是方法不同而已。下面分别讨论邻接表和邻接矩阵的思想。邻接表的思想是:定义三个结点,分别为表结点,头结点,邻接表结点,表结点存放与头结点相邻的结点序号,边的权值,以及下一个表结点。头结点中存放结点的真实值(char 或 int),和该结点的第一个邻接点。邻接表中存放的是头结点数组,结点数和边数。通过动态申请空间的方法给每个头结点创建邻接结点链表,这样就构造除了邻接表。而邻接矩阵则是通过采用一个邻接矩阵来记录邻接结点,当不相连时值为无穷大(自行定义的一个极大的数据)。在这里,我们规定:所讨论的图中任意两个结点之间最多有一条边,且无向图中顶点到其自身没有边(有向图可允许顶点到顶点有边),否则下面的算法会有相应的问题,(邻接矩阵就不可用了,邻接表就会有冗余数据了),下面是代码:
//图的存储结构//邻接表#include <stdio.h>#include <stdlib.h>#define Max 100 //顶点个数最多为100个typedef char type;typedef struct Arcnode{int index;int value;struct Arcnode *next;}Arcnode,*parc;typedef struct Node{type data; Arcnode *first;}Node;typedef struct Grap{Node nodetex[Max];int n; //顶点数int m; //边数}Grap,*pgrap;int Located(pgrap g,char ch){for(int i=0;i<g->n;i++)if(ch==g->nodetex[i].data)return i;}void Creat_grap(pgrap g){printf("输入图的结点数和边数:\n");scanf("%d%d",&g->n,&g->m);getchar();int i,index1,index2,value;char ch1,ch2;printf("输入各顶点:\n");for(i=0;i<g->n;i++){g->nodetex[i].data=getchar();g->nodetex[i].first=NULL;getchar();}printf("输入各边及权值:\n");parc q;for(i=0;i<g->m;i++){scanf("%c,%c,%d",&ch1,&ch2,&value);getchar();index1=Located(g,ch1);index2=Located(g,ch2);q=(parc)malloc(sizeof(Arcnode));q->index=index2;q->value=value;q->next=g->nodetex[index1].first;g->nodetex[index1].first=q;//无向图(默认为任意两个顶点之间之多有一条边且自身到自身无边)/*q=(parc)malloc(sizeof(Arcnode));q->index=index1;q->value=value;q->next=g->nodetex[index2].first;g->nodetex[index2].first=q;*/}}void Show_grap(pgrap g){printf("图中各顶点的邻接顶点为:\n");for(int i=0;i<g->n;i++){printf("%c:",g->nodetex[i].data);parc q=g->nodetex[i].first;while(q){putchar(g->nodetex[q->index].data);q=q->next;}printf("\n");}}void Delete_grap(pgrap g){parc p,q;for(int i=0;i<g->n;i++){p=g->nodetex[i].first;while(p){q=p->next;free(p);p=q;}}}int main(){Grap g;pgrap p=&g;Creat_grap(p);Show_grap(p);Delete_grap(p);return 0;}
测试数据://无向图
输入图的结点数和边数:
5 7
输入各顶点:
A
B
C
D
E
输入各边及权值:
A,B,20
A,C,10
B,D,50
A,D,40
B,E,60
C,D,30
D,E,70
图中各顶点的邻接顶点为:
A:DCB
B:EDA
C:DA
D:ECAB
E:DB
Terminated with return code 0
Press any key to continue ...
输入图的结点数和边数://有向图
4 6
输入各顶点:
A
B
C
D
输入各边及权值:
A,B,10
B,A,10
A,A,20
A,C,30
C,D,40
D,B,50
图中各顶点的邻接顶点为:
A:CAB
B:A
C:D
D:B
下面是邻接矩阵代码:
//图的邻接矩阵表示法#include <stdio.h>#include <stdlib.h>#define Max 100#define Inf 0x1111typedef char type;typedef struct Grap{type data[Max];int value[Max][Max];int n,m;}Grap,*pgrap;int Located(pgrap g,char ch){for(int i=0;i<g->n;i++)if(g->data[i]==ch)return i;}void Creat_grap(pgrap g){printf("输入图的顶点数和边数:\n");scanf("%d%d",&g->n,&g->m);//printf("ksgfdkj\n");getchar();printf("输入图中的顶点:\n");int i,j;for(i=0;i<g->n;i++){g->data[i]=getchar();getchar();}for(i=0;i<g->n;i++)for(j=0;j<g->n;j++)g->value[i][j]=Inf;printf("请输入图中的边:\n");int index1,index2,value;char ch1,ch2;while(g->m--){scanf("%c,%c,%d",&ch1,&ch2,&value); getchar();index1=Located(g,ch1);index2=Located(g,ch2);g->value[index1][index2]=value;//无向图//g->value[index2][index1]=value;}}void Show_grap(pgrap g){printf("邻接矩阵表示法个顶点的邻接顶点:\n");int i,j;for(i=0;i<g->n;i++){printf("%c:",g->data[i]);for(j=0;j<g->n;j++)if(g->value[i][j]!=Inf)putchar(g->data[j]);printf("\n");}}int main(){Grap g;pgrap p=&g;Creat_grap(p);Show_grap(p);return 0;}
下面是测试数据://无向图
输入图的顶点数和边数:
5 7
输入图中的顶点:
A
B
C
D
E
请输入图中的边:
A,B,20
A,C,10
B,D,50
A,D,40
B,E,60
C,D,30
D,E,70
邻接矩阵表示法个顶点的邻接顶点:
A:BCD
B:ADE
C:AD
D:ABCE
E:BD
Terminated with return code 0
Press any key to continue ...
输入图的顶点数和边数: //有向图
4 6
输入图中的顶点:
A
B
C
D
请输入图中的边:
A,B,10
B,A,10
A,A,20
A,C,30
C,D,40
D,B,50
邻接矩阵表示法个顶点的邻接顶点:
A:ABC
B:A
C:D
D:B
Terminated with return code 0
Press any key to continue ...
- 图的邻接矩阵和邻接表表示法
- 邻接矩阵和邻接表表示
- 什么是图和用邻接矩阵、邻接表表示一个图
- 图的邻接矩阵和邻接表表示,及相互之间的转换
- 邻接矩阵,邻接表表示图,深度优先遍历
- 图的邻接表表示法
- 图的邻接表表示法
- 数据结构 图的邻接表表示转换成邻接矩阵表示的算法
- 图的邻接表表示
- 图的邻接表表示
- 图的邻接表表示
- 图的邻接表表示
- 图的邻接表表示
- 图的邻接表表示
- 图的邻接表表示
- 图的邻接表表示
- 图的表现和实现2(邻接矩阵表表示法)
- 邻接表表示图
- cocos2d-x场景切换特效
- 图书馆防盗系统原理
- 银行系统 引入函数版 加强版
- C++ 求后缀表达式的值
- 黑马程序员_交通灯管理系统
- 图的邻接矩阵和邻接表表示法
- uva 10594 - Data Flow(费用流)
- 在ubuntu下的快速安装mysql和 Python MySQLdb
- peekmessage与GetMessage和VC之SendMessage与PostMessage的区别
- Struts实现单文件上传、修改、删除(以图片为例)
- Oracle客戶端远程导入、导出
- 计算机书籍推荐
- 关于一个页面里面有两个按钮的解决。
- 黑马程序员_银行业务调度系统