图的三种存储方式

 一.图的简介

    图是计算机中比较重要的一种数据结构,在很多方面应用比较广泛比如:计算机网络中的路由算法,地图上搜索最短路径,搜索引擎等方面。当然图也是比较难理解的一种数据结构,数据结构之所以难是因为它将逻辑结构存储在计算机物理内存中比较难。

    二.图的存储

    数据结构其实就是存储+算法。算法是依赖于存储结构的(这里可能有异议,有的人觉得算法独立于存储)。下面探讨3种常用的图存储方式。

    1.邻接矩阵(二维数组存储)

    图的存储方式

    上面两种存储方式差不多,只不过矩阵A4存储的不能直接到达的距离为无穷大而已。这种方式存储比较简单,但是有着明显的缺点:当边很少,顶点很多的时候,数组中存储的有效值很少,这就造成内存的大大浪费。

    代码:

    void creat(vexList GV, adjmatrix GA, int n,int e)

   {

    int i,j,k,w;

    cout << "输入"<<n<<"个顶点的值:"<<endl;

    //初始化顶点数组

    for(int i = 0; i < n; i++)     

     { cin>>GV[i];}

    //初始化邻接矩阵  

     for(int i = 0; i < n; i++) 

        for(int j = 0; j < n; j++)

    {if(i==j) GA[i][j] = 0;

         else  GA[i][j] = maxValue;

        }

    //建立邻接数组

      cout << "输入"<<e<<"条边:"<<endl;

      for(int k = 0; k < e; k++)

        {cin >> i >> j >>w;

         GA[i][j] =GA[j][i] = w;

        }

    }

 

   2.邻接表存储

    邻接表存储其实就是链表存储,将一个点连接的点,全部链接到顶点上,这样的话就大大节省了内存。看下面的图:

     图的存储方式

     图的存储方式

    创建图的代码:(无向图)

    假设:NodeTable[]数组存储了每个链表的首节点,就是上面的邻接表的最前面的0,1,2,3,4,5

    假设:构造函数已经构造好空的NodeTable[]

    insertEdge(int v1,int v2,int weight)

    {

      if(v1>= 0 && v1 < maxNum && v2>= 0 && v2 < maxNum)

         {

           Edge *temp1,*temp2;

           Edge *p = new Edge;

           Edge *q = new Edge;

           p->dest = v1;

           p->cost = wight;

           q->dest = v2;

           q->cost = wight;

  

           temp1 = NodeTable[v1];

           temp2 = NodeTable[v2];

           while(temp1!=NULL)

                 temp1=temp1->next;

           while(temp2!=NULL)

                 temp2=temp2->next;

           temp1->next = q;

           temp2->next = p;

         }

    }
 

   3.边集数组

    编辑数组是利用一维数组存储图中所有边的一种方式。每个元素用来存储一条边。比较节省内存。对于无向图而言任意一条边只需要存储一次即可:

   
图的存储方式

  图的存储方式

    数据结构为:

    struct Edge{

     int fromvex;

     int endvex;

     int weight;

    };

  

     for(int k = 1; k <= 变数; k++)

     {

      cin>>i>>j>>w;

      GE[k].fromvex  = i;

      GE[k].endvex   = j;

      GE[k].weight   = w;

     }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值