#include<iostream>
#include<queue>
#include<memory.h>
#define maxSize 100
using namespace std;
struct edgeNode
{
int dest; //邻接顶点的数组下标
//int weight; 权重
edgeNode* next;
};
struct vertexNode
{
char vertex;
edgeNode* link;
};
class Graph
{
private:
int vertexNum,edgeNum;
vertexNode adjTable[maxSize];
int visited[maxSize];
public:
Graph(char a[],int vn,int en)
{
vertexNum=vn;
edgeNum=en;
for(int i=0; i<vertexNum; i++)
{
adjTable[i].vertex=a[i];
adjTable[i].link=NULL;
visited[i]=0;
}
}
int getVertexIndex(char v)
{
for(int i=0; i<vertexNum; i++)
{
if(adjTable[i].vertex==v)
{
return i;
}
}
return -1;
}
void insertEdge(char v1,char v2)
{
int index1=getVertexIndex(v1);
int index2=getVertexIndex(v2);
edgeNode* p=new edgeNode();
p->dest=index2;
p->next=adjTable[index1].link;
adjTable[index1].link=p;
}
void show()
{
cout<<"邻接表为:"<<endl;
for(int i=0; i<vertexNum; i++)
{
cout<<adjTable[i].vertex;
edgeNode* p=adjTable[i].link;
while(p!=NULL)
{
cout<<"->";
cout<<adjTable[p->dest].vertex;
p=p->next;
}
cout<<endl;
}
}
void DFS(char v)
{
int index=getVertexIndex(v);
cout<<adjTable[index].vertex;
visited[index]=1;
edgeNode* p=adjTable[index].link;
while(p!=NULL)
{
if(visited[p->dest]==0)
{
DFS(adjTable[p->dest].vertex);
}
p=p->next;
}
}
void BFS(char v)
{
memset(visited,0,sizeof(visited)); //将viseted[]中元素初始化为0
int index=getVertexIndex(v);
queue<int> Q; //下标进队列
cout<<adjTable[index].vertex;
visited[index]=1;
Q.push(index);
while(!Q.empty())
{
index=Q.front();
Q.pop();
edgeNode* p=adjTable[index].link;
while(p!=NULL)
{
if(visited[p->dest]==0)
{
cout<<adjTable[p->dest].vertex;
visited[p->dest]=1;
Q.push(p->dest);
}
p=p->next;
}
}
}
};
int main()
{
cout<<"请输入图的顶点数、边数:";
int vn,en;
cin>>vn>>en;
cout<<"请输入各个顶点:";
char a[vn];
for(int i=0; i<vn; i++)
{
cin>>a[i];
}
Graph G(a,vn,en);
cout<<"请输入各条边:"<<endl;
char v1,v2;
for(int i=0; i<en; i++)
{
cin>>v1>>v2;
G.insertEdge(v1,v2);
}
G.show();
cout<<"请输入遍历起始顶点:";
char init;
cin>>init;
cout<<"深度遍历:";
G.DFS(init); //先确保viseted[]已初始化归零
cout<<endl;
cout<<"广度遍历:";
G.BFS(init); //先确保visited[]已初始化归零
cout<<endl;
return 0;
}
//请输入图的顶点数、边数:4 10
//请输入各个顶点:a b c d
//请输入各条边:
//a b
//a c
//a d
//b a
//b c
//c b
//c a
//c d
//d c
//d a
//邻接表为:
//a->d->c->b
//b->c->a
//c->d->a->b
//d->a->c
//请输入遍历起始顶点:b
//深度遍历:bcda
//广度遍历:bcad