数据结构–图的创建以及遍历
以下是用邻接表表示的图的创建以及遍历算法,虽然都是很简单的算法,但是我还是用了很长的时间来调试它。。。。。总会有意外的错误。。。
//5.20编程集训——1.图的创建以及遍历输出;
#include <stdlib.h>
#include <iostream>
#include <stdio.h>
#define MAX_SIZE 10
using namespace std;
//邻接表
struct ArcNode{
int vertex;
struct ArcNode *next;
};
struct FirNode{
int firtex;
ArcNode *firstarc;
};
struct AGraph{
FirNode arry[MAX_SIZE];
int n,e;//分别表示元素的个数以及变量个数
};
void Creat(AGraph *A){
int a,b;
ArcNode *s,*ss;
cout<<"请输入顶点数以及边数:"<<endl;
cin>>A->n>>A->e;
for(int i=0;i<A->n ;i++){
A->arry[i].firtex =i;
A->arry[i].firstarc=NULL;
}
cout <<"请输入元素:"<<endl;
for(int i=1;i<=A->e;i++){
cin>>a>>b;
//在a的后面接上b的内容
s=(ArcNode*)malloc(sizeof(struct ArcNode ));
s->vertex =b;
s->next=A->arry[a].firstarc;
A->arry[a].firstarc=s;
//在b的后面接上a的内容
ss=(ArcNode*)malloc(sizeof(struct ArcNode));
ss->vertex=a;
ss->next=A->arry[b].firstarc;
A->arry[b].firstarc=ss;
}
}
bool visited[MAX_SIZE]; //默认值是false
void Traversal(AGraph *A,int v){//初始化一个开始的元素
//cout<<v<<endl;
visited[v]=true;
cout<<v<<endl;
ArcNode *p;
p=A->arry[v].firstarc ;
while(p){
if(!visited[p->vertex]) {
Traversal(A,p->vertex);
}
p=p->next ;
}
}
int main (){
AGraph *a;//创建了一个指针类型的图,创建的结构体指针一定要有所指向
AGraph test;
a=&test;
int c;
cout<<"请输入开始的节点元素:"<<endl;
cin>>c;
Creat(a);
cout<<"已经建立完成"<<endl;
Traversal(a,c);//本来就是指针
return 0;
}
程序执行情况如下图所示:
不过,上面的程序的局限性在于我们只能向其中输入数字而不能是其他的数值类型;
改进版程序代码如下:
#include <stdlib.h>
#include <iostream>
#include <stdio.h>
#define MAX_SIZE 10
using namespace std;
//邻接表
struct ArcNode{
char vertex;
struct ArcNode *next;
};
struct FirNode{
char firtex;
ArcNode *firstarc;
};
struct AGraph{
FirNode arry[MAX_SIZE];
int n,e;//分别表示元素的个数以及变量个数
};
int Location(char m, FirNode *A,int n){//查找m数值在数组中对应的下标
for(int i=0;i<n;i++){
if(A[i].firtex ==m)
return i;
}
cout<<"输入有误!"<<endl;
}
void Creat(AGraph *A){
char a,b;
char c;
ArcNode *s,*ss;
cout<<"请输入顶点数以及边数:"<<endl;
cin>>A->n>>A->e;
cout<<"请输入各个元素的数值:"<<endl;
for(int i=0;i<A->n ;i++){
cin>>c;
A->arry[i].firtex =c;
A->arry[i].firstarc=NULL;
}
cout <<"请输入元素:"<<endl;
for(int i=1;i<=A->e;i++){
cin>>a>>b;
//在a的后面接上b的内容
s=(ArcNode*)malloc(sizeof(struct ArcNode ));
int h=Location(a,A->arry,A->n);
s->vertex =b;
s->next=A->arry[h].firstarc;
A->arry[h].firstarc=s;
//在b的后面接上a的内容
ss=(ArcNode*)malloc(sizeof(struct ArcNode));
int hh=Location(b,A->arry,A->n );
ss->vertex=a;
ss->next=A->arry[hh].firstarc;
A->arry[hh].firstarc=ss;
}
}
bool visited[MAX_SIZE]; //默认值是false
void Traversal(AGraph *A,char v){//初始化一个开始的元素
int t=Location(v,A->arry,A->n);
visited[t]=true;
cout<<v<<endl;
ArcNode *p;
p=A->arry[t].firstarc ;
while(p){
if(!visited[Location(p->vertex,A->arry,A->n)]) {
Traversal(A,p->vertex);
}
p=p->next ;
}
}
int main (){
AGraph *a;//创建了一个指针类型的图,创建的结构体指针一定要有所指向
AGraph test;
a=&test;
char c;
cout<<"请输入开始的节点元素:"<<endl;
cin>>c;
Creat(a);
cout<<"已经建立完成"<<endl;
Traversal(a,c);//本来就是指针
return 0;
}
程序运行如下所示:
建议:关于Location函数可以直接用C++里面的函数库;