本周学习的代码(数构 深度 广度 优先遍历)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了本周学习的代码(数构 深度 广度 优先遍历)相关的知识,希望对你有一定的参考价值。

深度优先遍历代码:

 

#include "stdafx.h"

#include <stdio.h>

#include <string.h>

#define MVNum 100          //最大顶点数 

typedef int InfoType;              //边的权值类型

typedef char*  VexType;          //顶点数据类型

typedef struct LinkNode{     //边结点 

    int adjvex;          //该边所指向的顶点的位置 

    struct LinkNode * next;   //指向下一条边的指针 

    InfoType info;       //和边相关的信息 

}LinkNode; 

typedef struct VexNode{ 

    VexType data;                 //顶点信息 

    LinkNode * firstadj;       //指向第一条依附该顶点的边的指针 

}VexNode ; // VexNode 表示邻接表类型 

typedef struct{ 

    VexNode adjlist[MVNum];        //邻接表 

    int vexnum, arcnum;        //图的当前顶点数和边数

} AdjList;//,AdjGraph;

 

int visited[MVNum];//初始为零,表示此顶点尚未访问

void DFS(AdjList *pg,int i){

int j;

   visited[i]=1;//设置顶点已访问标志

   printf("%s ",pg->adjlist[i].data);//输出顶点数据

   LinkNode *pnode=pg->adjlist[i].firstadj;//取该顶点的连接的边

   while(pnode!=NULL) 

   {   j=pnode->adjvex;//取该顶点相邻的顶点

       pnode=pnode->next;//取该顶点的下一个连接的边

   if(visited[j]==1)//该顶点是否已访问

    continue;//已访问

   DFS(pg,j);//未访问,递归调用访问其邻接顶点

   }

}

int main(int argc, char* argv[])
{ printf(" 邻接表存储结构的深度优先搜索算法\\n");
AdjList ag; //无向图
ag.vexnum=9;
ag.adjlist[0].data="V0";
ag.adjlist[1].data="V1"; ag.adjlist[2].data="V2";
ag.adjlist[3].data="V3"; ag.adjlist[4].data="V4";
ag.adjlist[5].data="V5"; ag.adjlist[6].data="V6";
ag.adjlist[7].data="V7"; ag.adjlist[8].data="V8";
int v0=0,v1=1,v2=2,v3=3,v4=4,v5=5,v6=6,v7=7,v8=8;
LinkNode v12={v2,NULL},v21={v1,NULL}, v13={v3,NULL},v31={v1,NULL},
v24={v4,NULL},v42={v2,NULL},v25={v5,NULL},v52={v2,NULL},
v37={v7,NULL},v73={v3,NULL},v36={v6,NULL},v63={v3,NULL},
v48={v8,NULL},v84={v4,NULL},v58={v8,NULL},v85={v5,NULL},
v67={v7,NULL},v76={v6,NULL};
ag.adjlist[v0].firstadj=NULL; ag.adjlist[v1].firstadj=&v12;
ag.adjlist[v2].firstadj=&v21; ag.adjlist[v3].firstadj=&v31;
ag.adjlist[v4].firstadj=&v42; ag.adjlist[v5].firstadj=&v52;
ag.adjlist[v6].firstadj=&v63; ag.adjlist[v7].firstadj=&v73;
ag.adjlist[v8].firstadj=&v84;
v12.next=&v13;
v21.next=&v24; v24.next=&v25;
v31.next=&v36; v36.next=&v37;
v42.next=&v48; v52.next=&v58;
v63.next=&v67; v73.next=&v76;
v84.next=&v85;
BFSTraverse(&ag,4); // DFSTraverse(&ag,4);

AdjList ag2; //有向图
ag2.vexnum=9;
ag2.adjlist[0].data="V0";
ag2.adjlist[1].data="V1"; ag2.adjlist[2].data="V2";
ag2.adjlist[3].data="V3"; ag2.adjlist[4].data="V4";
ag2.adjlist[5].data="V5"; ag2.adjlist[6].data="V6";
ag2.adjlist[7].data="V7"; ag2.adjlist[8].data="V8";
LinkNode vv12={v2,NULL} ,vv13={v3,NULL}, vv24={v4,NULL}, vv36={v6,NULL},
vv48={v8,NULL}, vv67={v7,NULL}, vv85={v5,NULL};
ag2.adjlist[v0].firstadj=NULL;
ag2.adjlist[v1].firstadj=&vv12; ag2.adjlist[v2].firstadj=&vv24;
ag2.adjlist[v3].firstadj=&vv36; ag2.adjlist[v4].firstadj=&vv48;
ag2.adjlist[v5].firstadj=NULL; ag2.adjlist[v6].firstadj=&vv67;
ag2.adjlist[v7].firstadj=NULL; ag2.adjlist[v8].firstadj=&vv85;
vv12.next=&vv13;
BFSTraverse(&ag2,4);//DFSTraverse(&ag2,4);
return 0;
}

 

