【数据结构】— —邻接矩阵和邻接表存储图结构

本文介绍了在C语言环境下使用邻接矩阵和邻接表两种方式存储和操作图结构,包括创建、表示以及遍历的方法,并涉及了深度优先遍历和广度优先遍历。同时提到了其他编程语言如Python的应用以及HTML5在网页设计中的应用。

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

🎃个人专栏:

🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客

🐳Java基础:Java基础_IT闫的博客-CSDN博客

🐋c语言:c语言_IT闫的博客-CSDN博客

🐟MySQL:数据结构_IT闫的博客-CSDN博客

🐠数据结构:​​​​​​数据结构_IT闫的博客-CSDN博客

💎C++:C++_IT闫的博客-CSDN博客

🥽C51单片机:C51单片机(STC89C516)_IT闫的博客-CSDN博客

💻基于HTML5的网页设计及应用:基于HTML5的网页设计及应用_IT闫的博客-CSDN博客​​​​​​

🥏python:python_IT闫的博客-CSDN博客

欢迎收看,希望对大家有用!

目录

🎯目的:

🎯内容:

🎯环境:

🎯步骤:

内容1——邻接矩阵

 邻接矩阵存储图代码:

内容2——邻接表

邻接表存储图代码: 


  🎃Hello,大家好,今天我们要做的是 邻接矩阵和邻接表存储图结构。

🎯目的:

1、掌握图结构的静态及操作特点;

2、掌握图结构的静态存储和常见操作在C语言环境中的实现方法;

3、掌握图结构的遍历算法在C语言环境中的实现方法。

4、理解求最小生成树、最短路径、关键路径的算法实现。

🎯内容:

1、会使用邻接矩阵的方式存储图片,并实现相应操作。

2、会使用邻接表的方式存储图片,并实现相应操作。

🎯环境:

TC或VC++。

🎯步骤:

要求:

内容1——邻接矩阵

(1)使用邻接矩阵的方式存储上边无向图;

(2)以矩阵的形式输出无向图;

(3)在邻接矩阵的基础上实现深度优先遍历和广度优先遍历。

 邻接矩阵存储图代码:

#include "iostream"
using namespace std;
#define MaxInt 0
#define MVNum 100
#define OK 1
typedef char VerTexType;
typedef int ArcType;
typedef int Status;
typedef struct{
	VerTexType vexs[MVNum];//顶点 
	ArcType arcs[MVNum][MVNum];//邻接矩阵 
	int vexnum,arcnum;//当前的点数和边数 
}AMGraph;
Status CreateUDN(AMGraph &G){
	cout<<"请输入总顶点数和总边数:"<<endl; 
	cin>>G.vexnum>>G.arcnum;//输入总顶点数和总边数
	cout<<"请输入各点的信息:"<<endl;
	for(int i=0;i<G.vexnum;i++)//输入各点信息 
		cin>>G.vexs[i];
	for(int i=0;i<G.vexnum;i++) //初始化邻接矩阵
		for(int j=0;j<G.vexnum;j++)
			G.arcs[i][j]=MaxInt;
	for(int k=0;k<G.arcnum;k++){
		int i,j,v1,v2,w;
		cout<<"请输入两个点的信息及权值:"<<endl;
		cin>>v1>>v2>>w;
		i=v1-1;j=v2-1;
		G.arcs[i][j]=w;
		G.arcs[j][i]=G.arcs[i][j];
	} 
	return OK;
}
int main(){
	AMGraph g;
	CreateUDN(g);
	cout<<"无向图邻接矩阵如下:"<<endl;
	for(int i=0;i<g.vexnum;i++){
		for(int j=0;j<g.vexnum;j++)
			printf("%5d",g.arcs[i][j]);
		cout<<endl;
 }	
}

内容2——邻接表

(1)使用邻接表的方式存储图;

(2)以邻接表的形式输出该图;

(3)(选做)实现深度优先遍历和广度优先遍历。

邻接表存储图代码: 

#include "iostream"
using namespace std;
#define MVNum 100
#define OK 1
typedef int OtherInfo;
typedef int Status;
typedef int VerTexType;
typedef struct ArcNode{//边结点 
	int adjvex;//该边所指向的顶点位置
	struct ArcNode *nextarc;//指向下一条边的指针
	OtherInfo info;//和边相关的信息 
}ArcNode;
typedef struct VNode//顶点信息 
{
	VerTexType data; 
	ArcNode *firstarc;//指向第一条依附于带顶点的边和指针 
}VNode,AdjList[MVNum];
typedef struct{
	AdjList vertices;
	int vexnum,arcnum;//图的当前顶点数和边数 
}ALGraph;
Status CreateUDG(ALGraph &G){
	cout<<"输入顶点数和总边数"<<endl;
	cin>>G.vexnum>>G.arcnum;
	cout<<"输入各点"<<endl;
	for(int i=0;i<G.vexnum;i++){//输入各点,构建表头结点
		cin>>G.vertices[i].data;
 		G.vertices[i].firstarc=NULL;
	}  
	for(int k=0;k<G.arcnum;k++)//输入各边,构造边表 
	{	int v1,v2,i,j;
		cout<<"请输入一条边依附的两个顶点:"<<endl; 
		cin>>v1>>v2;
		i=v1-1;
		j=v2-1;
		ArcNode *p1;
		p1=new ArcNode;
		p1->adjvex=j;//邻接点的序号为j;
		p1->nextarc=G.vertices[i].firstarc;
		G.vertices[i].firstarc=p1;
		ArcNode* p2=new ArcNode;
		p2->adjvex=i;
		p2->nextarc=G.vertices[j].firstarc;
		G.vertices[j].firstarc=p2;
	}
	return OK;
}
	Status PrintUDG(ALGraph G) {    //邻接表输出图
    for(int i = 0; i < G.vexnum; i++){     //遍历图中每一个点
        cout << i+1 << "(" << G.vertices[i].data << "):";    //输出当前点的标号和值
        ArcNode *p = G.vertices[i].firstarc;    //指向当前点的第一条边
        while(p) {      //输出与当前点相连的所有点的标号和值
            cout << p->adjvex + 1 << "(" << G.vertices[p->adjvex].data << ")" << "->";
            p = p->nextarc;
        }
        cout << "NULL" << endl;
    }
    return OK;
}
int main(){
	ALGraph g;
	CreateUDG(g);
	PrintUDG(g);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Y小夜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值