#include "iostream"
#include "iomanip"
#include "algorithm"
#define maxsize 10
using namespace std;
int visited[]={0};
struct arc_node //边表
{
int adjvex; //邻接点下标
arc_node*next_arc; //指向下一条弧节点
};
struct vertex_node //存储顶点信息(顶点表)
{
char vertex; //顶点信息
arc_node*first_arc; //指向的第一条弧
};
//struct ALGgraph
//{
// int vertexnum;
// int acenum;
// vertexnode adjlist[maxsize];
//};
class graph
{
private:
vertex_node adjlist[maxsize]; //顶点表
int vertexnum;
int arcnum;
public:
//创建一个图
graph(int m,int n,char a[])
//adjlist[]---顶点数据信息,vertexnum(m)---顶点个数,arcnum(n)---边的个数
{
arc_node*s=NULL;
vertexnum=m;
arcnum=n;
//建立顶点表
for(int i=0;i<vertexnum;i++)
{
adjlist[i].vertex=a[i];
adjlist->first_arc=NULL;
//将顶点信息存储在顶点表中,将该顶点边表的头指针初始化为NULL;
}
//边表
int k,h;
for(int j=0;j<arcnum;j++)// 依次输入边的信息并存储在边表中
{
//k,h是边所依附的两个顶点的编号
cin>>k>>h; //逐个输入k:顶点下标
//h:邻接点的编号
arc_node *s=new arc_node ;//生成边表结点 s
s->adjvex=h; //邻接点的编号为h
s->next_arc=adjlist[k].first_arc;//将结点 s 插入到第k个边表的表头
//头插法
adjlist[k].first_arc=s;
}
}
//销毁图
~graph()
{
arc_node*p=NULL;
arc_node*q=NULL;
for(int i=0;i<vertexnum;i++)
{
p=adjlist[i].first_arc;
q=adjlist[i].first_arc;
//由于p,q现在都指向第一条弧,
// 故先将p向后挪动一个,到第二个位置,
// 然后删去q(也就是第一个弧),
// 再令q=p(此时是第二个弧),
// 二者交错一直循环,直至完全销毁图
while(p!=NULL)
{
p=p->next_arc;
free(q);
q=p;
}
}
}
//深度优先遍历
void DFS(int v)// 输入顶点的编号
{
cout<<"v"<<adjlist[v].vertex<<" ";//访问顶点 v
visited[v]=1;//访问标志数组visited[n](记录访问的次数)
arc_node *p=NULL;
p=adjlist[v].first_arc;
while (p!=NULL)
{
if(visited[p->adjvex]==0)
{
DFS(p->adjvex);
}
p=p->next_arc;
}
}
// void DFS(int v)
// {
// int Stack[100];
// int top =-1;
// cout<<'v'<<v+1<<' ';
// visited[v] = 1;
// Stack[++top] = v;//入栈
// arc_node *p=NULL;
// p=adjlist[v].first_arc;
// while(top!=-1)
// {
// int i;
// for (i=0;i<vertexnum;i++)
// if ( p->adjvex==1&& visited[i]==0)
// {
// v = i;
// Stack[++top] = v;//入栈
// cout<<'v'<<v+1<<' ';
// visited[v] = 1;
// break;
// }
//
// if (i==vertexnum)
// { top--;
// v = Stack[top];}//出栈
// }
// }
//广度优先遍历
void BFS(int v)
{
arc_node*p=NULL;
int Q[maxsize];
int front =-1;
int rear=-1;
cout<<adjlist[v].vertex;
visited[v]=1;
Q[++rear]=v;
while (front!=rear)
{
int i=Q[++front];
p=adjlist[i].first_arc;
while(p!=NULL)
{
int j=p->adjvex;
if(visited[j]==0)
{
cout<<adjlist[j].vertex;
visited[j]=1;
Q[++rear]=j;
}
p=p->next_arc;
}
}
}
void print_pic()
{
for(int i=0;i<vertexnum;i++)
{
cout<<"v"<<adjlist[i].vertex<<" ";
}
cout<<endl;
}
};
int main()
{
char a='0',b='1',c='2',d='3',e='4';
char arr[]={a,b,c,d,e};
graph g(5,7,arr);
g.print_pic();
g.DFS(1);
g.BFS(1);
g.~graph();
}