图的深度优先搜索,广度优先搜索,代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)

{

相关文档
最新文档