目录

邻接矩阵

邻接矩阵的优缺点​

代码实现​

邻接表

知识点概述​

两种数据结构:

无向图

有向图

 邻接表的优缺点

代码:​

 链式前向星

无向图举例

代码实现(不唯一)



邻接矩阵

邻接矩阵的优缺点
图_第1张图片

代码实现
图_第2张图片

#include 
using namespace std;

const int MaxVNum=100;//最大顶点数

typedef char VType;
typedef int EType;

struct AMGraaph{
	VType V[MaxVNum];  //顶点信息
	EType E[MaxVNum][MaxVNum]; //邻接矩阵 
	int vexnum,edgenum;//顶点数,边数 
}G; 

void init(AMGraaph &G){
	cout<<"请输入顶点数:"<>G.vexnum;
	cout<<"请输入边数:"<>G.edgenum;
	cout<<"请输入顶点信息:"<>G.V[i];
	}
	//将邻接表置为全0(或无穷大)
	for(int i=0;i>n>>m;		
		int i,j; 
		i=local(G,n);
		j=local(G,m);
		
		if(i!=-1&&j!=-1){
			G.E[i][j]=G.E[j][i]=1;
		}else{
			cout<<"无此边,请重新输入:"<

 

邻接表

知识点概述
图_第3张图片


两种数据结构:

图_第4张图片

无向图

n个顶点,2e个节点(2*e)

图_第5张图片

图_第6张图片

有向图

n个顶点,e个节点
图_第7张图片

图_第8张图片

 


 邻接表的优缺点

图_第9张图片

图_第10张图片


代码实现:
图_第11张图片

#include 
using namespace std;

const int MaxVNum=100;//定点数最大值 
typedef char VType;//定义顶点的数据类型 

//定义邻接点类型 
struct VPointNode{
	int v;//记录顶点下标(定点下标)
	struct VPointNode *next;//指向下一个邻接点 
};

//定义顶点类型
struct VexNode{ 
	VType data; // VexType为顶点的数据类型,根据需要定义
	struct VPointNode *first; //指向第一个邻接点
}vexNode;

//定义邻接表类型
struct ALGraagh{
    VexNode  Vex[MaxVNum];//定点信息数组 
    int vexnum,edgenum; //顶点数,边数
}G;


void insertEdge(ALGraagh &G,int i,int j){
	struct VPointNode *p;
	p=new VPointNode;
	p->v=j;
	p->next=G.Vex[i].first;
	G.Vex[i].first=p;
} 

int local(ALGraagh &G,VType x){
	for(int i=0;i>G.vexnum>>G.edgenum;
	cout<<"请输入顶点信息"<>G.Vex[i].data; 
		G.Vex[i].first=NULL;
	} 
	cout<<"请输入每条边的两个定点(u,k)"<>u>>v;
		int i,j;
		i=local(G,u);
		j=local(G,v);
		
		if(i!=-1&&j!=-1){
			insertEdge(G,i,j);
			//建立关系 
		}else{
           cout << "输入顶点信息错!请重新输入!"<v<<"]  ";
           p=p->next;
       }
       cout<

 

 链式前向星

图_第12张图片

无向图举例

  图_第13张图片

 图_第14张图片

代码实现(不唯一)
 

图_第15张图片 

//有向图(边集数组+邻接表) 
#include 
using namespace std;

const int MaxV=1000+5;

//头结点数组 
int head[24]; 
//记录边数 
int cnt;
//边际数组 
int x,y;
int w;
//个数 
int vnum=0;
int edgenum=0;
 
//to:连向那个节点
//w:权重
//newx:下一个边 
struct Node{
	int to;
	int w,next; 
}node[MaxV*MaxV];


//增加一条边 
void add(int x,int y,int w){
	int count=cnt; 
	node[count].to=y;
	node[count].w=w;
	node[count].next=head[x];
		
	head[x]=cnt++;//记录node数组下标 
}

//打印输出 
void prin(){
	cout<<"链式前向星:"<>vnum>>edgenum;
	
	//初始化头结点 
	memset(head,-1,sizeof(head));
	
	
	cout<<"请输入边集数组(x到y并带上权重,请用小写字母表示顶点)"<>x>>y>>w;
		add(x,y,w);
		add(y,x,w);
	}
	 prin();
	return 0;
}

 

你可能感兴趣的:(数据结构与算法)