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

首先声明,我是一个菜鸟。一下文章中出现技术误导情况盖不负责

#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
删除和实现
---------------------------------

posted @ 2013-05-26 23:45  xinyuyuanm  阅读(233)  评论(0编辑  收藏  举报