经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
邻接表
来源:cnblogs  作者:kailicard  时间:2019/1/28 9:45:27  对本文有异议


用邻接表存储有向图,并输出各顶点的出度和入度
题目来源图论算法
例1.3
首先我们需要定义一些结构体,其用法在注释中使用

  1. # define maxn 100
  2. struct ArcNode{
  3. int adjvex;
  4. //有向边的另一个邻接点的序号
  5. ArcNode *nextarc;
  6. //指向下一个边节点的指针};
  7. struct VNode{
  8. int data;
  9. ArcNode *head1; //出边表的表头指针
  10. ArcNode *head2;// 入边表的表头指针};
  11. struct lgraph{ VNode vertex[maxn];
  12. int vexnum, arcnum; };lgraph lg;


接下来我们需要定义邻接表创建函数

  1. void createlg()
  2. {
  3. int i=0; // for
  4. ArcNode *pi;
  5. int v1,v2; //顶点
  6. for(i=0;i<lg.vexnum;i++) //初始化表头指针
  7. lg.vertex[i].head1=lg.vertex[i].head2=NULL;
  8. for(i=0;i<lg.arcnum;i++)
  9. {
  10. scanf("%d%d",&v1,&v2);
  11. v1--,v2--;
  12. pi=new ArcNode;
  13. pi->adjvex=v2;
  14. pi->nextarc=lg.vertex[v1].head1; //插入链表
  15. lg.vertex[v1].head1=pi;
  16. pi=new ArcNode;
  17. pi->adjvex=v1;
  18. pi->nextarc=lg.vertex[v2].head2; //插入链表
  19. lg.vertex[v2].head2=pi;
  20. }
  21. }


我们定义这个创建函数后,要有释放内存函数
  1. void deletelg()
  2. {
  3. int i; // for
  4. ArcNode *pi;
  5. for(i=0;i<lg.vexnum;i++)
  6. {
  7. pi=lg.vertex[i].head1;
  8. //释放第i个顶点的出边表各节点所占的存储空间
  9. while(pi!=NULL)
  10. {
  11. lg.vertex[i].head1=pi->nextarc;
  12. delete pi;
  13. pi=lg.vertex[i].head1;
  14. }
  15. pi=lg.vertex[i].head2;
  16. //释放第i个顶点的入边表各节点所占的存储空间
  17. while(pi!=NULL)
  18. {
  19. lg.vertex[i].head2=pi->nextarc;
  20. delete pi;
  21. pi=lg.vertex[i].head2;
  22. }
  23. }
  24. }


完整代码如下:

  1. #include<cstdio>
  2. #include<cstdlib>
  3. # define maxn 100
  4.  
  5. struct ArcNode{
  6. int adjvex; //有向边的另一个邻接点的序号
  7. ArcNode *nextarc; //指向下一个边节点的指针
  8. };
  9. struct VNode
  10. {
  11. int data;
  12. ArcNode *head1; //出边表的表头指针
  13. ArcNode *head2; // 入边表的表头指针
  14. };
  15. struct lgraph
  16. {
  17. VNode vertex[maxn];
  18. int vexnum, arcnum;
  19. };
  20. lgraph lg;
  21. void createlg()
  22. {
  23. int i=0; // for
  24. ArcNode *pi;
  25. int v1,v2; //顶点
  26. for(i=0;i<lg.vexnum;i++) //初始化表头指针
  27. lg.vertex[i].head1=lg.vertex[i].head2=NULL;
  28. for(i=0;i<lg.arcnum;i++)
  29. {
  30. scanf("%d%d",&v1,&v2);
  31. v1--,v2--;
  32. pi=new ArcNode;
  33. pi->adjvex=v2;
  34. pi->nextarc=lg.vertex[v1].head1; //插入链表
  35. lg.vertex[v1].head1=pi;
  36. pi=new ArcNode;
  37. pi->adjvex=v1;
  38. pi->nextarc=lg.vertex[v2].head2; //插入链表
  39. lg.vertex[v2].head2=pi;
  40. }
  41. }
  42. void deletelg()
  43. {
  44. int i; // for
  45. ArcNode *pi;
  46. for(i=0;i<lg.vexnum;i++)
  47. {
  48. pi=lg.vertex[i].head1;
  49. //释放第i个顶点的出边表各节点所占的存储空间
  50. while(pi!=NULL)
  51. {
  52. lg.vertex[i].head1=pi->nextarc;
  53. delete pi;
  54. pi=lg.vertex[i].head1;
  55. }
  56. pi=lg.vertex[i].head2;
  57. //释放第i个顶点的入边表各节点所占的存储空间
  58. while(pi!=NULL)
  59. {
  60. lg.vertex[i].head2=pi->nextarc;
  61. delete pi;
  62. pi=lg.vertex[i].head2;
  63. }
  64. }
  65. }
  66. int main()
  67. {
  68. int i;
  69. int id,od;
  70. ArcNode *pi;
  71. while(1)
  72. {
  73. lg.vexnum=lg.arcnum=0;
  74. scanf("%d%d",&lg.vexnum,&lg.arcnum);
  75. if(lg.vexnum==0) break;
  76. createlg();
  77. for(i=0;i<lg.vexnum;i++)
  78. {
  79. od=0;
  80. pi=lg.vertex[i].head1;
  81. while(pi!=NULL)
  82. {
  83. od++;
  84. pi=pi->nextarc;
  85. }if(i==0) printf("%d",od);
  86. else printf("%d",od);
  87. }printf("\n");
  88. for(i=0;i<lg.vexnum;i++)
  89. {
  90. id=0;
  91. pi=lg.vertex[i].head2;
  92. while(pi!=NULL)
  93. {
  94. id++;
  95. pi=pi->nextarc;
  96. }if(i==0) printf("%d",id);
  97. else printf("%d",id);
  98. }printf("\n");
  99. deletelg();
  100. }
  101. return 0;
  102. }

原文链接:http://www.cnblogs.com/kk328/p/10324761.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号