图的邻接表搜索

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

//

 

#include "stdafx.h"

typedef struct node* pointer;

const int num = 100;

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

struct node//表结点

{

   int no;

   node *next;

};

 

typedef struct //表头结点

{

   int data;

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

}HeadType;

 

typedef struct

{

   HeadType adjlist[num];

   int n,e;

}lk_graph;

 

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

{

   int i,j;

   pointer p;

   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;

   int queue[num];

   int front,rear;

   front = rear = 0;

   rear = ( rear + 1) % num;

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

   int w;

   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);

   return 0;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值