有向图的邻接表储存

#include<iostream>
#include<stack> 
using namespace std;
stack<int> curStack;
struct ArcNode//边表节点 
{
int data;
ArcNode *next;
 };
 struct VertexNode//顶点表节点 
 {
  char vertex;
ArcNode *firstedge;
 };
 const int MaxSize=10;//图最大顶点数 
 class Picture
 {
private:
 VertexNode a[MaxSize];
 int sideNumber,dotNumber;
 
public:
Picture();
bool visited[MaxSize];
int getdotNumber();
void outputDot();
void outputTable();
void renovate();
void DFSTraverse(int v);//深度优先遍历
void BFSTraverse(int v);//广度优先遍历
};
Picture::Picture()
{
int sideA,sideB;
cin>>dotNumber>>sideNumber;
for(int i=0;i<dotNumber;i++)
{
cin>>a[i].vertex;
a[i].firstedge=NULL;
}
for(int i=0;i<sideNumber;i++)
{
cin>>sideA>>sideB;
ArcNode *s=new ArcNode;
s->data=sideB;
s->next=a[sideA].firstedge;
a[sideA].firstedge=s;
visited[i]=false;

}
int Picture::getdotNumber()
{
return dotNumber;
}
void Picture::renovate()
{
for(int i=0;i<dotNumber;i++)
{
visited[i]=false;
}
}
void Picture::outputDot()
{
for(int i=0;i<dotNumber;i++) cout<<a[i].vertex<<" ";
}
void Picture::outputTable()
{
ArcNode *p;
for(int i=0;i<dotNumber;i++)
{
p=a[i].firstedge;
cout<<a[i].vertex<<" ";
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}

}
void Picture::DFSTraverse(int v)
{
cout<<a[v].vertex<<" "; visited[v]=true;
ArcNode *p;
p=a[v].firstedge;
while(p!=NULL)
{
int j=p->data;
if(visited[j]==false)
{
DFSTraverse(j);

p=p->next;
}
}
void Picture::BFSTraverse(int v)
{
int q[MaxSize];
int front=-1,rear=-1;
cout<<a[v].vertex<<" ";
visited[v]=true;
q[++rear]=v;
while(front!=rear)
{
v=q[++front];
ArcNode *p=a[v].firstedge;
while(p!=NULL)
{
int j=p->data;

if(visited[j]==false)
{
cout<<a[j].vertex<<" ";
visited[j]=true;
q[++rear]=j;
}
p=p->next;
}
}
 } 
int main()
{
Picture *a=new Picture();
a->outputDot();
cout<<endl;
a->outputTable();
for(int i=0;i<a->getdotNumber();i++)
{
if(a->visited[i]==false)
a->DFSTraverse(i);
}

cout<<endl;
a->renovate();
for(int i=0;i<a->getdotNumber();i++)
{
if(a->visited[i]==false)
a->BFSTraverse(i);
}

return 0;
 } 
/*
5 3
A B C D E
0 1
0 2
0 3




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值