【大话数据结构C语言】40 图的存储结构(十字链表)

举报
CodeAllen 发表于 2021/10/30 01:15:48 2021/10/30
【摘要】 我的公众号是【CodeAllen】,程序员技术交流①群:736386324,转载请注明出处 临接表虽然很优秀,但是也有一些缺点 1.比如对有向图,有时候需要再建立一个逆临接表     所以思考一个问题: 有没有可能把邻接表和逆邻接表结合起来呢? 是可以的,方法...

我的公众号是【CodeAllen】,程序员技术交流①群:736386324,转载请注明出处

临接表虽然很优秀,但是也有一些缺点
1.比如对有向图,有时候需要再建立一个逆临接表
 
 
所以思考一个问题: 有没有可能把邻接表和逆邻接表结合起来呢?
是可以的,方法就是十字链表
 
为此重新定义顶点表结点结构:

重新定义边表结点结构:

十字链表的好处就是把邻接表和逆邻接表整合到了一起,这样就又容易找到以Vi为尾的弧,又容易找到以Vi为头的弧,因而容易求得顶点的出度和入度

 

十字链表的构建过程转化为 C 语言代码为:


  
  1. #define MAX_VERTEX_NUM 20
  2. #define InfoType int//图中弧包含信息的数据类型
  3. #define VertexType int
  4. typedef struct ArcBox{
  5. int tailvex,headvex;//弧尾、弧头对应顶点在数组中的位置下标
  6. struct ArcBox *hlik,*tlink;//分别指向弧头相同和弧尾相同的下一个弧
  7. InfoType *info;//存储弧相关信息的指针
  8. }ArcBox;
  9. typedef struct VexNode{
  10. VertexType data;//顶点的数据域
  11. ArcBox *firstin,*firstout;//指向以该顶点为弧头和弧尾的链表首个结点
  12. }VexNode;
  13. typedef struct {
  14. VexNode xlist[MAX_VERTEX_NUM];//存储顶点的一维数组
  15. int vexnum,arcnum;//记录图的顶点数和弧数
  16. }OLGraph;
  17. int LocateVex(OLGraph * G,VertexType v){
  18. int i=0;
  19. //遍历一维数组,找到变量v
  20. for (; i<G->vexnum; i++) {
  21. if (G->xlist[i].data==v) {
  22. break;
  23. }
  24. }
  25. //如果找不到,输出提示语句,返回 -1
  26. if (i>G->vexnum) {
  27. printf("no such vertex.\n");
  28. return -1;
  29. }
  30. return i;
  31. }
  32. //构建十字链表函数
  33. void CreateDG(OLGraph *G){
  34. //输入有向图的顶点数和弧数
  35. scanf("%d,%d",&(G->vexnum),&(G->arcnum));
  36. //使用一维数组存储顶点数据,初始化指针域为NULL
  37. for (int i=0; i<G->vexnum; i++) {
  38. scanf("%d",&(G->xlist[i].data));
  39. G->xlist[i].firstin=NULL;
  40. G->xlist[i].firstout=NULL;
  41. }
  42. //构建十字链表
  43. for (int k=0;k<G->arcnum; k++) {
  44. int v1,v2;
  45. scanf("%d,%d",&v1,&v2);
  46. //确定v1、v2在数组中的位置下标
  47. int i=LocateVex(G, v1);
  48. int j=LocateVex(G, v2);
  49. //建立弧的结点
  50. ArcBox * p=(ArcBox*)malloc(sizeof(ArcBox));
  51. p->tailvex=i;
  52. p->headvex=j;
  53. //采用头插法插入新的p结点
  54. p->hlik=G->xlist[j].firstin;
  55. p->tlink=G->xlist[i].firstout;
  56. G->xlist[j].firstin=G->xlist[i].firstout=p;
  57. }
  58. }

 

 

 

文章来源: allen5g.blog.csdn.net,作者:CodeAllen的博客,版权归原作者所有,如需转载,请联系作者。

原文链接:allen5g.blog.csdn.net/article/details/116310879

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。