c语言实现图的广度优先遍历

#include <stdio.h>
#include <stdlib.h>
//定义图的最多有20个顶点 
#define MAX_VERTEX_NUM 20

/*******定义图的顶点**************/ 
struct node{
       char data;
       int flag;//标志位(1:访问过    0:未访问 )
       struct arcNode * firstArcNode;
}; 
struct arcNode{
       int  no; 
       struct arcNode * nextArcNode;
};
/*******定义队列的结构体**********/ 
struct qNode{
       struct node * Node; 
       struct qNode * nextQNode;              
};
struct queue{
       struct qNode * front;
       struct qNode * rear;            
};
/**********方法声明*************/
//图 
void createArcNode(struct node * Node);
void rangeTraverse(struct node arrayList[],int position);
//队列 
struct queue * init();
void inQueue(struct queue * Queue,struct node * Node);
struct node * outQueue(struct queue * Queue);
int isEmpty(struct queue * Queue);
/**********Main函数***********/ 
int main(int argc, char *argv[])
{
    struct node arrayList[MAX_VERTEX_NUM];
    char ch;
    int flag = 1;//标志位,0表示输入结束 
    int position =1;
    struct arcNode * testNode;//测试用弧点 
    printf("输入顶点信息(顶点信息用一个字符表示):\n");
    printf("***输入0表示结束输入***\n");
   
    while(1){
        printf("第%d个顶点的信息为:",position);
        scanf(" %c",&arrayList[position].data);//在%c之前加空格解决把回车符当做输入字符的问题 
        if(arrayList[position].data=='0'){
             break;               
        }
        position +=1;
    } 
      
    for(flag=1;flag<20;flag++){
          if(arrayList[flag].data!='0'){
          printf("\n"); 
           createArcNode(&arrayList[flag]);
          }
          else{  
          break;
          }
    } 
   
    //输出邻接表 
    for(flag=1;flag<20;flag++){
          if(arrayList[flag].data!='0'){
           printf("\n"); 
           testNode = arrayList[flag].firstArcNode;
           printf("%d %c :",flag,arrayList[flag].data);           
           while(1){
                   printf("%d ",testNode->no);
                   if(testNode->nextArcNode==NULL){
                        break; 
                   } 
                   testNode = testNode->nextArcNode; 
           }          
          }
          else{  
          break;
          }       
    }
    printf("\n");
    printf("图建立完毕,按1进行广度优先遍历:");
    scanf("%d",&position);
    if(position==1){
     while(1){
             printf("\n");
             printf("输入开始节点在数组中的位置:");
             scanf("%d",&position);
             rangeTraverse(arrayList,position);     
     }
    }
  system("PAUSE");	
  return 0;
}
/***
**创建顶点间连接关系 
**参数:顶点结构体指针 
**注:参数必须是指针,如果是形参并不能改变原来node中的firstArcNode的值 
***/ 
void createArcNode(struct node * Node){
          int i = 1;
          int position =0;
          struct arcNode * arcNode,* temp,* temp2;
          printf("请输入与顶点%c相连的顶点在数组中的位置:\n",Node->data);
          printf("***输入0表示结束输入***\n");
          while(1){
                  printf("第%d个与顶点%c相连的顶点在数组中的位置:",i++,Node->data);
                  scanf("%d",&position);
                  temp = (struct arcNode *)malloc(sizeof(struct arcNode));
                  if(temp==NULL){
                       printf("内存分配失败!");
                  }
                  if(position==0){
                       arcNode->nextArcNode=NULL;
                       break;
                  }
                  if(i==2){
                      temp->no=position;
                      Node->firstArcNode = temp;
                      arcNode = temp;
                            
                  }
                  else{
                       temp->no=position;
                       arcNode->nextArcNode = temp;
                       arcNode=temp;    
                  }
                   
                  
                //  temp2 = Node.firstArcNode;
                //  printf("%d",temp2->no);
          }           
}
/***
**广度优先遍历 
**参数:顶点数组,开始顶点在数组中的位置 
***/
void rangeTraverse(struct node arrayList[],int position){
     int i;
     struct queue * Queue=init();
     struct node * Node;
     struct arcNode * arcNode;
    //把数组中的顶点全部标记为未访问:falg=0 
    for(i=1;i<20;i++){
          if(arrayList[i].data!='0'){
           arrayList[i].flag=0;         
          }
          else{  
          break;
          }
    }
    inQueue(Queue,&arrayList[position]);
    arrayList[position].flag=1;
    while(isEmpty(Queue)){
          Node = outQueue(Queue);
          printf("%c ",Node->data);          
          arcNode = Node->firstArcNode;        
          
          i=1;
          while(i){
               Node = &arrayList[arcNode->no];               
               if(Node->flag==0){ 
                    Node->flag=1;      
                    inQueue(Queue,Node);
               }
               if(arcNode->nextArcNode==NULL){
                    i=0;
               }   
               arcNode = arcNode->nextArcNode;
               
          } 
    }     
} 
/***
**队列的初始化,入队列,出队列 
***/
struct queue * init(){
    struct queue * Queue = (struct queue *)malloc(sizeof(struct queue));
    struct qNode * QNode = (struct qNode *)malloc(sizeof(struct qNode));
    if(QNode == NULL||Queue == NULL){
         printf("内存分配失败");     
    }
    Queue->front = QNode;
    Queue->rear = QNode;
    return Queue;
}
void inQueue(struct queue * Queue,struct node * Node){
     struct qNode * QNode = (struct qNode *)malloc(sizeof(struct qNode)); 
     if(QNode == NULL){
          printf("内存分配失败");
     }
     QNode->Node = Node;
     QNode->nextQNode = NULL;//队尾元素,指针为空
     Queue->rear->nextQNode = QNode;
     Queue->rear = QNode;    
} 
struct node * outQueue(struct queue * Queue){
     struct node * Node;
     struct qNode * QNode;
    if(Queue->front==Queue->rear){
         printf("队列已空!");     
    }    
    QNode = Queue->front->nextQNode;
    Node = QNode->Node;
    Queue->front->nextQNode = QNode->nextQNode;
    //当队列中最后一个元素被删除后,队列尾指针也丢失了,因此需要对队尾指针重新赋值 
    if(Queue->rear==QNode){
         Queue->rear = Queue->front;
    }
    return Node;
    
}
int isEmpty(struct queue * Queue){
    if(Queue->front==Queue->rear){
         return 0;
    }
    return 1;
}

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/summerCoder/article/details/8856279
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