删除实现图的构造、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
删除和实现
---------------------------------