🎃个人专栏:
🐬 算法设计与分析:算法设计与分析_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);
}