数据结构图实验报告

数据结构图实验报告
数据结构图实验报告

【实验内容】

图的存储建立及遍历(DFS、BFS):

#define INFINITY 10000

#define MAX_VERTEX_NUM 40

#define MAX 40

#include

#include

#include

#include

typedef struct ArCell{

int adj;

}ArCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct

{

char name[20];

}infotype;

typedef struct

{

infotype vexs[MAX_VERTEX_NUM];

AdjMatrix arcs;

int vexnum,arcnum;

}MGraph;

int LocateVex(MGraph *G,char* v)

{ int c=-1,i;

for(i=0;ivexnum;i++)

if(strcmp(v,G->vexs[i].name)==0)

{c=i;break;}

return c;

}

MGraph * CreatUDN(MGraph *G)//初始化图,接受用户输入

{

int i,j,k,w;

char v1[20],v2[20];

printf("请输入图的顶点数,弧数:");

scanf("%d%d",&G->vexnum,&G->arcnum);

printf("结点名字:\n");

for(i=0;ivexnum;i++){

printf("No.%d:",i+1);

scanf("%s",G->vexs[i].name);}

for(i=0;ivexnum;i++)

for(j=0;jvexnum;j++)

G->arcs[i][j].adj=INFINITY;

printf("请输入一条边依附的两个顶点和权值:\n");

for(k=0;karcnum;k++)

{printf("第%d条边:\n",k+1);

printf("起始结点:");

scanf("%s",v1);

printf("结束结点:");

scanf("%s",v2);

printf("边的权值:");

scanf("%d",&w);

i=LocateVex(G,v1);

j=LocateVex(G,v2);

if(i>=0&&j>=0){

G->arcs[i][j].adj=w;

G->arcs[j][i]=G->arcs[i][j];

}}

return G;

}

int FirstAdjVex(MGraph *G,int v)

{

int i;

if(v<=0 &&vvexnum){ //v合理

for(i=0;ivexnum;i++)

if(G->arcs[v][i].adj!=INFINITY)

return i;

}

return -1;

}

void VisitFunc(MGraph *G,int v)

{

printf("%s ",G->vexs[v].name);

}

int NextAdjVex(MGraph *G,int v,int w)

{

int k;

if(v>=0 && vvexnum && w>=0 && wvexnum)//v,w合理{

for( k=w+1;kvexnum;k++)

if(G->arcs[v][k].adj!=INFINITY)

return k;

}

return -1;

}

int visited[MAX];

void DFS(MGraph *G,int v)//从第v个顶点出发递归地深度优先遍历图G {

int w;

visited[v]=1;

VisitFunc(G,v);//访问第v个结点

for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))

if(!visited[w]){

DFS(G,w);

printf("%d ",G->arcs[v][w].adj);}

}

void DFSTraverse(MGraph *G,char *s)//深度优先遍历

{int v,k;

for(v=0;vvexnum;v++)

visited[v]=0;

k=LocateVex(G,s);

if(k>=0&&kvexnum){

for(v=k;v>=0;v--){

if(!visited[v])

DFS(G,v);}

for(v=k+1;vvexnum;v++)

if(!visited[v])

DFS(G,v);

}

}

typedef struct Qnode

{

int vexnum;

struct Qnode *next;

}QNode,*QueuePtr;

typedef struct

{

QueuePtr front;

QueuePtr rear;

}LinkQueue;

int InitQueue(LinkQueue *Q)

{

Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));

if(!Q->front)exit(0);

Q->front->next=NULL;

return 1;

}

void EnQueue(LinkQueue *Q,int a )

{

QueuePtr p;

p=(QueuePtr)malloc(sizeof(QNode));

if(!p)exit(0);

p->vexnum=a;

p->next=NULL;

Q->rear->next=p;

Q->rear=p;

}

int DeQueue(LinkQueue *Q,int *v)

{ QueuePtr p;

if(Q->front==Q->rear)

{printf("结点不存在!\n");exit(0);}

p=Q->front->next;

*v=p->vexnum;

Q->front->next=p->next;

if(Q->rear==p)

Q->front=Q->rear;

return *v;

}

int QueueEmpty(LinkQueue *Q)

{

if(Q->rear==Q->front)

return 0;

return 1;

}

int Visited[MAX];

void BFSTraverse(MGraph *G,char *str)//广度优先遍历{int w,u,v,k;

LinkQueue Q,q;

for(v=0;vvexnum;v++) Visited[v]=0;

InitQueue(&Q);InitQueue(&q);

k=LocateVex(G,str);

for(v=k;v>=0;v--)

if(!Visited[v])

{

Visited[v]=1;

VisitFunc(G,v);

EnQueue(&Q,v);//v入队

while(!QueueEmpty(&Q))

{

DeQueue(&Q,&u);//出队

for(w=FirstAdjVex(G,u);w>=0;w=NextAdjVex(G,u,w)) if(!Visited[w])

{

Visited[w]=1;

VisitFunc(G,v);

EnQueue(&Q,w);

}

}

}

for(v=k+1;vvexnum;v++)

if(!Visited[v])

{

Visited[v]=1;

VisitFunc(G,v);

EnQueue(&Q,v);//v入队

while(!QueueEmpty(&Q))

{

DeQueue(&Q,&u);//出队

for(w=FirstAdjVex(G,u);w>=0;w=NextAdjVex(G,u,w)) if(!Visited[w])

{

Visited[w]=1;

VisitFunc(G,v);

EnQueue(&Q,w);

}

}

}

}

void main()

{

MGraph *G,b;

char v[10];

G=CreatUDN(&b);

printf("请输入起始结点名称:");

scanf("%s",v);

printf("\n深度优先遍历:\n");

DFSTraverse(G,v);

printf("\n广度优先遍历:\n"); BFSTraverse(G,v);

getch();

}

相关主题
相关文档
最新文档