数据结构-利用邻接矩阵创建无向网-纯c语言

这篇文章描述了如何使用C语言构建无向网的数据结构,包括使用一维数组存储顶点表,二维数组表示邻接矩阵,并通过LocateVex函数定位顶点在数组中的位置。程序还包括初始化邻接矩阵为最大整数值以及输入顶点和边的信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>

//思路
//1.无向网,由一个顶点表和邻接矩阵构成
//2.一维数组存储顶点表,二维数组建立邻接矩阵(用于表示各顶点的关系)
//问题3.原来顶点表是用的数字,而不是字符,不过字符也行
//////4. 
#define MVNum 100
#define MaxInt 0 //用这个表示无穷大 
//#define Infinity (~(1<<(sizeof(int)*8-1)))//这个才是真正的无穷 
/*不会使用 
表示1左移4*8-1位 然后取反,
int(int为四字节时,int在有的电脑上不是四字节)的最大值,
当两点之间不邻接时,将两点之间的权值设为int的最大值,
在输出时,用“∞”表示。
*/
typedef struct 
{
    int vexs[MVNum];//一维数组弄顶点表 
    int arcs[MVNum][MVNum];//二维数组建立邻接矩阵 
    int dd,bs;//顶点和边数 
 } AMGraph; 
 
int  LocateVex(AMGraph G,int u)
{

    for(int i=0;i<G.dd;i++)
    {
        if(G.vexs[i]==u)
        {
            //printf("ok\n");
            return i;
        }
    }
    printf("错误,因输入的数字并不在顶点表中\n "); 
    return 0;//返回-1的话就是错误了,说明输入的字符并不在顶点表中 
}
void dayin(AMGraph G)
 {
     int i=0,j=0;
     printf("打印邻接矩阵\n");
     for(i=0;i<G.dd;i++) 
    {
          for(j=0;j<G.dd;j++) 
          {
                  printf("%d  ",G.arcs[i][j]);
                  
           } 
           printf("\n");
    
     }
 }
 
 void  CreateUDN(AMGraph &G)
 {
     int i=0,j=0;
     printf("1.请输入总的顶点数和总边数\n");
     scanf("%d%d",&G.dd,&G.bs);//1.输入总顶点数和总边数
     
     printf("2.初始化邻接矩阵,都填入无穷\n") ; 
     for(i=0;i<G.dd;i++) //这个条件为啥都用顶点数来判断,因为矩阵是行和列相同的 
      {
          for(j=0;j<G.dd;j++)//2..初始化邻接矩阵,都填入无穷; 
          {
                  G.arcs[i][j]=MaxInt; 
                  //下面这步不知道要干啥 
                  //if(i==j)
                 // G.vexs[i][j]=0; //将顶点与自身的权值初始化为0
                  
           } 
      }
      
    dayin(G); 
    //3.将顶点信息按照输入顺序存入到顶点数组中
    
     printf("3.将顶点信息按照输入顺序存入到顶点数组中\n");
    for(i=0;i<G.dd;i++)
     {
         printf("请输入第%d个顶点的值:", i + 1);//这个提示真的很好用 
         scanf("%d",&G.vexs[i]);//2.依次存入想要的顶点表的顶点信息 ,在这里忘记加i了 
         //为啥在这里输入两个循环就结束了??
          
     }
     
     printf("\n"); 
      
      
    
     //4.构造邻接矩阵
     int w=0;//这里为何w为char 
     int k=0;
    i=0,j=0; 
     int v1=0,v2=0;//主要是这个一开始应该弄好初值; 用来放顶点的数值 
    printf("4.填入权值\n");
     
    //scanf("%d",&v1);//为啥我的scanf不能执行
    //printf("111\n"); 
    for(k=0;k<G.bs;++k)
     {
         
         printf("请输入这三个信息(顶点 顶点 权值):\n");
         scanf("%d%d%d",&v1,&v2,&w);
         i=LocateVex(G,v1);//递归回去找到该顶点对应的下标 
         j=LocateVex(G,v2);
         //printf("i=%d j=%d  \n",i,j);
         G.arcs[i][j]=w;//把权值放入
        //G.arcs[j][i]=G.arcs[i][j];//因为这是无向图,所以他的矩阵是对称的 
         G.arcs[j][i]=w;//把权值放入
      } 
      
      
    
    
     
     
 }
 
 int main()
 {
     printf("阿祥玩无向网\n");
    AMGraph G; 
    CreateUDN(G);//创建邻接 
    //不理解为啥 i=-1; 
     dayin(G); 
     return 0;
 }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值