主题:初学者求教,C++数据结构的
还要添加深度和广度遍历进去,但是试了几次水平有限,不知道怎么弄,希望各位大大帮忙一下
#include<iostream>
using namespace std;
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define Max 100//最大顶点数设为100
typedef char VertexType;/*假设顶点的数据类型为字符*/
typedef int EdgeType;
/*存储结构*/
typedef struct{
int n,e;/*当前顶点数和边数*/
VertexType v[Max];/*顶点数组*/
EdgeType a[Max][Max],visited[Max];/*邻接矩阵*/
}MGraph;
/*基本操作*/
MGraph* print(){/*输入*/
MGraph G;
char s,t;
int i,j,k;
cout<<"请输入顶点数和和边数:"<<endl;
cin>>G.n>>G.e;
if(G.n==0)
cout<<"该图是空!";
cout<<"请输入顶点信息:"<<endl;
for(i=0;i<G.n;i++)
cin>>G.v;
for(i=0;i<G.n;i++)
for(j=0;j<G.n;j++)
G.a[j]=0;//初始化邻接矩阵
cout<<"请输入每个边对应的两个顶点(输入格式:s,t):"<<endl;
for(k=0;k<G.e;k++){
cin>>s>>t;
for(i=0;i<G.n;i++)
if(G.v==s)
break;
for(j=0;j<G.n;j++)
if(G.v[j]==t)
break;
G.a[j]=1;
G.a[j]=1; //无向图邻接矩阵存储建立
}
return &G;
}
MGraph* Output(MGraph G){/*输出*/
cout<<"顶点:";
for(int i=0;i<G.n;i++)
cout<<G.v<<',';
cout<<endl;
if(G.n)
cout<<"\b";
cout<<"边:";
for(i=0;i<G.n;i++)
for(int j=0;j<G.n;j++)
if(G.a[j]==1)
cout<<"("<<G.v<<","<<G.v[j]<<")\t";
if(G.e)
cout<<"\b";
cout<<endl;
cout<<"邻接矩阵:"<<endl;
cout<<"{"<<endl;
for(i=0;i<G.n;i++){
for(int j=0;j<G.n;j++)
cout<<G.a[j]<<' ';
cout<<endl;
}
cout<<"}"<<endl;
return &G;
}
MGraph* InsertVex(MGraph &G,VertexType v){/*增添顶点*/
cout<<"增加的顶点信息"<<endl;
cin>>v;
if(G.n==Max){
cout<<"\n顶点数组已满!";
exit(1);
}
for(int i=0;i<G.n;i++)
if(G.v==v)
cout<<"顶点已经存在"<<endl;/*顶点已存在*/
G.v[G.n++]=v;
for(int j=0;j<G.n;j++){//新增的顶点进行对其连接的边初始化
G.a[j][G.n-1]=0;
G.a[G.n-1][j]=0;
}
return &G;
}
MGraph* InsertArc(MGraph &G,VertexType v,VertexType w){/*增添边*/
cout<<"增添边的两个顶点的信息:"<<endl;
cin>>v>>w;
for(int i=0;i<G.n;i++)if(G.v==v)break;
for(int j=0;j<G.n;j++)if(G.v[j]==w)break;
if(i>=G.n||j>=G.n||i==j){
cout<<"\n无效边!";
exit(1);
}
G.a[j]=1;
G.a[j]=1;
G.e++;
return &G;
}
MGraph* DeleteVex(MGraph &G,VertexType v){/*删除顶点*/
cout<<"请输入删除顶点的信息:"<<endl;
cin>>v;
for(int i=0;i<G.n;i++)if(G.v==v)break;
if(i>=G.n){
cout<<"\n无此顶点!";
exit(1);
}
for(int j=0;j<G.n;j++)G.a[j]=G.a[j]=0;
for(j=i+1;j<G.n;j++){
G.v[j-1]=G.v[j];
for(int k=0;k<G.n;k++)
G.a[j-1][k]=G.a[j][k],G.a[k][j-1]=G.a[k][j];
}
G.n--;
return &G;
}
MGraph* DeleteArc(MGraph &G,VertexType v,VertexType w){/*删除边*/
cout<<"请输入要删除边的两个顶点的信息:"<<endl;
cin>>v>>w;
for(int i=0;i<G.n;i++)if(G.v==v)break;
for(int j=0;j<G.n;j++)if(G.v[j]==w)break;
if(i>=G.n||j>=G.n||i==j||!G.a[j]){
cout<<"\n无效边!";
exit(1);
}
G.a[j]=0;
G.a[j]=0;
G.e--;
return &G;
}
MGraph* OD(MGraph &G){//出度的检索
int i,j,k;
for(i=0;i<G.n;i++){
k=0;
for(j=0;j<G.n;j++){
if(G.a[j]==1)
k=+1;
}
cout<<G.v<<"点的出度是:"<<k<<endl;
}
return &G;
}
MGraph* ID(MGraph &G){//入度的检索
int i,j,k;
for(i=0;i<G.n;i++){
k=0;
for(j=0;j<G.n;j++){
if(G.a[j]==1)
k=+1;
}
cout<<G.v<<"点的入度是"<<k<<endl;
}
return &G;
}
/*主函数*/
void main(){
int v=0,w=0,i;
MGraph G;
G=*print();
Output(G);
InsertVex(G,v);
Output(G);
InsertArc(G,v,w);
Output(G);
ID(G);
OD(G);
DeleteVex(G,v);
Output(G);
DeleteArc(G,v,w);
Output(G);
}[em2]
#include<iostream>
using namespace std;
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define Max 100//最大顶点数设为100
typedef char VertexType;/*假设顶点的数据类型为字符*/
typedef int EdgeType;
/*存储结构*/
typedef struct{
int n,e;/*当前顶点数和边数*/
VertexType v[Max];/*顶点数组*/
EdgeType a[Max][Max],visited[Max];/*邻接矩阵*/
}MGraph;
/*基本操作*/
MGraph* print(){/*输入*/
MGraph G;
char s,t;
int i,j,k;
cout<<"请输入顶点数和和边数:"<<endl;
cin>>G.n>>G.e;
if(G.n==0)
cout<<"该图是空!";
cout<<"请输入顶点信息:"<<endl;
for(i=0;i<G.n;i++)
cin>>G.v;
for(i=0;i<G.n;i++)
for(j=0;j<G.n;j++)
G.a[j]=0;//初始化邻接矩阵
cout<<"请输入每个边对应的两个顶点(输入格式:s,t):"<<endl;
for(k=0;k<G.e;k++){
cin>>s>>t;
for(i=0;i<G.n;i++)
if(G.v==s)
break;
for(j=0;j<G.n;j++)
if(G.v[j]==t)
break;
G.a[j]=1;
G.a[j]=1; //无向图邻接矩阵存储建立
}
return &G;
}
MGraph* Output(MGraph G){/*输出*/
cout<<"顶点:";
for(int i=0;i<G.n;i++)
cout<<G.v<<',';
cout<<endl;
if(G.n)
cout<<"\b";
cout<<"边:";
for(i=0;i<G.n;i++)
for(int j=0;j<G.n;j++)
if(G.a[j]==1)
cout<<"("<<G.v<<","<<G.v[j]<<")\t";
if(G.e)
cout<<"\b";
cout<<endl;
cout<<"邻接矩阵:"<<endl;
cout<<"{"<<endl;
for(i=0;i<G.n;i++){
for(int j=0;j<G.n;j++)
cout<<G.a[j]<<' ';
cout<<endl;
}
cout<<"}"<<endl;
return &G;
}
MGraph* InsertVex(MGraph &G,VertexType v){/*增添顶点*/
cout<<"增加的顶点信息"<<endl;
cin>>v;
if(G.n==Max){
cout<<"\n顶点数组已满!";
exit(1);
}
for(int i=0;i<G.n;i++)
if(G.v==v)
cout<<"顶点已经存在"<<endl;/*顶点已存在*/
G.v[G.n++]=v;
for(int j=0;j<G.n;j++){//新增的顶点进行对其连接的边初始化
G.a[j][G.n-1]=0;
G.a[G.n-1][j]=0;
}
return &G;
}
MGraph* InsertArc(MGraph &G,VertexType v,VertexType w){/*增添边*/
cout<<"增添边的两个顶点的信息:"<<endl;
cin>>v>>w;
for(int i=0;i<G.n;i++)if(G.v==v)break;
for(int j=0;j<G.n;j++)if(G.v[j]==w)break;
if(i>=G.n||j>=G.n||i==j){
cout<<"\n无效边!";
exit(1);
}
G.a[j]=1;
G.a[j]=1;
G.e++;
return &G;
}
MGraph* DeleteVex(MGraph &G,VertexType v){/*删除顶点*/
cout<<"请输入删除顶点的信息:"<<endl;
cin>>v;
for(int i=0;i<G.n;i++)if(G.v==v)break;
if(i>=G.n){
cout<<"\n无此顶点!";
exit(1);
}
for(int j=0;j<G.n;j++)G.a[j]=G.a[j]=0;
for(j=i+1;j<G.n;j++){
G.v[j-1]=G.v[j];
for(int k=0;k<G.n;k++)
G.a[j-1][k]=G.a[j][k],G.a[k][j-1]=G.a[k][j];
}
G.n--;
return &G;
}
MGraph* DeleteArc(MGraph &G,VertexType v,VertexType w){/*删除边*/
cout<<"请输入要删除边的两个顶点的信息:"<<endl;
cin>>v>>w;
for(int i=0;i<G.n;i++)if(G.v==v)break;
for(int j=0;j<G.n;j++)if(G.v[j]==w)break;
if(i>=G.n||j>=G.n||i==j||!G.a[j]){
cout<<"\n无效边!";
exit(1);
}
G.a[j]=0;
G.a[j]=0;
G.e--;
return &G;
}
MGraph* OD(MGraph &G){//出度的检索
int i,j,k;
for(i=0;i<G.n;i++){
k=0;
for(j=0;j<G.n;j++){
if(G.a[j]==1)
k=+1;
}
cout<<G.v<<"点的出度是:"<<k<<endl;
}
return &G;
}
MGraph* ID(MGraph &G){//入度的检索
int i,j,k;
for(i=0;i<G.n;i++){
k=0;
for(j=0;j<G.n;j++){
if(G.a[j]==1)
k=+1;
}
cout<<G.v<<"点的入度是"<<k<<endl;
}
return &G;
}
/*主函数*/
void main(){
int v=0,w=0,i;
MGraph G;
G=*print();
Output(G);
InsertVex(G,v);
Output(G);
InsertArc(G,v,w);
Output(G);
ID(G);
OD(G);
DeleteVex(G,v);
Output(G);
DeleteArc(G,v,w);
Output(G);
}[em2]