图的深度优先搜索,广度优先搜索,代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#include
#define MAX_VERTEX_NUM 50
typedef struct Arcnode
{
int adjvex;
struct Arcnode *nextarc;
} Arcnode;
typedef struct VNode
{
int data;
Arcnode *firstarc;
} VNode, AdjList[MAX_VERTEX_NUM];
typedef struct
{
AdjList vertice;
int vexnum, arcnum;
int kind;
} Graph;
int visit[100];//用来标记每个定点是否被访问过
void changeV_G(int v[], Graph &G, int n);//将邻接矩阵转换成邻接表int FirstAdjVex(Graph G, int v);
int NextAdjVex(Graph G, int v, int w);
void DFS(Graph G, int v);
void DFSTraverse(Graph G, int v[]);
void changeV_G(int v[], Graph &G, int n)
{
for(int i=0; i { G.vertice[i].data=i; G.vertice[i].firstarc=NULL; } G.vexnum=n;//图的顶点数 for(int i=0; i for(int j=0; j { int x=n*i+j; if(v[x]==1) { if(G.vertice[i].firstarc==NULL) { G.vertice[i].firstarc=new Arcnode; G.vertice[i].firstarc->adjvex=j; G.vertice[i].firstarc->nextarc=NULL; } else { Arcnode *p=G.vertice[i].firstarc; for(; p->nextarc!=NULL; p=p->nextarc) { } p->nextarc=new Arcnode; p=p->nextarc; p->adjvex=j; p->nextarc=NULL; } } } } void DFSTraverse(Graph G, int visit[], int n) { for(int i=0; i { for(int v=0; v for(int v=i; v if(!visit[v]) DFS(G,v); printf("\n"); } } void DFS(Graph G, int v) { visit[v]=1; printf("%d ",G.vertice[v].data ); int w; for( w = FirstAdjVex(G, v); w>= 0; w = NextAdjVex(G, v, w)) { if(!visit[w]) DFS(G, w); } } int FirstAdjVex(Graph G, int v)//G.vertice[v].data { if(G.vertice[v].firstarc!=NULL) return G.vertice[v].firstarc->adjvex; else return -1; } int NextAdjVex(Graph G, int v, int w) { Arcnode *p; for(p = G.vertice[v].firstarc;;) { if(p->adjvex==w) break; p=p->nextarc; } if(p->nextarc==NULL) return -1; else return p->nextarc->adjvex; } typedef struct QNode { int data; struct QNode *next; } QNode, *QueuePtr; typedef struct { QueuePtr ffront; QueuePtr rear; } LinkQueue; int InitQueue(LinkQueue &Q) { Q.ffront=(QueuePtr)malloc(sizeof(QNode)); Q.rear=Q.ffront; if(!Q.ffront) exit(1); Q.ffront->next = NULL; return 1; } int EnQueue(LinkQueue &Q, int e) { QueuePtr p; p=(QueuePtr)malloc(sizeof(QNode)); if(!p) exit(1); p->data = e; p->next = NULL; Q.rear->next = p; Q.rear = p; return 1; } int Dequeue(LinkQueue &Q, int &e) {