• 图的深度优先搜索 皇星客栈


    这个写法我认为精简

    View Code
     1 #include<stdio.h>
     2 #include<malloc.h>
     3 #include<stdlib.h>
     4 
     5 typedef struct node
     6 {
     7     int vertex;
     8     struct node *nextnode;
     9 }*graph,Linknode;
    10 
    11 struct node head[9];
    12 int visited[9];
    13 
    14 void creategraph( int *node,int num )
    15 {
    16     graph newnode;
    17     graph ptr;
    18     int from;
    19     int to;
    20     int i;
    21     
    22     for( i=0; i<num; i++ )
    23     {
    24         from = node[i*2];
    25         to = node[i*2+1];
    26         
    27         newnode = ( graph ) malloc( sizeof( Linknode ) );
    28         newnode -> vertex = to;
    29         newnode -> nextnode = NULL;
    30         
    31         ptr = &(head[from]);
    32         while( ptr->nextnode!=NULL )
    33             ptr = ptr -> nextnode;
    34         ptr->nextnode = newnode;
    35     }
    36 }
    37         
    38 void DFS ( int current )
    39 {
    40     graph ptr;
    41     visited[current] = 1;
    42     printf("顶点[%d] ",current);
    43      ptr = head[current].nextnode;
    44     while( ptr!=NULL )
    45     {
    46         if( visited[ptr->vertex]!=1 )
    47             DFS(ptr->vertex);
    48         ptr = ptr -> nextnode;
    49     }    
    50 }    
    51     
    52 int main( )
    53 {
    54     graph ptr;    
    55     int i;
    56     
    57     int node[20][2]={                                                        
    58        {1,2},{2,1},
    59        {1,3},{3,1},
    60        {2,4},{4,2},
    61        {2,5},{5,2},
    62        {3,6},{6,3},
    63        {3,7},{7,3},
    64        {4,8},{8,4},
    65        {5,8},{8,5},
    66        {6,8},{8,6},
    67        {7,8},{8,7}  
    68     };
    69 
    70     for( i=1; i<=8; i++ )
    71     {
    72         head[i].vertex = i;
    73         head[i].nextnode = NULL;
    74         visited[i] = 0;
    75     }
    76     
    77     creategraph(*node,20);
    78     
    79     printf("图的邻接表内容:\n");
    80     for( i=1; i<=8; i++ )
    81     {
    82         ptr = head[i].nextnode;
    83         printf("[%d]:",i);
    84         while( ptr != NULL )
    85         {
    86             printf("%d ",ptr->vertex);
    87             ptr=ptr->nextnode;
    88         }
    89         printf("\n");
    90     }
    91     printf("\n深度优先搜索遍历的结果为:\n");     
    92     DFS( 1 );
    93     printf("\n\n");
    94     system("pause");
    95     return 0;    
    96 }

     这个写法比较粗糙

    View Code
     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<malloc.h>
     4 
     5 typedef int  VertexType;
     6 #define MAX_VERTEX_NUM 20
     7 
     8 typedef struct ArcNode{
     9     int                data;
    10     struct ArcNode *nextarc;
    11 }ArcNode;
    12 
    13 typedef struct VNode{
    14     VertexType data;
    15     ArcNode *fistarc;
    16 }VNode,AdjList[MAX_VERTEX_NUM];
    17 
    18 typedef struct{
    19     AdjList vertices;
    20     int vexnum,arcnum;
    21 }ALGraph;
    22 
    23 typedef enum{FALSE,TRUE} Boolean;
    24 Boolean visited[MAX_VERTEX_NUM];
    25 
    26 void CreatALGraph( ALGraph *G )
    27 {
    28     int i;
    29     int j;
    30     int k;
    31     ArcNode *S;
    32     printf("请输入顶点数和边数:\n");
    33     scanf("%d %d",&G->vexnum,&G->arcnum);
    34     printf("请输入定点编号:\n"); 
    35     for( i=1; i<=G->vexnum; i++ )
    36     {
    37         scanf("%d",&G->vertices[i].data);
    38         G->vertices[i].fistarc = NULL;
    39     }
    40     printf("请输入由两个顶点构成的边,如(0,1)\n");
    41     for( k=0; k<G->arcnum; k++ )
    42     {
    43         scanf("%d %d",&i,&j);       
    44         S = (ArcNode *)malloc(sizeof(ArcNode));
    45         S->data = j;
    46         S->nextarc = G->vertices[i].fistarc;
    47         G->vertices[i].fistarc = S;
    48         S = (ArcNode *)malloc(sizeof(ArcNode));
    49         S->data = i;
    50         S->nextarc = G->vertices[j].fistarc;
    51         G->vertices[j].fistarc = S;
    52     }          
    53 }  
    54 
    55 void DFSM( ALGraph *G, int i )
    56 {
    57     ArcNode *p;
    58     printf("%d\n",G->vertices[i].data);
    59     visited[i] = TRUE;
    60     p = G->vertices[i].fistarc;
    61     while( p ) {
    62         if( !visited[p->data] )
    63             DFSM(G,p->data);
    64     p = p->nextarc;
    65   }
    66 }
    67 
    68 void DFS( ALGraph *G )
    69 {
    70     for( int i=1; i<=G->vexnum; i++ )
    71         visited[i] = FALSE;
    72     for( int i=1; i<=G->vexnum; i++ )
    73     {
    74         if( !visited[i])
    75             DFSM(G,i);
    76     }
    77 }    
    78         
    79 int main( )
    80 {
    81     ALGraph *G;
    82     G = (ALGraph *)malloc(sizeof(ALGraph));
    83     CreatALGraph(G);
    84     printf("遍历的结果与构造的顺序有关!\n");
    85     DFS(G);
    86     system("pause");
    87     return 0;
    88 }
  • 相关阅读:
    git
    HTML5 新增语义化标签
    vue directive 常用指令
    JS 数组 数组迭代方法 map, forEach, filter, some, every,
    图片居中
    进度条
    移动页面 REM自适应
    轮播图基本样式
    webpack3.0
    关于码云中项目提交的问题
  • 原文地址:https://www.cnblogs.com/huangxingkezhan/p/2730211.html
Copyright © 2020-2023  润新知