课设(三)邻接矩阵表示有向图

1.简介

实现初始化、加边、加顶点、删边、删顶点、遍历等操作。

2.代码

a.头文件及宏定义

#include<cstdio>
#include<iostream>
#include<cstring> 
#include<queue>
using namespace std;

#define MAX 100

b.子程序

(1)数据结构定义及相关操作

//定义邻接矩阵
typedef struct
{
	int vexnum;//顶点数
	int edgnum;//边数 
	char vexs[MAX];//顶点集合
	int matrix[MAX][MAX];//邻接矩阵
}Graph,*PGraph;

//初始化邻接矩阵
void gpinit(PGraph&p)
{
	int i,j;
	p = new Graph[sizeof(Graph)];
	p->vexnum=0;
	p->edgnum=0;
	for(i=0;i<MAX;i++)
		for(j=0;j<MAX;j++)
			p->matrix[i][j]=0;	
}

(2)输出邻接矩阵

void showgp(PGraph p)
{
	int i=0,j=0;
	
	//输出横坐标
	cout<<"   ";
	while(p->vexnum>i)
	{
		cout<<p->vexs[i++]<<"  ";
	}
	i=0;
	cout<<'\n';
	//输出邻接矩阵
	while(p->vexnum>i)
	{
		cout<<p->vexs[i]<<"  ";
		while((p->vexnum>j))
		{
			cout<<p->matrix[i][j++]<<"  ";
		}
		j=0;
		i++;
		cout<<'\n';
	}
	
}

(3)加边(点)、删边(点)

int getposition(PGraph p,char a)
{
	int k;
	for(k=0;k<p->vexnum;k++)
		if(a==p->vexs[k])
			return k;
	return p->vexnum;
}


void addedg(PGraph p)
{
	char a[2];
	int i,j;//存储点的序号
	cout<<"要连接哪两个点?\n"<<flush;
	cin>>a[0]>>a[1];
	i=getposition(p,a[0]);
	j=getposition(p,a[1]);
	if(i>=p->vexnum || j>=p->vexnum)
		cout<<"不存在该点 请先添加该点"<<endl;
	else if(p->matrix[i][j]==1)
		cout<<"这两条边已经连在一起了"<<endl;
	else	
	{
		p->matrix[i][j]=1;
		p->edgnum++;
	}
		showgp(p);
}

void addvex(PGraph&p)
{
	char a;
	if(p->vexnum>=MAX)
		cout<<"数组已满 请删除元素"<<flush;
	else
	{
		cout<<"请输入要添加的定点名称:"<<endl;
		cin>>a;
		if(getposition(p,a)>=p->vexnum)
		{
			p->vexnum++;
			p->vexs[p->vexnum-1]=a;
		}	
		else
			cout<<"已存在该点 禁止重复添加"<<endl;
		
	}
	showgp(p);
}

void delvex(PGraph p)
{
	char a;
	int i,j,k;
	if(p->vexnum==0)
		cout<<"数组已空 无需删除元素"<<flush;
	else
	{
		cout<<"请输入要删除的顶点:"<<endl;
		cin>>a;
		i=j=getposition(p,a);
		if(j < p->vexnum)
		{
			//删除顶点
			for(;j<p->vexnum-1;j++)
				p->vexs[j]=p->vexs[j+1];
			cout<<i<<endl;	
			for(j=0;j<=i;j++)	
				for(k=i;k<p->vexnum-1;k++)
				{
					cout<<j<<' '<<k<<' '<<p->matrix[j][k]<<endl;	
					p->matrix[j][k]=p->matrix[j][k+1];
					p->matrix[k][j]=p->matrix[k+1][j];
				}
			for(j=i;j<p->vexnum-1;j++)	
				for(k=i;k<p->vexnum-1;k++)
				{
					p->matrix[j][k]=p->matrix[j+1][k+1];
				}
			for(i=0;i<p->vexnum;i++)
			{
				p->matrix[i][p->vexnum-1]=0;
				p->matrix[p->vexnum-1][i]=0;
			}
			p->vexnum--;
		}	
		else
			cout<<"该点不存在"<<endl;
		
	}
	showgp(p);
}

void deledg(PGraph p)

{
	char a[2];
	int i,j;//存储点的序号
	cout<<"要删除哪条边?\n"<<flush;
	cin>>a[0]>>a[1];
	i=getposition(p,a[0]);
	j=getposition(p,a[1]);
	if(i>=p->vexnum || j>=p->vexnum)
		cout<<"不存在该点 请先添加该点"<<endl;
	else if(p->matrix[i][j]==0)
		cout<<"这两条边没有连在一起"<<endl;
	else	
	{
		p->matrix[i][j]=0;
		p->edgnum--;
	}
		showgp(p);
}

(4)遍历

void DFS(int v,PGraph&p) //深度优先遍历 
{
	memset(flag,0,sizeof(flag));//将标志数组置0
	flag[v]=1;
	cout<<p->vexs[v]<<" ";
	for(int i=0;i<p->vexnum;i++){
		if(p->matrix[v][i]&&!flag[i]) //该点和其他点之间有连接且未曾被遍历 
			DFS(i,p);//递归遍历
	}
	
}

void BFS(int v,PGraph&p)//广度优先遍历
{
	memset(flag,0,sizeof(flag));//将标志数组置0
	flag[v]=1;
	cout<<p->vexs[v]<<" ";
	queue<int> q;//创建整型队列
	q.push(v);
	while(!q.empty()){//对队列进行判空操作 检验遍历是否完成
		int w=q.front();//记录当前指向的顶点
		q.pop();//顶点出队
		for(int i=0;i<p->vexnum;i++)
		{
			if(p->matrix[w][i]&&!flag[i])//该点和其他点之间有连接且未曾被遍历 
			{
				q.push(i);//将这些点入队
				cout<<p->vexs[i]<<" ";
				flag[i]=1;
			}
		}
	}
 } 

(5)程序运行引导

void tips(PGraph p)
{
	int a;
	cout<<"输入您要对有向图进行的操作:1 加边;2 加顶点;3 删边;4 删顶点;5 DFS;6 BFS;输入其他任意值退出程序\n";
	cin>>a;
	switch(a)
	{
		case 1:addedg(p);break;
		case 2:addvex(p);break;
		case 3:deledg(p);break;
		case 4:delvex(p);break;
		case 5:DFS(0,p);break;	
		case 6:BFS(0,p);break;
		default:State=1;break;
	}	
}

c.主程序

void main()
{
	PGraph p;
	gpinit(p);
	showgp(p);
	while(1)
	{
		tips(p);
		if(State==1)
			break;
	}

}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值