无向图的几种基本操作

这篇博客旨在介绍图的基本操作,包括使用邻接矩阵和邻接表两种存储结构实现图的创建、输出、深度优先搜索(DFS)和广度优先搜索(BFS)。此外,还涉及判断朋友关系及寻找路径的方法,并要求读者通过编写头文件和主程序来实现这些功能。实验内容还包括增加额外功能,如添加或删除朋友关系,找到朋友最多的人,以及寻找最短路径等。
摘要由CSDN通过智能技术生成

一. 实验目的和要求
1、掌握图的存储结构:邻接矩阵、邻接表。
2、掌握图的深度优先与广度优先两个搜素算法。
3、学会对图的存储结构进行基本操作。
4、加强综合程序的分析、设计能力。
二. 实验内容
1、现有14个人(分别用字母A、B、… N表示),他们相互之间的朋友关系如图所示(有线相连表示是朋友关系),请分别用邻接矩阵与邻接表表示该关系图,并完成以下功能。
*这里写图片描述*

① 以邻接矩阵表示,在此结构上完成:
 创建此图;
 输出此图的邻接矩阵;
 输出从A出发的深度优先搜索序列;
 输出从A出发的广度优先搜索序列;
 输入两个人p1、p2,判断此两人是否为朋友关系,若不是,给出一种从p1能找到p2的路径;(如输入p1=‘A’、p2=‘N’,则A与N不是直接朋友关系,但可以(不唯一)通过A-B-F-K-N方式联系到N。)
② 以邻接表表示,在此结构上完成:
 创建此图;
 输出此图的邻接表;
 输出从A出发的深度优先搜索序列;
 输出从A出发的广度优先搜索序列;
 输入两个人p1、p2,判断此两人是否为朋友关系,若不是,给出一种从p1能找到p2的路径;(如输入p1=‘A’、p2=‘N’,则A与N不是直接朋友关系,但可以(不唯一)通过A-B-F-K-N方式联系到N。)
③ 建立头文件AdjMatrix.h和AdjLink.h,分别包含邻接矩阵结构和邻接表结构的操作实现函数,建立主程序文件test6.cpp,在主函数中通过调用来实现上述功能。
④ 自行增加合适的功能,可作为额外的实验成绩进行加分(例如考虑添加或删除一对朋友关系;找出朋友最多的那个人;上面找到A到N的联系路径,若要求找到一条最短的路线怎么找等等)。**


// 主函数
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX_VERTEX_NUM  20   //最大顶点个数 
#define TRUE    1
#define FALSE   0
#define STACK_INIT_SIZE         100
#define STACKINCREMENT          10  
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
typedef int Status;
typedef int QElemtype;                                                          //队列 
typedef struct QNode{
    QElemtype data;
    struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
    QueuePtr front;
    QueuePtr rear;
    QueuePtr p; 
}LinkQueue;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
typedef int SElemtype;
typedef struct{                                                             //栈 
    SElemtype   *base;  
    SElemtype   *top;    
    int         stacksize;
}SqStack;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
typedef char VertexType;
typedef int  VRType;                                                            //图 (邻接矩阵声明) 
typedef struct{
    VertexType Vexs[MAX_VERTEX_NUM];                 //顶点向量 
    VRType edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM];           //邻接矩阵 
    int vexnum,arcnum;                              //图的当前顶点数和弧数 
}MGraph;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
typedef char Vertextype;
typedef struct ArcNode{
    int                 adjvex;             //该弧所指向的顶点的位置
    struct  ArcNode     *nextarc;           //指向下一条弧的指针 
//  Infotype            *info;              //该弧相关信息的指针 
}ArcNode;
                                                                                //图 (邻接表声明)
typedef struct VNode{
    Vertextype  data;                       //顶点信息 
    ArcNode     *firstarc;                  //指向第一条依附该顶点的弧的指针 
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct{
    AdjList vertices;
    int     vexnum,arcnum;              //图的当前顶点数,边数                            
}ALGraph;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
bool visited[MAX_VERTEX_NUM];                                               //全局变量布尔数组:访问 
#include"AdjMatrix.h"
#include"AdjLink.h"
int main()
{
    printf("~~~~~~~~~~~~邻接矩阵~~~~~~~~~~~~\n"); 
    MGraph G;
    CreateGraph(G);
    SqStack S,S1;
    InitStack(S);       
    FILE *fp,*fp1;                      //用文件输入更省时省力; 
    fp=fopen("INPUT2.txt","r");
    CreateUDG(G,fp);                    
    printf("邻接矩阵为:\n"); 
    PRINT(G);                           
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值