當前位置:編程學習大全網 - 編程語言 - 無向圖的建立(鄰接矩陣)與深度遍歷程序(C語言)

無向圖的建立(鄰接矩陣)與深度遍歷程序(C語言)

(1) 圖的建立,按采用鄰接表作為存儲結構,

(2) 從指定頂點出發進行深度優先搜索遍歷。

(3) 從指定頂點出發進行廣度優先搜索遍歷。

#include"stdio.h"

#include"string.h"

#include"stdlib.h"

#include"math.h"

#define MAX_INT 1000

#define MAX_VERTEX_NUM 20

#define MAX_QUEUE_NUMBER 20

typedef struct ArcNode

{

int adjvex;

double adj;

struct ArcNode *nextarc;

}ArcNode;

typedef struct VexNode

{

char szName[40];

ArcNode *firstarc;

}VexNode,AdjList[MAX_VERTEX_NUM];

typedef struct

{

AdjList vexs;

int vexnum,arcnum;

}Net;

//定義隊列

typedef struct{

int *elem;

int front, rear;

}Queue;

void InitQueue(Queue &Q)

{

Q.elem = new int[MAX_QUEUE_NUMBER];

Q.front = Q.rear = 0;

}

int EmptyQueue(Queue Q)

{

if(Q.front==Q.rear)

return 0;

else

return 1;

}

void DestroyQueue(Queue &Q){

delete []Q.elem;

Q.front = Q.rear = 0;

}

void EnterQueue(Queue &Q, int e)

{

if((Q.rear + 1)%MAX_QUEUE_NUMBER != Q.front)

Q.elem[Q.rear ] = e;

else

printf("隊列滿!\n");

Q.rear = (Q.rear + 1)%MAX_QUEUE_NUMBER;

}

void LeaveQueue(Queue &Q, int &e)

{

if(Q.rear != Q.front)

e = Q.elem[Q.front];

else

printf("隊列空!\n");

Q.front = (Q.front+1)%MAX_QUEUE_NUMBER;

}

int LocateVex(Net ga,char *name)

{

int i;

for(i=0;i<ga.vexnum;i++)

if(strcmp(name,ga.vexs[i].szName)==0)

return i;

return -1;

}

void crt_net(Net &ga)

{

ArcNode *p;

char name1[40],name2[40];

int i,j,k;

double w;

printf("請輸入頂點數和弧數:");

scanf("%d%d",&ga.vexnum,&ga.arcnum);

printf("請依次輸入頂點名:\n");

for(i=0;i<ga.vexnum;i++)

{

scanf("%s",ga.vexs[i].szName);

ga.vexs[i].firstarc=NULL;

}

for(k=0;k<ga.arcnum;k++)

{

printf("請輸入相鄰的兩個定點和權值:");

scanf("%s%s%lf",name1,name2,&w);

i=LocateVex(ga,name1);

j=LocateVex(ga,name2);

p=new ArcNode;

p->adjvex=j;

p->adj=w;

p->nextarc=ga.vexs[i].firstarc;

ga.vexs[i].firstarc=p;

}

}

void DFS(Net ga,char *name,int *visited)

{

int v,w;

ArcNode *p;

v=LocateVex(ga,name);

visited[v]=1;

printf("%s ",ga.vexs[v].szName);

p=ga.vexs[v].firstarc;

while(p!=NULL)

{

w=p->adjvex;

if(visited[w]==0)

DFS(ga,ga.vexs[w].szName,visited);

p=p->nextarc;

}

}

void DFSTravel(Net ga,char *name)

{

int v,k=0;

int visited[20];

for(v=0;v<ga.vexnum;v++)

visited[v]=0;

for(v=LocateVex(ga,name);k!=2;v=(v+1)%(ga.vexnum-1))

{

if(v+1==LocateVex(ga,name))

k++;

if(visited[v]==0)

DFS(ga,ga.vexs[v].szName,visited);

}

}

void BFSTravel(Net ga,char *name)

{

ArcNode *p;

int v,w,u,k=0;

Queue Q;

int visited[20];

for(v=0;v<ga.vexnum;v++)

visited[v]=0;

InitQueue(Q);

for(v=LocateVex(ga,name);k!=2;v=(v+1)%(ga.vexnum-1))

{

if(v+1==LocateVex(ga,name))

k++;

if(visited[v]==0)

{

visited[v]=1;

printf("%s ",ga.vexs[v].szName);

EnterQueue(Q,v);

while(EmptyQueue(Q)!=0)

{

LeaveQueue(Q,u);

p=ga.vexs[u].firstarc;

while(p!=NULL)

{

w=p->adjvex;

if(visited[w]==0)

{

printf("%s ",ga.vexs[w].szName);

visited[w]=1;

EnterQueue(Q,w);

}

p=p->nextarc;

}

}

}

}

}

void main()

{

char name[40];

Net ga;

crt_net(ga);

printf("請輸入深度優先遍歷開始點的名:");

scanf("%s",name);

printf("深度優先遍歷:");

DFSTravel(ga,name);

printf("\n");

printf("請輸入廣度優先遍歷開始點的名:");

scanf("%s",name);

printf("廣度優先遍歷:");

BFSTravel(ga,name);

printf("\n");

}

  • 上一篇:編程需要多少數學知識?
  • 下一篇:數控機床的系統都有哪些?
  • copyright 2024編程學習大全網