c语言深度优先搜索。代码

Python014

c语言深度优先搜索。代码,第1张

#include <stdlib.h>

#include <stdio.h>

struct node                       /* 图顶点结构定义     */

{

   int vertex                    /* 顶点数据信息       */

   struct node *nextnode         /* 指下一顶点的指标   */

}

typedef struct node *graph       /* 图形的结构新型态   */

struct node head[9]              /* 图形顶点数组       */

int visited[9]                   /* 遍历标记数组       */

/********************根据已有的信息建立邻接表********************/

void creategraph(int node[20][2],int num)/*num指的是图的边数*/

{

   graph newnode                 /*指向新节点的指针定义*/

   graph ptr

   int from                      /* 边的起点          */

   int to                        /* 边的终点          */

   int i

   for ( i = 0 i < num i++ )    /* 读取边线信息,插入邻接表*/

   {

      from = node[i][0]         /*    边线的起点            */

      to = node[i][1]           /*   边线的终点             */

      

   /* 建立新顶点 */

      newnode = ( graph ) malloc(sizeof(struct node))

      newnode->vertex = to        /* 建立顶点内容       */

      newnode->nextnode = NULL    /* 设定指标初值       */

      ptr = &(head[from])         /* 顶点位置           */

      while ( ptr->nextnode != NULL ) /* 遍历至链表尾   */

         ptr = ptr->nextnode     /* 下一个顶点         */

      ptr->nextnode = newnode    /* 插入节点        */

   }

}

/**********************  图的深度优先搜寻法********************/

void dfs(int current)

{

   graph ptr

   visited[current] = 1          /* 记录已遍历过       */

   printf("vertex[%d]\n",current)   /* 输出遍历顶点值     */

   ptr = head[current].nextnode  /* 顶点位置           */

   while ( ptr != NULL )          /* 遍历至链表尾       */

   {

      if ( visited[ptr->vertex] == 0 )  /* 如过没遍历过 */

         dfs(ptr->vertex)              /* 递回遍历呼叫 */

      ptr = ptr->nextnode              /* 下一个顶点   */

   }

}

/****************************** 主程序******************************/

int main()

{

   graph ptr

   int node[20][2] = { {1, 2}, {2, 1},  /* 边线数组     */

                       {1, 3}, {3, 1},

                       {1, 4}, {4, 1},

                       {2, 5}, {5, 2},

                       {2, 6}, {6, 2},

                       {3, 7}, {7, 3},

                       {4, 7}, {4, 4},

                       {5, 8}, {8, 5},

                       {6, 7}, {7, 6},

                       {7, 8}, {8, 7} }

   int i

   //clrscr()

   for ( i = 1 i <= 8 i++ )      /*   顶点数组初始化  */

   {

      head[i].vertex = i         /*    设定顶点值      */

      head[i].nextnode = NULL    /*       指针为空     */

      visited[i] = 0             /* 设定遍历初始标志   */

   }

   creategraph(node,20)          /*    建立邻接表      */

   printf("Content of the gragh's ADlist is:\n")

   for ( i = 1 i <= 8 i++ )

   {

      printf("vertex%d ->",head[i].vertex) /* 顶点值    */

      ptr = head[i].nextnode             /* 顶点位置   */

      while ( ptr != NULL )       /* 遍历至链表尾       */

      {

         printf(" %d ",ptr->vertex)  /* 印出顶点内容   */

         ptr = ptr->nextnode         /* 下一个顶点     */

      }

      printf("\n")               /*   换行             */

   }

   printf("\nThe end of the dfs are:\n")

   dfs(1)                        /* 打印输出遍历过程   */

   printf("\n")                  /* 换行               */

   puts(" Press any key to quit...")

  // getch()

}

(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=0i<ga.vexnumi++)

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=0i<ga.vexnumi++)

{

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

ga.vexs[i].firstarc=NULL

}

for(k=0k<ga.arcnumk++)

{

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=0v<ga.vexnumv++)

visited[v]=0

for(v=LocateVex(ga,name)k!=2v=(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=0v<ga.vexnumv++)

visited[v]=0

InitQueue(Q)

for(v=LocateVex(ga,name)k!=2v=(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")

}

我来做,等等

/*编写无向图的邻接矩阵类AdjMWGraph,实现无向图的广度遍历和深度遍历。

其中,图中顶点数据类型为字符。Input第一行图中顶点的个数n(4<=n<=26)

第二行是图中边的条数m(3<=m<=351) 第三行是顶点信息(全为大写字母)

后面的输入数据是依附于一条边的两个顶点,有多少条边,就输入多少组信息。

注意:根结点都为A;并且所给字符连续,也就是说A B C D ……。

Output广度优先搜索序列。 深度优先搜索序列。

Sample Input

7

6

A B C D E F G

A B

A C

B D

B E

C F

C G

Sample Output

A B C D E F G

A B D E C F G

*/

#include <stdio.h>#include <stdlib.h>

unsigned char arrMap[26][26] = {0}

int nV = 0

void deep_prior_scan(int j)

void spread_prior_scan(int j)

void GetResult()

{

int nL = 0//存储边数

int i

char arrV[26] = {0}

char temp, pairV[2]

//输入过程

printf("\n请输入顶点数:")

scanf("%d", &nV)

printf("\n请输入边数:")

scanf("%d", &nL)

printf("\n请依次输入顶点:\n")

for (i = 0, temp = 'A'i <nV)

{

temp = getchar()

if (temp >= 'A' &&temp <= 'Z')

{

arrV[i++] = temp

}

}

printf("\n请依次输入边:\n")

for (i = 0i <nL*2)

{

temp = getchar()

if (temp >= 'A' &&temp <= 'Z')

{

pairV[i%2] = temp

if (i%2 == 1)

{

arrMap[pairV[0] - 'A'][pairV[1] - 'A'] = 1

}

++i

}

}

//printf("\n广度优先遍历:\n")

//spread_prior_scan(0)

//printf("\n")

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

deep_prior_scan(0)

printf("\n")

}

int main()

{

GetResult()

system("pause")

return 0

}

void deep_prior_scan(int j)

{

int i

printf("%c ", j + 'A')

for (i = 0i <nVi++)

{

if (arrMap[j][i] != 0)

{

arrMap[j][i] = 0

deep_prior_scan(i)

}

}

}

void spread_prior_scan(int j)

{

int i

if (j == 0)

{

printf("\nA ")

}

if (j >= 26)

{

printf("\nj=%d\n", j)

}

for (i = 0i <nVi++)

{

if (arrMap[j][i] != 0)

{

printf("%c ", i + 'A')

}

}

for (i = 0i <nVi++)

{

if (arrMap[j][i] != 0)

{

arrMap[j][i] = 0

spread_prior_scan(i)

}

}

}

因为懒得复制数组,所以两种遍历方法要分开运行,你可以通过打开和关闭对相应函数的注释来得到两次的结果