好长时间没有写代码(感觉自己更弱了),今天晚上就把数据结构的链表和邻接表部分实现了(手都生了),第一次写邻接表,觉得还是邻接矩阵好很多,毕竟建表还是挺麻烦的…..顺便把bfs和dfs加了进去,刚学数据结构或者算法入门的可以看看,我是小菜,大神 求别喷……
过两天再把几种排序和查找的时空分析和代码实现总结一下,顺便自己也能学到很多,快要考试了,ACM的步伐就放缓一下下……
//图的邻接表储存及搜索 ,第一次写邻接表,还是比较麻烦的 ,下面的代码以有向图为例进行分析
//邻接矩阵就比较简单了,直接把p=p->next改为循环查找,然后操作都是一样的
//其实我觉得邻接表比邻接矩阵没有好到哪去,建表多出一步啊 ,做题还是矩阵来的方便
#include<iostream>
#include<queue>
#include<stack>
#include<cstring>
#define N 10000 //顶点个数
using namespace std;
int vist[N];
struct ArcNode //顶点的一个边节点
{
int value ; //该邻接点 的值
ArcNode *nextver; //下一个 邻接点的指针
};
struct K_Node{
// int value; // 可有可无,如果顶点是从0开始计数value=数组下标,否则等于数组下标加一
ArcNode *nextver; // 顶点的出边表表头指针
//ArcNode *head2; // 如果有向图需要记录每个顶点的入边表的节点,可加上此指针
};
struct Grf{ //邻接表的建造
K_Node node[N]; //定点
int arcnum; //邻接表边数
int vexnum; //邻接表点数
};
Grf CreatGf()
{
Grf GT;
cout<< "请输入邻接表的边数和点数:"<<endl;
cin>>GT.arcnum>>GT.vexnum;
for(int i=0;i<GT.vexnum;i++)
GT.node[i].nextver=NULL;
//GT.node[i].head2=NULL 需建立入边表时可用到
ArcNode *pi;
cout<<"请输入每条边的两个顶点"<<endl;
int v1,v2;
for(int i=0;i<GT.arcnum;i++)
{
cin>>v1>>v2;
pi=new ArcNode;
pi->value=v2;
pi->nextver=GT.node[v1].nextver;
GT.node[v1].nextver=pi;
/* 如果需要建立入边表 或者是无向图则需要下列代码
pi=new ArcNode;
pi->value=v1;
pi->next=GT.node[v2].head2;
GT.node[v2].head1=p1;
*/
}
return GT;
}
void DFS( int vertex,Grf GT) //深度优先搜索
{
vist[vertex]=1; //搜索到后做标记
cout<<vertex<<" ";
ArcNode *p=GT.node[vertex].nextver;
while(p!=NULL)
{
if(vist[p->value]==0)
DFS(p->value,GT);
p=p->nextver;
}
}
void BFS(int vertex ,Grf GT) //广度优先搜索
{
vist[vertex]=1;
queue<int> q;
q.push(vertex);
while(!q.empty())
{
int k=q.front();
cout<<k<<" ";
q.pop();
ArcNode *p=GT.node[k].nextver;
while(p!=NULL)
{
if(vist[p->value]==0)
{
vist[p->value]=1;
q.push(p->value);
}
p=p->nextver;
}
}
}
int main()
{
Grf GT=CreatGf(); //建表
memset(vist,0,sizeof(vist));
cout<<"DFS测试结果为:"<<endl;
DFS(1,GT); //深搜
cout<<endl<<"BFS测试结果为:" <<endl ;
memset(vist,0,sizeof(vist));
BFS(1,GT); //广搜
system("pause");
return 0;
}
/*测试数据如下
8 8
1 2
2 3
2 5
5 1
1 4
4 6
6 7
7 8
*/