首先声明,我是一个菜鸟。一下文章中出现技术误导情况盖不负责
#include<iostream>
#define maxsize 30
#define NULLDATA -1
/*
功能:邻接表存储图、DFS、BFS 以及 删除图
*/
using namespace std;
typedef struct e_node *link;
typedef struct e_node //邻接顶点
{
int visit; //节点序号
link next; //下一个节点地址
}e_node;
typedef struct v_node // 顶点
{
int info;
link next_v; //边节点链表头部
}v_node;
typedef struct graph
{
v_node vertexs[maxsize];
int vexnum;
int arcnum;
int flag[maxsize];
} graph;
graph *G = (graph *)malloc(sizeof(graph));
/*队列定义和函数部分 (BFS中用到队列)*/
#define ElemType int //队列定义部分
#define NUM_NULL -1
#define maxsize_queue 20
typedef struct Queue
{
ElemType data[maxsize_queue];
int front,rear;
}Queue;
Queue *q;
/* 图部分函数*/
void Init() //初始化图
{
for(int i = 0; i < maxsize; i++)
{
G->vertexs[i].info = NULLDATA;
G->vertexs[i].next_v = NULL;
}
memset(G->flag,0,maxsize);
cout<<"input the arcnum:"<<endl; //输入顶点个数和边数
cin>>G->arcnum;
}
void edge_add() //输入边来结构图
{
int v1,v2;
int k = 0;
link ptr;
do
{
do
{cout<<"input the edge: "<<endl;
cin>>v1;
cin>>v2;
}while(v1 >= maxsize || v2 >= maxsize);
v1--;v2--;
G->vertexs[v1].info = v1;
G->vertexs[v2].info = v2;
if(G->vertexs[v1].next_v == NULL)
{
cout<<"Hello"<<endl;
G->vertexs[v1].info = v1;
G->vertexs[v1].next_v = NULL;
}
if(G->vertexs[v1].next_v == NULL )
{
G->vertexs[v1].next_v = (link)malloc(sizeof(e_node));
G->vertexs[v1].next_v->visit = v2;
G->vertexs[v1].next_v->next = NULL;
}
else
{
link p =(link)malloc(sizeof(e_node));
p->visit = v2;
p->next = NULL;
ptr = G->vertexs[v1].next_v;
while(ptr->next != NULL)
ptr = ptr->next;
ptr->next = p;
}
k++;
}while(k < G->arcnum );
if(k == G->arcnum)
cout<<"The edge is full...."<<endl;
}
void delete_graph() //删除图
{ link p1,p2;
for(int i = 0; i < G->vexnum; i++)
{
p1 = p2 = G->vertexs[i].next_v;
while(p1)
{
p2 = p1->next;
delete p1;
p1 = p2;
cout<<i<<"is been done."<<endl;
}
}
}
void DFS(int v) //DFS实现
{
link ptr; //DFS用头指针节点
G->flag[v] = 1;
cout<<G->vertexs[v].info<<endl;
ptr = G->vertexs[v].next_v;
while(ptr != NULL)
{
if(G->flag[ptr->visit] == 0)
{
DFS(ptr->visit);
}
ptr = ptr->next;
}
return ;
}
/*队列部分函数*/
void Init_queue()
{
q=(Queue *)malloc(sizeof(Queue));
q->front=q->rear=0;
}
void in(ElemType v)
{
q->data[q->rear]=v;
q->rear++;
}
ElemType out()
{
ElemType tmp;
tmp=q->data[q->front];
q->front++;
return tmp;
}
bool empty_queue()
{
return q->front == q->rear;
}
/*BFS实现部分*/
void BSF(int v)
{link p;
G->flag[v] = 1;
in(v);
while(!empty_queue())
{
int k = out();
p = G->vertexs[k].next_v;
cout<<G->vertexs[k].info<<endl;
while(p)
{
int j = p->visit;
if(G->flag[j] == 0)
{
G->flag[j] = 1;
in(j);
}
p = p->next;
}
}
}
int main()
{
Init(); //初始化图
Init_queue(); //初始化队列
edge_add(); //输入边来结构图
cout<<"DFS:--------------"<<endl; //打印深搜
DFS(0);
cout<<"BFS:------------------"<<endl; //打印广搜
memset(G->flag,0,maxsize); //对标识数组复位后才能重新应用BFS
BSF(0);
delete_graph(); //删除图
cout<<"over !"<<endl;
system("pause");
return 0;
}
只能在Dev C++ 下运行。
输入示例:(1,2)(1,4)(1,5)(2,3)(2,5)(4,6)(5,6)(6,7)(7,8)。
总结:
1、BFS中的队列未应用STL。
2、代码混乱。
3、对图算法认识须要跟多熟习。
文章结束给大家分享下程序员的一些笑话语录:
一程序员告老还乡,想安度晚年,于是决定在书法上有所造诣。省略数字……,准备好文房4宝,挥起毛笔在白纸上郑重的写下:Hello World
---------------------------------
原创文章 By
删除和实现
---------------------------------