邻接矩阵的深度优先遍历

废话不多说,直接看代码

t#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define INFINITY INT_MAX
#define  MAX_VERTEX_NUM 20
bool visted[MAX_VERTEX_NUM]; 
typedef char VertexType; 
typedef int VRType; 
typedef int QElemType;
typedef enum {
DG,DN,AG,AN
}Graphkind;
typedef struct ArcCell{//表征图的连接关系  
VRType adj;            //连接关系  
ArcCell *info;         //附加信息  
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct{
	VertexType vexs[MAX_VERTEX_NUM];//顶点的类型 
	AdjMatrix arcs;//邻接矩阵 
	int vexnum,arcnum;//图的顶点数,边数 
	Graphkind kind;//图的类型 
}Mgraph;
typedef struct QNode{//队列节点 
        QElemType data;
        struct QNode *next;
      }QNode,*QueuePtr;
      typedef struct{
      	QueuePtr front;
      	QueuePtr rear;
	  }LinkQueue;//队列指针 
	  void InitQueue(LinkQueue *Q) {//初始化队列 
	  	(*Q).rear= (*Q).front=(QueuePtr)malloc(sizeof(QNode)) ;
	  	if(!(*Q).front)
	  	exit(-1);
		(*Q).front->next=NULL;
	  }
	  void EnQueue(LinkQueue *Q,QElemType e){//入队操作 
	  	//if(((*Q).rear+1)%MAXQSIZE==(*Q).front)
	  	//exit(-1);
	  	QueuePtr p;
	    (p)=(QueuePtr)malloc(sizeof(QNode)) ;
	  	
		  p->data=e;
		  p->next=NULL;
		  (*Q).rear->next=p;
		  (*Q).rear=p;
	  }
	  void DeQueue(LinkQueue *Q,QElemType *e){//出队操作 
	  //	if((*Q).front==(*Q).rear)
	  //	exit(-1);
	  QueuePtr p;
	  	if((*Q).front==(*Q).rear)
	  	exit(-1);
	  	p=(*Q).front->next;
	  	(*e)=p->data;
	  	(*Q).front->next=p->next;
	  	if((*Q).rear==p){
	  		(*Q).rear=(*Q).front;
	  		free(p);
		  }
	  }
	  int QueueEmpty(LinkQueue Q){//判断队列是否为空 
	  	if((Q).front==(Q).rear)
	  	return 1;
	  	return 0;
	  }
void CreateG(Mgraph &G,int kind)             //创建图  
{  
    int i,j;  
  
    printf("Construct the Graph...\n");  
    if(kind ==1){

    G.vexnum=8;  
    G.arcnum=9; 
	G.kind= AG;
}else{
	G.vexnum=8;  
    G.arcnum=12; 
	G.kind= DG;
	
}
  
    for(i=0;i<MAX_VERTEX_NUM;i++)    //邻接矩阵的初始化  
    {  
        for(j=0;j<MAX_VERTEX_NUM;j++)  
        {  
            G.arcs[i][j].adj=0;  
            G.arcs[i][j].info=NULL;  
        }  
    }  
  
    G.vexs[0]='a';                //顶点赋值  
    G.vexs[1]='b';  
    G.vexs[2]='c';  
    G.vexs[3]='d';  
    G.vexs[4]='e';  
    G.vexs[5]='f';  
    G.vexs[6]='g';  
    G.vexs[7]='h';  
	  if(kind ==1){
    G.arcs[0][1].adj=1;             //邻接矩阵赋值  
    G.arcs[0][1].info=NULL;  
    
    G.arcs[1][0].adj=1;  
    G.arcs[1][0].info=NULL;  
  
    G.arcs[1][3].adj=1;  
    G.arcs[1][3].info=NULL;  
    G.arcs[3][1].adj=1;  
    G.arcs[3][1].info=NULL;  
  
    G.arcs[3][7].adj=1;  
    G.arcs[3][7].info=NULL;  
    G.arcs[7][3].adj=1;  
    G.arcs[7][3].info=NULL;  
  
    G.arcs[4][7].adj=1;  
    G.arcs[4][7].info=NULL;  
    G.arcs[7][4].adj=1;  
    G.arcs[7][4].info=NULL;  
  
    G.arcs[4][1].adj=1;  
    G.arcs[4][1].info=NULL;  
    G.arcs[1][4].adj=1;  
    G.arcs[1][4].info=NULL;  
  
    G.arcs[0][2].adj=1;  
    G.arcs[0][2].info=NULL;  
    G.arcs[2][0].adj=1;  
    G.arcs[2][0].info=NULL;  
  
    G.arcs[2][5].adj=1;  
    G.arcs[2][5].info=NULL;  
    G.arcs[5][2].adj=1;  
    G.arcs[5][2].info=NULL;  
  
    G.arcs[2][6].adj=1;  
    G.arcs[2][6].info=NULL;  
    G.arcs[6][2].adj=1;  
    G.arcs[6][2].info=NULL;  
  
    G.arcs[5][6].adj=1;  
    G.arcs[5][6].info=NULL;  
    G.arcs[6][5].adj=1;  
    G.arcs[6][5].info=NULL;  
    }else{
    	G.arcs[0][1].adj=1;             //邻接矩阵赋值  
        G.arcs[0][1].info=NULL;  
        G.arcs[0][3].adj=1;             //邻接矩阵赋值  
        G.arcs[0][3].info=NULL;  
        G.arcs[1][2].adj=1;  
        G.arcs[1][2].info=NULL; 
        G.arcs[2][5].adj=1;  
        G.arcs[2][5].info=NULL; 
        G.arcs[2][3].adj=1;  
        G.arcs[2][3].info=NULL; 
        G.arcs[3][4].adj=1;  
        G.arcs[3][4].info=NULL; 
        G.arcs[4][2].adj=1;  
        G.arcs[4][2].info=NULL; 
		G.arcs[4][6].adj=1;  
        G.arcs[4][6].info=NULL; 
        G.arcs[5][4].adj=1;  
        G.arcs[5][4].info=NULL; 
        G.arcs[5][7].adj=1;  
        G.arcs[5][7].info=NULL; 
		G.arcs[6][7].adj=1;  
        G.arcs[6][7].info=NULL;
		G.arcs[7][4].adj=1;  
        G.arcs[7][4].info=NULL; 
 
        
	} 
  
    printf("Construction of Graph OK!\n\n");  
    return;  
}
void ShowAdjMat(Mgraph G)           //邻接矩阵的显示  
{  
    int i,j;  
  
    printf("The adjacent matrix is:\n");  
    for(i=0;i<G.vexnum;i++)  
    {  
        for(j=0;j<G.vexnum;j++)  
        {  
            printf("%d ",G.arcs[i][j].adj);  
        }  
        printf("\n");  
    }  
    printf("\n");  
  
    return;  
}  
int GetNextVertex(Mgraph G,int v)   //获取下一顶点  
{  
    int i;  
  
    for(i=0;i<G.vexnum;i++)  
    {  
        if(G.arcs[v][i].adj==1&& visted[i]==false)  
        {  
            return i;  
        }  
    }  
  
    return -1;  
}  
void DFS(Mgraph G,int v)            //深度优先搜索  
{  
    int i;  
    int nextid;  
  
    printf("%c ",G.vexs[v]);  
    visted[v]=true;  
    while(1)  
    {  
        nextid=GetNextVertex(G,v);  
        if(nextid!=-1 && visted[nextid]==false)  
        {  
            DFS(G,nextid);  
        }  
        else  
        {  
            break;  
        }  
    }  
  
}  
  
void DFSTraverse(Mgraph G)          //深度优先搜索  
{  
    int i;  
  
    printf("The depth first traverse result is:\n");  
    for(i=0;i<G.vexnum;i++)  
    {  
        visted[i]=false;  
    }  
  
    for(i=0;i<G.vexnum;i++)  
    {  
        if(visted[i]!=true)  
        {  
            DFS(G,i);  
        }  
    }  
}  

void BFSTraverse(Mgraph G){
	int v,w,u;
	LinkQueue Q; 
	for(v=0;v<G.vexnum;++v) 
	visted[v]=false;
	InitQueue(&Q); //置空的辅助队列Q
	printf("The depth first traverse result is:\n");  
    for(v=0;v<G.vexnum;++v)
    if(!visted[v]) { //v尚未访问
    visted[v]=true;
	printf("%c ",G.vexs[v]); 
	EnQueue(&Q,v);
	while(!QueueEmpty(Q)) {
		DeQueue(&Q,&u);//队头元素出队并置为u
		for(w=u; w>=0; w=GetNextVertex(G,u))
		if(!visted[w]) { //w为u的尚未访问的邻接顶点
		visted[w]=true;
		printf("%c ",G.vexs[w]); 
		EnQueue(&Q,w);
		}//if
		}//while
		}//if
}






int main()  
{  
    Mgraph G,G2;  
  printf("无向图:\n");
    CreateG(G,1);  
    ShowAdjMat(G);  
    DFSTraverse(G);  
  
    printf("\n\n");
    
    
	printf("有向图:\n");  
     CreateG(G2,2);  
    ShowAdjMat(G2);  
    BFSTraverse(G2);  
  
    printf("\n\n"); 
    system("pause");  
    return 0;  
}  
  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值