小小陌上花开

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
#include<stdio.h>
#include<malloc.h>
#define MAX_VERTEX_NUM 10
typedef char VertexType;
typedef struct ArcNode//
{
       int adjvex;
       struct ArcNode *nextarc;
       int info;
}ArcNode;  //表结点类型
typedef struct VNode//顶点 
{
       VertexType data;
       ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX_NUM]; //头结点

typedef struct
{
       AdjList vertices;  //邻接表
       int vexnum,arcnum;
}ALGraph;
//设置一个全局的数组遍历
int visited[MAX_VERTEX_NUM]={0};//访问过设置为1,未访问完设置为0 

//定义队列 
typedef struct node  //队列节点 
{  
    int  vNode;  
    struct node *Next;  
}Node;    
typedef struct Q
{
        struct node *front;
        struct node *end;
}Queue;


////获取边的位置 
int Locate(ALGraph *G, char vex)
{
 int i=0;
 for(;i<G->vexnum;i++)
   if(vex==G->vertices[i].data)
   break;
 return i;
}
 
//建立邻接表(无向图的邻接表)
ALGraph *CreateALGraph(ALGraph *G)
{
  G=(ALGraph*)malloc(sizeof(ALGraph));
  printf("输入图的顶点数:\n");
  scanf("%d",&G->vexnum); 
  
  printf("输入图的边数:\n");
  scanf("%d",&G->arcnum); 
  printf("输入顶点的数据:\n");
  int i;
  for(i=0;i<G->vexnum;i++)
  {
    printf("第%d次输入\n",i);
    printf("好奇葩\n");
    fflush(stdin);
    scanf("%c",&G->vertices[i].data);
    G->vertices[i].firstarc=NULL;
  
  } 
  printf("输入边:\n");
  char vex1,vex2;
  ArcNode *p,*q; 
  int in,out;
  for(i=0;i<G->arcnum;i++)
  {
   printf("输入弧%d(顶点1,顶点2)",i);
   fflush(stdin);//清空缓冲区,避免对后面数据的影响 
   scanf("%c%c",&vex1,&vex2);//输入一条弧的始点和终点
   in =Locate(G,vex1);
   out =Locate(G,vex2);
   printf("%c,%c",vex1,vex2);
   p=(ArcNode *)malloc(sizeof(ArcNode));
   p->adjvex=out;
   p->nextarc=NULL;
   //从头部插入节点
   p->nextarc=G->vertices[in].firstarc;
   G->vertices[in].firstarc=p;
   
   //如果在这里也赋值的话,说明是无向图,此时需要重新设置值
    q=(ArcNode *)malloc(sizeof(ArcNode)); 
    q->adjvex=in; 
    q->nextarc=NULL;
    q->nextarc=G->vertices[out].firstarc;
    G->vertices[out].firstarc=q;
   //给弧赋予权值
   fflush(stdin);//清空缓冲区,避免对后面数据的影响 
   printf("给弧赋予权值!\n");
   int index;
   scanf("%d",&index);
   p->info=index;
   q->info=index;
  }
  return G; 

} 
//测试一下
void Test(ALGraph *G)
{
   int i=0;
   printf("输出顶点的参数值\n");
   for(;i<G->vexnum;i++)
   {
     printf("%c\n",G->vertices[i].data);
   } 

}
void DFS(ALGraph *G,int v)
{
  printf("%c",G->vertices[v].data);
  visited[v]=1;
  ArcNode *p=G->vertices[v].firstarc; 
  for(;p!=NULL;p=p->nextarc)
    if(visited[p->adjvex]==0) DFS(G,p->adjvex);
} 
//深度遍历图
void DFSTraverse(ALGraph *G)
{
     int i=0;
    for(;i<G->vexnum;i++)
      if(visited[i]==0)
         DFS(G,i); 
}

//广度遍历图(借助于队列实现) 
Queue* InitQueue(Queue *q)
{
  q=(Queue *)malloc(sizeof(Queue)); 
  Node *front = (Node *)malloc(sizeof(Node));  
  q->front=q->end=front;
  q->front->Next=NULL;
  q->front->vNode=0;//用于存放节点的个数 
  return q;

}
void Traverse(Queue *q)
{
 int i=0; 
 Node *p=q->front->Next;
 for(;i<q->front->vNode;i++)
 {
  printf("%d\n",p->vNode);
 
 }

}
void EnQueue(Queue *q,int vNode)
{
//  printf("进队列开始:\n");
  Node *node=(Node*)malloc(sizeof(Node));
  node->vNode=vNode;
  q->end->Next=node;
  node->Next=NULL; 
//  printf("%d\n",q->end->Next->vNode); 
  q->end=node;
  q->front->vNode++;
 // printf("%d\n",q->end->vNode); 
 // printf("进队列结束:\n"); 
//  printf("遍历一下队列:\n");
 // Traverse(q);  
}

int DeQueue(Queue *q)
{
  int vNode=q->front->Next->vNode;
 // printf("%d出队列\n",q->front->Next->vNode);
  Node *p=q->front->Next;
  if(q->end==q->front->Next)
  {
   q->end=q->front; 
  }
  q->front->Next=q->front->Next->Next;
  free(p);
  q->front->vNode--;
 // printf("%d出队列\n",vNode);
  return vNode;
}/*
bool QueueEmpty(Queue *q)
{
  if(q->front->vNode==0)
      return false;
  else
      return true;

}*/
void BFSTraverse(ALGraph *G)
{
  Queue *q;
  ArcNode *p;
  int u;
   
 //初始化队列
 q=InitQueue(q);
 int v=0;
 for(;v<G->vexnum;v++)
 {
  visited[v]=0;
 }
 for(v=0;v<G->vexnum;v++)//v尚未访问 
 {
   if(visited[v]==0)
   {
     printf("%c",G->vertices[v].data);
     visited[v]=1; 
     EnQueue(q,v);//入队 
     while(q->front->vNode!=0)//不为空的话 
     {
       u=DeQueue(q);
       p=G->vertices[u].firstarc; 
       for(;p!=NULL;p=p->nextarc)
        if(visited[p->adjvex]==0) 
        {
          printf("%c",G->vertices[p->adjvex].data);
          visited[p->adjvex]=1;
        //  printf("输出位置:%d\n",p->adjvex);
          EnQueue(q,p->adjvex);
          //Traverse(q);
        }            
     } 
   }
 } 

}

int main()
{
   //创建图,并将其保存到邻接表中 
   ALGraph *G; 
   G=CreateALGraph(G); 
   //测试一下是否有问题
   Test(G); 
   //广度优先遍历图
   printf("深度优先遍历的结果如下:");
   DFSTraverse(G); 
   printf("\n");
   printf("广度优先遍历的结果如下:");
   BFSTraverse(G); 
   system("pause");

} 

开发环境:dev-c++,保存为:.c

posted on 2014-06-06 18:53  小小陌上花开  阅读(486)  评论(0编辑  收藏  举报