数据结构-利用邻接矩阵创建无向网-纯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或非零;没有连接则为0。 以下是一个简单的C语言示例,用于创建并初始化一个无向图的邻接矩阵: ```c #include <stdio.h> // 定义节点数量(假设为5) #define NUM_NODES 5 // 邻接矩阵,用int类型表示0(无连接)和1(有连接),实际项目可能需要更大类型的数组 typedef int adjacency_matrix[NUM_NODES][NUM_NODES]; // 初始化邻接矩阵 void init_adjacency_matrix(adjacency_matrix graph) { for (int i = 0; i < NUM_NODES; i++) { for (int j = 0; j < NUM_NODES; j++) { if (i != j) { // 只初始化下三角和对角线(因为无向图的邻接矩阵是对称的) graph[i][j] = 0; } } } } // 添加边到矩阵(这里简化处理,只添加单条边) void add_edge(adjacency_matrix graph, int src, int dest) { graph[src][dest] = 1; // 如果源节点和目标节点不同,则添加边 graph[dest][src] = 1; // 对应另一个方向也添加边(无向图) } // 主函数演示如何使用 int main() { adjacency_matrix graph; init_adjacency_matrix(graph); int num_edges = 3; // 假设要添加3条边 for (int i = 0; i < num_edges; i++) { int edge[] = {i, i + 1}; // 示例,从0到1,1到2等 add_edge(graph, edge[0], edge[1]); } // 打印邻接矩阵,仅显示下三角(其余部分由对称性确定) printf("Adjacency Matrix:\n"); for (int i = 0; i < NUM_NODES; i++) { for (int j = i+1; j < NUM_NODES; j++) { printf("%d ", graph[i][j]); // 假设有边则输出1,否则输出0 } printf("\n"); } return 0; } ``` 这个例子中,我们首先定义了一个邻接矩阵,然后初始化所有内部元素为0(表示默认没有边)。`add_edge`函数用于添加指定的边到矩阵中。注意,这只是一个基础示例,实际应用中可能需要根据需求进行调整,比如使用更复杂的边结构、动态分配内存等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值