void DFSTraverse(AdjList *pg,int k){ //从第k个顶点开始遍历

    int i;

for(i=0;i<pg->vexnum;i++)

 visited[i]=0; //初始设置每个顶点尚未访问

i=k;

while(1){

  if( visited[i]==0)  //i个顶点已访问否

    DFS(pg,i); //未访问,则访问此顶点

    i++;     //访问下一个顶点   

if(i>=pg->vexnum)  //到达数组尾部,则从零开始,继续访问

{ i=0;

}

 if(i==k) break;  //回到原来顶点位置,则访问结束

}

   printf("\\n");

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

广度优先遍历代码:

// Graph广度_邻接表.cpp : Defines the entry point for the console application.

//

 

#include "stdafx.h"

 

#include "stdafx.h"

#include <stdio.h>

#define MVNum 100          //最大顶点数 

typedef int InfoType;              //边的权值类型

typedef char* VexType;          //顶点数据类型

//#define char[10] VexType;       //顶点数据类型

typedef struct LinkNode{     //边结点 

    int adjvex;          //该边所指向的顶点的位置 

    struct LinkNode * next;   //指向下一条边的指针 

    InfoType info;       //和边相关的信息 

}LinkNode; 

typedef struct VexNode{ 

    VexType data;                 //顶点信息 

    LinkNode * firstadj;       //指向第一条依附该顶点的边的指针 

}VexNode ; // VexNode 表示邻接表类型 

typedef struct{ 

    VexNode adjlist[MVNum];        //邻接表 

    int vexnum, arcnum;        //图的当前顶点数和边数

} AdjList;//,AdjGraph;

/****************************************/

#define MAX_QUEUE MVNum        /* 队列的最大数据元素数目 */

typedef  int  Elemtype;

typedef struct queue             /* 假设当数组只剩下一个单元时认为队满 */

{

    Elemtype elem[MAX_QUEUE];  /* 存放队列中数据元素的存储单元 */

    int front,rear;                  /* 队头指针、队尾指针 */

}QUEUE;

//1)初始化队列Q

void InitQueue(QUEUE *Q)

{ Q->front=0;

  Q->rear=0;

}

//5)判断队列Q是否为空

int QueueEmpty(QUEUE Q)

{

    if(Q.front==Q.rear) return 1;//头指针相同,表示队列为空

    else return 0;

}

//2)入队

void EnQueue(QUEUE *Q,Elemtype elem)

{ if((Q->rear+1)%MAX_QUEUE==Q->front)//判断队列是否已满,

       printf("Queue is full.\\n");// 已满,则不能入队,推出

  else { Q->elem[Q->rear]=elem; //未满,数据入队

     Q->rear=(Q->rear+1)%MAX_QUEUE; //队尾指针加一

          

  }

}

//3)出队

Elemtype DeQueue(QUEUE*Q)

{   Elemtype e=-1;

if(QueueEmpty(*Q)) printf("Queue is empty.\\n");//队列为空,不能出对,

    else 

    {

        e=Q->elem[Q->front]; //队列不为空,要删除的数据保存到elem

Q->front=(Q->front+1)%MAX_QUEUE;//队头针加一

    }

return e;

}

int visited[MVNum];

void BFS(AdjList *pg,int i){

int j,k;

QUEUE q;

   InitQueue(&q);//初始化队列

   visited[i]=1;//设置此顶点已被访问

   printf("%s ",pg->adjlist[i].data);//输出此顶点数据

   EnQueue(&q,i);//此顶点入对

   LinkNode *pnode;

   while(!QueueEmpty(q)){//队列为空则结束

   k=DeQueue(&q); //顶点数据出对

       pnode=pg->adjlist[k].firstadj;//获取此顶点的边

       while(pnode!=NULL) 

   {   j=pnode->adjvex;//获取当前顶点的相邻顶点

       if(visited[j]==0) //此相邻顶点已访问否

   { visited[j]=1; //未访问,置为已访问

             printf("%s ",pg->adjlist[j]);//输出相邻顶点的数据

     EnQueue(&q,j);//相邻顶点入队

   }

            pnode=pnode->next;//获取与当前顶点连接的边

   }

   } 

}

 

void BFSTraverse(AdjList *pg,int k){//从第K个顶点开始访问

    int i;

for(i=0;i<pg->vexnum;i++)

 visited[i]=0;//初始设置每个顶点尚未访问

i=k;

while(1){

  if( visited[i]==0)//第i个顶点已访问否

    BFS(pg,i);//未访问,则访问此顶点

    i++;//访问下一个顶点       

if(i>=pg->vexnum) //到达数组尾部,则从零开始,继续访问

{

i=0;

}

 if(i==k) break; //回到原来顶点位置,则访问结束

}

    printf("\\n");

}

int main(int argc, char* argv[])
{ printf("邻接表存储结构的广度优先搜索算法\\n");
AdjList ag; //无向图
ag.vexnum=9;
ag.adjlist[0].data="V0";
ag.adjlist[1].data="V1"; ag.adjlist[2].data="V2";
ag.adjlist[3].data="V3"; ag.adjlist[4].data="V4";
ag.adjlist[5].data="V5"; ag.adjlist[6].data="V6";
ag.adjlist[7].data="V7"; ag.adjlist[8].data="V8";
int v0=0,v1=1,v2=2,v3=3,v4=4,v5=5,v6=6,v7=7,v8=8;
LinkNode v12={v2,NULL},v21={v1,NULL}, v13={v3,NULL},v31={v1,NULL},
v24={v4,NULL},v42={v2,NULL},v25={v5,NULL},v52={v2,NULL},
v37={v7,NULL},v73={v3,NULL},v36={v6,NULL},v63={v3,NULL},
v48={v8,NULL},v84={v4,NULL},v58={v8,NULL},v85={v5,NULL},
v67={v7,NULL},v76={v6,NULL};
ag.adjlist[v0].firstadj=NULL; ag.adjlist[v1].firstadj=&v12;
ag.adjlist[v2].firstadj=&v21; ag.adjlist[v3].firstadj=&v31;
ag.adjlist[v4].firstadj=&v42; ag.adjlist[v5].firstadj=&v52;
ag.adjlist[v6].firstadj=&v63; ag.adjlist[v7].firstadj=&v73;
ag.adjlist[v8].firstadj=&v84;
v12.next=&v13;
v21.next=&v24; v24.next=&v25;
v31.next=&v36; v36.next=&v37;
v42.next=&v48; v52.next=&v58;
v63.next=&v67; v73.next=&v76;
v84.next=&v85;
DFSTraverse(&ag,4); // DFSTraverse(&ag,4);

AdjList ag2; //有向图
ag2.vexnum=9;
ag2.adjlist[0].data="V0";
ag2.adjlist[1].data="V1"; ag2.adjlist[2].data="V2";
ag2.adjlist[3].data="V3"; ag2.adjlist[4].data="V4";
ag2.adjlist[5].data="V5"; ag2.adjlist[6].data="V6";
ag2.adjlist[7].data="V7"; ag2.adjlist[8].data="V8";
LinkNode vv12={v2,NULL} ,vv13={v3,NULL}, vv24={v4,NULL}, vv36={v6,NULL},
vv48={v8,NULL}, vv67={v7,NULL}, vv85={v5,NULL};
ag2.adjlist[v0].firstadj=NULL;
ag2.adjlist[v1].firstadj=&vv12; ag2.adjlist[v2].firstadj=&vv24;
ag2.adjlist[v3].firstadj=&vv36; ag2.adjlist[v4].firstadj=&vv48;
ag2.adjlist[v5].firstadj=NULL; ag2.adjlist[v6].firstadj=&vv67;
ag2.adjlist[v7].firstadj=NULL; ag2.adjlist[v8].firstadj=&vv85;
vv12.next=&vv13;
DFSTraverse(&ag2,4);//DFSTraverse(&ag2,4);
return 0;
}

 

 

技术分享

 

实在不得不说有时候真的会给代码弄晕,指来指去,今天上机课硬是没打代码打完整

 

以上是关于本周学习的代码(数构 深度 广度 优先遍历)的主要内容,如果未能解决你的问题,请参考以下文章

数据结构学习笔记——图的遍历(深度优先搜索和广度优先搜索)

数据结构—深度优先遍历广度优先遍历图遍历算法的应用

数据结构学习笔记——图的遍历算法(深度优先搜索和广度优先搜索)

数据结构学习笔记——图的遍历算法(深度优先搜索和广度优先搜索)

PHP数据结构-图的遍历:深度优先与广度优先

c语言图的遍历,邻接表存储,深度,广度优先遍历