5.2.3 建立图的存储结构 :邻接表 和 邻接矩阵

//5.2.3 建立图的存储结构 :邻接表 和 邻接矩阵
const int n0 = 100;
const int infinity = 32767;

struct arcnode
{//边节点
 int vertext;   //边上另外一个节点的存储位置
 int weight;    //边的权值
 arcnode* next; //指向下一条边
};

struct node
{//存储节点的结构
 int degree;      //每个节点的度 或 入度
 arcnode* first;  //每个几点连接的第一条边
};

node adjlist[n0+1] ; //存储节点的列表
int adjmatrix[n0+1][n0+1]; //邻接矩阵
int n;   //定点数

//设置连接矩阵 和 邻接链表
void setgraph()
{
 int i; //开始点
 int j; //终点
 int k; //表示 有向/无向
 int w; //权值
 arcnode *p;
 cout<<"1 无向图,2 有向图";
 cin>>k;

 cout<<"顶点数:";
 cin>>n;

 //邻接矩阵初始化
 for(i=1;i<=n;i++)
 {
  for(j=1;j<=n;j++)
  {
   adjmatrix[i][j] = infinity; //infinity 表示不可达
  }
  adjmatrix[i][i] = 0;  //
 }//说明这个是一个带有权值的网络

 //邻接表初始化
 for(i=1;i<=n;i++)
 {
  adjlist[i].degree = 0;
  adjlist[i].first = NULL;
 }

 cout<<"请输入边的集合";
 cout<<"始点,终点,权值";
 cin>>i>>j>>w; //

 while((i>=1)&&(i<=n)&&(j>=1)&&(j<=n))
 {//当i,j的范围都是正确的
  //存入邻接矩阵
  adjmatrix[i][j] = w;
  if(k == 1)
  {//如果是无向图
   adjmatrix[j][i] = w;
  }

  //存入邻接表
  p = adjlist[i].first ;//得到 指向 邻接表第1个边节点的指针
  while((p)&&(p->vertext != j))
  {//如果这条边不为空,并且这条边不是已经存储的话,继续向下寻找
   p = p->next;
  }

  if(p == NULL)
  {//如果p为空,说明这条边没有被存储过,如果p不为空,说明这条边已经被存储过
   //插入一个边的节点,并且是逆向插入
   p = new arcnode;
   p->vertext = j;
   p->weight = w;
   p->next = adjlist[i]->first;
   adjlist[i]->first = p;
   ++(adjlist[i].degree);

  }

  if(k == 1)
  {//如果是无向图,也要把j,i,w录入到邻接表
   p = adjlist[j].first ;//得到 指向 邻接表第1个边节点的指针
   while((p)&&(p->vertext != i))
   {//如果这条边不为空,并且这条边不是已经存储的话,继续向下寻找
    p = p->next;
   }
   
   if(p == NULL)
   {//如果p为空,说明这条边没有被存储过,如果p不为空,说明这条边已经被存储过
    //插入一个边的节点,并且是逆向插入
    p = new arcnode;
    p->vertext = i;
    p->weight = w;
    p->next = adjlist[j]->first;
    adjlist[j]->first = p;
    ++(adjlist[j].degree);
    
   } 
  }
  cin>>i>>j>>w;
 }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值