图的邻接表搜索

来源:互联网 发布:淘宝低于5元不计销量 编辑:程序博客网 时间:2024/06/07 04:49

// 图的链接表存储.cpp :定义控制台应用程序的入口点。

//

 

#include "stdafx.h"

typedef struct node* pointer;

const int num = 100;

int visited[num];//访问标志数组

struct node//表结点

{

   intno;

   node*next;

};

 

typedef struct //表头结点

{

   intdata;

   pointerfirst;//指向链表中第一个结点

}HeadType;

 

typedef struct

{

   HeadTypeadjlist[num];

   intn,e;

}lk_graph;

 

void create(lk_graph *g)//无向图邻接表的实现

{

   inti,j;

   pointerp;

  cout<<"请输入顶点数和边数:";

  cin>>g->n>>g->e;

  cout<<"请输入顶点编号:";

   for (int i =0; i < g->n; i++)//这里实现的是读入顶点,建立顶点表

   {

     cin>>g->adjlist[i].data;

     g->adjlist[i].first = NULL;

   }

  

   for(int k =0; k < g->e; k++)

   {

     cout<<"请输入第"<<k + 1<<"对顶点对:";

     //首先让第i个表中链接顶点j

     cin>>i>>j;

     p = new node;

     p->no = j;

     p->next = g->adjlist[i].first;

     g->adjlist[i].first = p;

 

     //然后让第j个表中链接顶点i

     p = new node;

     p->no = i;

     p->next = g->adjlist[j].first;

     g->adjlist[j].first = p;

     cout<<endl;

   }

}

 

void display(lk_graph* g)//输出图结构

{

   for (int i =0; i < g->n; i++)

   {

     cout<<i;

     node *p = g->adjlist[i].first;//找到一个表,把它的邻接点全部书出来

     while (p != NULL)

     {

       cout<<"->"<<p->no;

       p = p->next;

     }

     cout<<endl;

   }

  

}

 

void DFS(lk_graph *g,int v)//从编号为v的结点深度搜索

{

   node*p;

   visited[v] =1;

  cout<<v<<" ";

   p =g->adjlist[v].first;//指向顶点弧的第一条弧的弧头结点

   while(p !=NULL)

   {

     if(visited[p->no] == 0)//如果下一个链接的v顶点没被访问过

     {

       DFS(g,p->no);//往下访问下一个链接的v顶点

     }

       p = p->next;//访问顶点v的下一条弧

   }

  

}

 

void BFS(lk_graph* g, int v)//从编号为v的结点广度搜索

{

   for (int i =0; i < g->n; i++)

   {

     visited[i] = 0;//访问之前所有结点初始化没访问

   }

  cout<<v<<" ";//访问当前结点

   visited[v] =1;

   intqueue[num];

   intfront,rear;

   front = rear= 0;

   rear = ( rear+ 1) % num;

   queue[rear] =v;//将当前结点进队;

   intw;

   node*p;

   while(front!= rear)

   {

     front = (front + 1) % num;

     w = queue[front];

     p = g->adjlist[w].first;

     while(p != NULL)

     {

       if(visited[p->no] == 0)//若邻接点没被访问

       {

          cout<<p->no<<" ";

          visited[p->no] = 1;//设置当前结点已经被访问

          rear = (rear + 1) % num;

          queue[rear] = p->no;//将当前结点入队

       }

       p = p->next;//搜索下一个邻接结点

     }

   }

  cout<<endl;

}

 

int _tmain(int argc, _TCHAR* argv[])

{

  //cout<<"ddd"<<endl;

   lk_graph *g =new lk_graph;

  create(g);

  cout<<"图的结构为:"<<endl;

  display(g);

  cout<<"图的广度搜索为"<<endl;

  BFS(g,0);

   for (int i =0; i < g->n; i++)//恢复原状

   {

     visited[i] = 0;

   }

  cout<<"深度搜索顺序为:"<<endl;

  DFS(g,0);

   return0;

}

 

原创粉丝点击