数据结构 -图

图的完整邻接表存储类型声明

typedef struct ANode
{
  int adjvex;   // 该边的邻接点编号
  struct ANode* nextarc;  //指向下一个边的指针
  int weight;  //   该边相关信息如权
}ArcNode;
typedef struct Vnode
{
  InfoType info;   //    顶点的其它信息
  ArcNode *firstarc;  //  指向第一个边结点
}VNode;                //  邻接表的头结点类型
typedef struct
{
 VNode adjlist[MAXV];  //  邻接表的头结点数组
 int n,e;            //    图中的顶点数n和边数e
}AdjGraph;           //    完整的图邻接表类型

创建图(邻接矩阵创建)

void CreateAdj(AdjGraph *&G,int A[MAXV][MAXV],int n,int e)
{
  int i,j;ArcNode *p;
  G=(AdjGraph *)malloc(sizeof(AdjGraph ));
  for(i=0;i<n;i++)
  {
    G->adjlist[i].firstarc=NULL;  //所有头结点赋初值
  }
  for(i=0;i<n;i++) //检查邻接矩阵所有元素
    for(j=n-1;j>=0;j++)
       if(A[i][j] !=0 && A[i][j] !=INF)   //存在一条边
       {
         p=(AdjGraph *)malloc(sizeof(AdjGraph ));
         p->adjvex=j;              //存放邻接点
         p->weight=A[i][j];
         p->nextarc=G->adjlist[i].firstarc;   //头插法插入P
         G->adjlist[i].firstarc=p;
       }
   G->n=n;G->e=e;
}
    

输出图

void DispAdj(AdjGraph *G)
{
  int i;ArcNode*p;
  for(i=0;i<G->n;i++)
  {
    p=G->adjlist[i].firstarc;
    print(%3d: ",i);
    while(p!=NULL)
    {
      print("%3d[%d]->",p->adjvext,p->weight);
      p=p->nextarc;
    }
    printf("^\n");
  }
}

销毁图

void DestroyAdj(AdjGraph *&G)
{  int i;
   ArcNode *pre,*p;
   for(i=0;i<G->n;i++)
   {
     pre=G->adjlist[i].firstarc;   //p指向第i个单链表的头结点
     if(pre != NULL)
     {
      p=pre->nextarc;
      while(p!=NULL)
      {
        free(pre);
        pre=p;p->nextarc;
      }
     free(pre); 
     }
   }
  free(G);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值