图的构造、DFS、BFS 以及图的删除实现

来源:互联网 发布:网络使人更亲近的例子 编辑:程序博客网 时间:2024/06/03 11:38
#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 20typedef 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、对图算法认识需要跟多熟悉。

 

原创粉丝点击