用c语言实现数据结构——图的基本操作(超详细)

本文详细介绍了如何使用C语言实现图的基本操作,包括创建图、邻接矩阵的构建,以及深度优先搜索(DFS)和广度优先搜索(BFS)。此外,还涵盖了克鲁斯卡尔算法和普里姆算法在生成最小生成树上的应用。
摘要由CSDN通过智能技术生成

功能:创建图,邻接矩阵的建立,图的深度优先搜索和广度优先搜素,克鲁斯卡尔算法和普里姆算法生成最小生成树等

#include<stdio.h>
#include<stdlib.h>
#include <string.h>


#define INF 65535
#define MAXSIZE 100
int index=1;
int k = 1;
typedef struct  Graph
{
        char node[MAXSIZE];  //顶点集合
        int nodeSize;  //顶点数
        int edgSize;   //边数
        int disMatrix[MAXSIZE][MAXSIZE];  //距离矩
}graph;

//edge
 typedef struct Edge
 {
         char start;  //边的起点
         char end;  //边的终点
         int weight;  //边的权重
 }edge;
 

//  * 创建图(用已提供的矩阵)
void create_example_graph(graph* pG){
    char node[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
    int disMatrix[][7] = {
             /*A*//*B*//*C*//*D*//*E*//*F*//*G*/
      /*A*/ {   0,  12, INF, INF, INF,  16,  14},
      /*B*/ {  12,   0,  10, INF, INF,   7, INF},
      /*C*/ { INF,  10,   0,   3,   5,   6, INF},
      /*D*/ { INF, INF,   3,   0,   4, INF, INF},
      /*E*/ { INF, INF,   5,   4,   0,   2,   8},
      /*F*/ {  16,   7,   6, INF,   2,   0,   9},
      /*G*/ {  14, INF, INF, INF,   8,   9,   0}};
    int vlen = 7;
    int i, j;

   
    
    // 输入"顶点数"和"边数"
 
    // 初始化"顶点数"
    pG->nodeSize = vlen;
    // 初始化"顶点"
    for (i = 0; i < pG->nodeSize; i++)
        pG->node[i] = node[i];
 
    // 初始化"权重"
    for (i = 0; i < pG->nodeSize; i++)
        for (j = 0; j < pG->nodeSize; j++)
            pG->disMatrix[i][j] = disMatrix[i][j];
 
    // 统计边的数目
	pG->edgSize = 0;
    for (i = 0; i < pG->nodeSize; i++)
        for (j = 0; j < pG->nodeSize; j++)
            if (i!=j && pG->disMatrix[i][j]!=INF)
                pG->edgSize++;
				
    pG->edgSize /= 2;

}


//寻找temp节点的第一个邻节点,失败就返回-1
int first_node(graph * G, int temp){
        int i;
        if(temp <= 0 || temp > G->nodeSize-1){
                return -1;
        }

        for(i = 0;i<G->nodeSize; i++ ){
                if(G->disMatrix[temp][i] != INF && G->disMatrix[temp][i] != 0){
                        return i;
                }
        }
        return -1;
}

//寻找temp节点相对与w邻接节点的第一个邻节点,失败就返回-1
int next_node(graph * G, int temp, int w){
        int i;
        if(temp < 0 || temp > G->nodeSize-1 || w < 0 || w > G->nodeSize-1){
                return -1;
        }

        for(i = w+1;i<G->nodeSize; i++ ){
                if(G->disMatrix[temp][
  • 5
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值