对于图的遍历的四种问题

图建立,输入示例:
input the number for vexnum and arcnum:8 9

input8char for vexs(use -enter- to change):a
b
c
d
e
f
g
h

input9arc(char -enter- char -enter- weigh):
0:a
b
11

1:a
c
11

2:b
d
11

3:b
e
11

4:d
h
23

5:e
h
11

6:c
f
11

7:c
g
11

8:f
g
11

遍历建立的矩阵:
88 11 11 88 88 88 88 88
11 88 88 11 11 88 88 88
11 88 88 88 88 11 11 88
88 11 88 88 88 88 88 23
88 11 88 88 88 88 88 11
88 88 11 88 88 88 11 88
88 88 11 88 88 11 88 88
88 88 88 23 11 88 88 88
遍历的结果:
a
b
d
h
e
c
f
g
(邻接矩阵图深度遍历结果)

实际图形示例:
                                                                
                                a

                      b                    c

              d            e          f ------g

                      h 
                  (其他是上下连起)
代码:


邻接表图的广度遍历



#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>

#define INFINITY INT_MAX
#define MAX_VERTEX_NUM 20

#define MAXQSIZE 10 //最大队列长度
#define FALSE  0
#define TRUE  1

typedef int VRType;
typedef char VertexType;
typedef int Status;
typedef int  QElemType; 

typedef struct
{
 QElemType *base;
 int  front;
 int  rear;
} SqQueue;

typedef struct ArcNode
{
 int adjvex;
 struct ArcNode *nextarc;
}ArcNode;

typedef struct VNode
{
 VertexType data;
 ArcNode *firstarc;
}VNode, AdjList[MAX_VERTEX_NUM];

typedef struct
{
 AdjList vertices;
 int vexnum, arcnum;
}ALGraph;

bool visited[MAX_VERTEX_NUM];
Status (*VisitFunc)(int v);
int w;

void CreateGraph(ALGraph &G);
void BFSTraverse(ALGraph G, Status (*Visit)(int v));
Status printGraph(int v);
int FirstAdjVex(ALGraph G, int v);
int NextAdjVex(ALGraph G, int v, int w);

Status InitQueue(SqQueue &);
Status EnQueue(SqQueue &, QElemType);
Status DeQueue(SqQueue &, QElemType &);
Status  QueueEmpty(SqQueue);


void main( void )
{

 int i;
 ALGraph G;
 ArcNode *p;
 
 CreateGraph(G);

 for(i= 0; i < G.vexnum; i++)
 {
  cout<<i<<"   "<<G.vertices[i].data;
  p = G.vertices[i].firstarc;
  while(p != NULL)
  {
   cout<<"--->";
   cout<<(G.vertices[p->adjvex].data);
   p = p->nextarc;   
  }
  cout<<endl;
 }
 BFSTraverse(G, printGraph);
}
void CreateGraph(ALGraph &G)
{
 int i, j = 0, k = 0;
 char hand, tide;
 ArcNode *p;
 
 cout<<"input the number for vexnum and arcnum:";
 cin>>G.vexnum>>G.arcnum;
 cout<<endl;
 cout<<"input"<<G.vexnum<<"char for vexs:";
 for(i=0; i < G.vexnum; i++)
  cin>>G.vertices[i].data;
 cout<<endl;
 for(i=0;i<G.vexnum;++i)
  G.vertices[i].firstarc=NULL;
 cout<<"input"<<G.arcnum<<"arc(char-enter-char):"<<endl;
 j = 0;
 k = 0;
 for(i=0; i < G.arcnum; i++)
 {
  cout<<i<<":";
  cin>>hand;
  cin>>tide;
  while (hand != G.vertices[j].data)
   j++;
  while (tide != G.vertices[k].data)
   k++;
  p=new ArcNode;
  p->adjvex=j;
  p->nextarc=G.vertices[j].firstarc;
  G.vertices[k].firstarc=p;
  p=new ArcNode;
  p->adjvex=k;
  p->nextarc=G.vertices[j].firstarc;
  G.vertices[j].firstarc=p;
  
  j = 0;
  k = 0;
  cout<<endl;
 }
}

void BFSTraverse(ALGraph G, Status (*Visit)(int v))
{
 SqQueue  Q;
 QElemType   u;

 InitQueue(Q);

 for(int v=0; v < G.vexnum;++v)
  visited[v]=FALSE;
 for(v=0; v<G.vexnum;++v)
  if(!visited[v])
  {
   visited[v]=TRUE;
   EnQueue(Q, v);
   Visit(v);
   while(QueueEmpty(Q))
   {
    DeQueue(Q, u);
    for(w = FirstAdjVex(G, u); w; w = NextAdjVex(G, u, w))
     if(! visited[w])
     {
      visited[w]=TRUE;
      Visit(w);
      EnQueue(Q, w);
     }
   }
  }
}

int FirstAdjVex(ALGraph G, int v)
{
 ArcNode *p;
 p = G.vertices[v].firstarc;
 while(p != NULL)
 {
  if(visited[p->adjvex] != 1)
   return p->adjvex;
  p = p->nextarc;
 }
 return 0;
}

int NextAdjVex(ALGraph G, int v, int w)
{
 ArcNode *p;
 p = G.vertices[v].firstarc;
 while(p != NULL)
 {
  if(visited[p->adjvex] != 1 && p->adjvex != w)
   return p->adjvex;
  p = p->nextarc;
 }
 return 0;
}

Status printGraph(int v)
{
 printf("%c", v + 'a');
 cout<<endl;
 return 1;
}

Status InitQueue(SqQueue & queue)
{
 queue.base = (QElemType *) malloc(MAXQSIZE * sizeof(QElemType));
 
 if (!queue.base)
  return FALSE;
 queue.front = queue.rear = 0;

 return TRUE;
}

///
//
// 函数名       : EnQueue
// 功能描述     : 插入元素到队列
// 参数         : SqQueue &queue
// 参数         : QElemType element
// 返回值       : Status
//
///
Status EnQueue(SqQueue &queue, QElemType element)
{
 //先判断是不是没满的队列
 if ((queue.rear + 1)  % MAXQSIZE == queue.front)
  return FALSE;
 queue.base[queue.rear] = element;

 queue.rear = (queue.rear + 1) % MAXQSIZE;

 return TRUE;
}


///
//
// 函数名       : DeQueue
// 功能描述     : 删除队列的头结点
// 参数         : SqQueue &queue
// 参数         : QElemType &element
// 返回值       : Status
//
///
Status DeQueue(SqQueue &queue, QElemType &element)
{
 //判断队列是不是空的
 if (queue.front == queue.rear)
  return FALSE;
 element = queue.base[queue.front];
 queue.front = (queue.front + 1) % MAXQSIZE;
 
 return TRUE;
}

Status  QueueEmpty(SqQueue queue)
{
 if (queue.front == queue.rear)
  return FALSE;
 else
  return TRUE;

}


邻接表图的深度遍历

#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>

#define INFINITY INT_MAX
#define MAX_VERTEX_NUM 20

typedef int VRType;
typedef char VertexType;
typedef int Status;


typedef struct ArcNode
{
 int adjvex;
 struct ArcNode *nextarc;
}ArcNode;

typedef struct VNode
{
 VertexType data;
 ArcNode *firstarc;
}VNode, AdjList[MAX_VERTEX_NUM];

typedef struct
{
 AdjList vertices;
 int vexnum, arcnum;
}ALGraph;

bool visited[MAX_VERTEX_NUM];
Status (*VisitFunc)(int v);
int w;

void CreateGraph(ALGraph &G);
void DFSTraverse(ALGraph G, Status (*Visit)(int v));
Status printGraph(int v);
int FirstAdjVex(ALGraph G, int v);
int NextAdjVex(ALGraph G, int v, int w);
void DFS(ALGraph G, int v);


void main( void )
{

 int i;
 ALGraph G;
 ArcNode *p;
 
 CreateGraph(G);

 for(i= 0; i < G.vexnum; i++)
 {
  cout<<i<<"   "<<G.vertices[i].data;
  p = G.vertices[i].firstarc;
  while(p != NULL)
  {
   cout<<"--->";
   cout<<(G.vertices[p->adjvex].data);
   p = p->nextarc;   
  }
  cout<<endl;
 }
 DFSTraverse(G, printGraph);
}
void CreateGraph(ALGraph &G)
{
 int i, j = 0, k = 0;
 char hand, tide;
 ArcNode *p;
 
 cout<<"input the number for vexnum and arcnum:";
 cin>>G.vexnum>>G.arcnum;
 cout<<endl;
 cout<<"input"<<G.vexnum<<"char for vexs:";
 for(i=0; i < G.vexnum; i++)
  cin>>G.vertices[i].data;
 cout<<endl;
 for(i=0;i<G.vexnum;++i)
  G.vertices[i].firstarc=NULL;
 cout<<"input"<<G.arcnum<<"arc(char-enter-char):"<<endl;
 j = 0;
 k = 0;
 for(i=0; i < G.arcnum; i++)
 {
  cout<<i<<":";
  cin>>hand;
  cin>>tide;
  while (hand != G.vertices[j].data)
   j++;
  while (tide != G.vertices[k].data)
   k++;
  p=new ArcNode;
  p->adjvex=j;
  p->nextarc=G.vertices[j].firstarc;
  G.vertices[k].firstarc=p;
  p=new ArcNode;
  p->adjvex=k;
  p->nextarc=G.vertices[j].firstarc;
  G.vertices[j].firstarc=p;
  
  j = 0;
  k = 0;
  cout<<endl;
 }
}

void DFSTraverse(ALGraph G, Status (*Visit)(int v))
{
 int j;
 VisitFunc = Visit;
 for( j=0; j<G.vexnum; j++)
  visited[j] = 0;
 for(j=0; j<G.vexnum; j++)
  if(!visited[j])
   DFS(G, j);
}

void DFS(ALGraph G, int v)
{
 
 visited[v]=1;
 VisitFunc(v);
 for(w=FirstAdjVex(G, v); w; w=NextAdjVex(G, v, w))
  if(!visited[w])
   DFS(G, w);
}

int FirstAdjVex(ALGraph G, int v)
{
 ArcNode *p;
 p = G.vertices[v].firstarc;
 while(p != NULL)
 {
  if(visited[p->adjvex] != 1)
   return p->adjvex;
  p = p->nextarc;
 }
 return 0;
}

int NextAdjVex(ALGraph G, int v, int w)
{
 ArcNode *p;
 p = G.vertices[v].firstarc;
 while(p != NULL)
 {
  if(visited[p->adjvex] != 1 && p->adjvex != w)
   return p->adjvex;
  p = p->nextarc;
 }
 return 0;
}

Status printGraph(int v)
{
 printf("%c", v + 'a');
 cout<<endl;
 return 1;
}


邻接矩阵的广度遍历

#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>

#define INFINITY INT_MAX
#define MAX_VERTEX_NUM 20

#define MAXQSIZE 10 //最大队列长度
#define FALSE  0
#define TRUE  1

typedef int VRType;
typedef int InfoType;
typedef char VertexType;
typedef int Status;
typedef int  QElemType; 

typedef struct
{
 QElemType *base;
 int  front;
 int  rear;
} SqQueue;

typedef struct ArcCell
{
 VRType adj;
 InfoType *info;
}ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct
{
 VertexType vexs[MAX_VERTEX_NUM];
 AdjMatrix arcs;
 int vexnum, arcnum;
}MGraph;

bool visited[MAX_VERTEX_NUM];
Status (*VisitFunc)(int v);
int w;

void CreateGraph(MGraph &G);
void BFSTraverse(MGraph G, Status (*Visit)(int v));
Status printGraph(int v);
int FirstAdjVex(MGraph G, int v);
int NextAdjVex(MGraph G, int v, int w);

Status InitQueue(SqQueue &);
Status EnQueue(SqQueue &, QElemType);
Status DeQueue(SqQueue &, QElemType &);
Status  QueueEmpty(SqQueue);

void main( void )
{
 int i, j;
 MGraph G;
 
 CreateGraph(G);
 for(i = 0; i < G.vexnum; i++)
 {
  for(j = 0; j < G.vexnum; j++)
  {
   cout<<G.arcs[i][j].adj;
   cout<<" ";
  }
  cout<<endl;
 }
 BFSTraverse(G, printGraph);
}
void CreateGraph(MGraph &G)
{
 int weigh;
 int i, j = 0, k = 0;
 char hand, tide;
 
 cout<<"input the number for vexnum and arcnum:";
 cin>>G.vexnum>>G.arcnum;

 for(i = 0; i < G.vexnum; i++)
 {
  for(j = 0; j < G.vexnum; j++)
   G.arcs[i][j].adj = 88;
 }

 cout<<endl;
 cout<<"input"<<G.vexnum<<"char for vexs(use -enter- to change):";
 for(i=0; i < G.vexnum; i++)
  cin>>G.vexs[i];
 cout<<endl;
 cout<<"input"<<G.arcnum<<"arc(char -enter- char -enter- weigh):"<<endl;
 j = 0;
 k = 0;
 for(i=0; i < G.arcnum; i++)
 {
  cout<<i<<":";
  cin>>hand;
  cin>>tide;
  cin>>weigh;
  while (hand != G.vexs[j])
   j++;
  while (tide != G.vexs[k])
   k++;
  G.arcs[j][k].adj = weigh;
  G.arcs[k][j].adj = weigh;
  j = 0;
  k = 0;
  cout<<endl;
 }
}

void BFSTraverse(MGraph G, Status (*Visit)(int v))
{

 SqQueue  Q;
 QElemType   u;

 InitQueue(Q);

 for(int v=0; v < G.vexnum;++v)
  visited[v]=FALSE;
 for(v=0; v<G.vexnum;++v)
  if(!visited[v])
  {
   visited[v]=TRUE;
   Visit(v);
   EnQueue(Q, v);
   while(QueueEmpty(Q))
   {
    DeQueue(Q, u);
    for(w = FirstAdjVex(G, u); w; w = NextAdjVex(G, u, w))
     if(! visited[w])
     {
      visited[w]=TRUE;
      Visit(w);
      EnQueue(Q, w);
     }
   }
  }
}

int FirstAdjVex(MGraph G, int v)
{
 int j;
 for(j = 0; j < G.vexnum; j++)
 {
  if(G.arcs[v][j].adj != 88 && visited[j] != 1)
   return j;
 }
 return 0;
}

int NextAdjVex(MGraph G, int v, int w)
{
 int j;
 for(j = 0; j < G.vexnum; j++)
 {
  if(G.arcs[v][j].adj != 88 && j != w && visited[j] != 1)
   return j;
 }
 return 0;
}

Status printGraph(int v)
{
 printf("%c", v + 'a');
 cout<<endl;
 return 1;
}

Status InitQueue(SqQueue & queue)
{
 queue.base = (QElemType *) malloc(MAXQSIZE * sizeof(QElemType));
 
 if (!queue.base)
  return FALSE;
 queue.front = queue.rear = 0;

 return TRUE;
}

///
//
// 函数名       : EnQueue
// 功能描述     : 插入元素到队列
// 参数         : SqQueue &queue
// 参数         : QElemType element
// 返回值       : Status
//
///
Status EnQueue(SqQueue &queue, QElemType element)
{
 //先判断是不是没满的队列
 if ((queue.rear + 1)  % MAXQSIZE == queue.front)
  return FALSE;
 queue.base[queue.rear] = element;

 queue.rear = (queue.rear + 1) % MAXQSIZE;

 return TRUE;
}


///
//
// 函数名       : DeQueue
// 功能描述     : 删除队列的头结点
// 参数         : SqQueue &queue
// 参数         : QElemType &element
// 返回值       : Status
//
///
Status DeQueue(SqQueue &queue, QElemType &element)
{
 //判断队列是不是空的
 if (queue.front == queue.rear)
  return FALSE;
 element = queue.base[queue.front];
 queue.front = (queue.front + 1) % MAXQSIZE;
 
 return TRUE;
}

Status  QueueEmpty(SqQueue queue)
{
 if (queue.front == queue.rear)
  return FALSE;
 else
  return TRUE;

}


邻接矩阵的深度遍历

#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>

#define INFINITY INT_MAX
#define MAX_VERTEX_NUM 20

typedef int VRType;
typedef int InfoType;
typedef char VertexType;
typedef int Status;

typedef struct ArcCell
{
 VRType adj;
 InfoType *info;
}ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct
{
 VertexType vexs[MAX_VERTEX_NUM];
 AdjMatrix arcs;
 int vexnum, arcnum;
}MGraph;

bool visited[MAX_VERTEX_NUM];
Status (*VisitFunc)(int v);
int w;

void CreateGraph(MGraph &G);
void DFSTraverse(MGraph G, Status (*Visit)(int v));
Status printGraph(int v);
int FirstAdjVex(MGraph G, int v);
int NextAdjVex(MGraph G, int v, int w);
void DFS(MGraph G, int v);

void main( void )
{
 int i, j;
 MGraph G;
 
 CreateGraph(G);
 for(i = 0; i < G.vexnum; i++)
 {
  for(j = 0; j < G.vexnum; j++)
  {
   cout<<G.arcs[i][j].adj;
   cout<<" ";
  }
  cout<<endl;
 }
 DFSTraverse(G, printGraph);
}
void CreateGraph(MGraph &G)
{
 int weigh;
 int i, j = 0, k = 0;
 char hand, tide;
 
 cout<<"input the number for vexnum and arcnum:";
 cin>>G.vexnum>>G.arcnum;

 for(i = 0; i < G.vexnum; i++)
 {
  for(j = 0; j < G.vexnum; j++)
   G.arcs[i][j].adj = 88;
 }

 cout<<endl;
 cout<<"input"<<G.vexnum<<"char for vexs(use -enter- to change):";
 for(i=0; i < G.vexnum; i++)
  cin>>G.vexs[i];
 cout<<endl;
 cout<<"input"<<G.arcnum<<"arc(char -enter- char -enter- weigh):"<<endl;
 j = 0;
 k = 0;
 for(i=0; i < G.arcnum; i++)
 {
  cout<<i<<":";
  cin>>hand;
  cin>>tide;
  cin>>weigh;
  while (hand != G.vexs[j])
   j++;
  while (tide != G.vexs[k])
   k++;
  G.arcs[j][k].adj = weigh;
  G.arcs[k][j].adj = weigh;
  j = 0;
  k = 0;
  cout<<endl;
 }
}

void DFSTraverse(MGraph G, Status (*Visit)(int v))
{
 int j;
 VisitFunc = Visit;
 for( j=0; j<G.vexnum; j++)
  visited[j] = 0;
 for(j=0; j<G.vexnum; j++)
  if(!visited[j])
   DFS(G, j);
}

void DFS(MGraph G, int v)
{

 visited[v]=1;
 VisitFunc(v);
 for(w=FirstAdjVex(G, v); w; w=NextAdjVex(G, v, w))
  if(!visited[w])
   DFS(G, w);
}

int FirstAdjVex(MGraph G, int v)
{
 int j;
 for(j = 0; j < G.vexnum; j++)
 {
  if(G.arcs[v][j].adj != 88 && visited[j] != 1)
   return j;
 }
 return 0;
}

int NextAdjVex(MGraph G, int v, int w)
{
 int j;
 for(j = 0; j < G.vexnum; j++)
 {
  if(G.arcs[v][j].adj != 88 && j != w && visited[j] != 1)
   return j;
 }
 return 0;
}

Status printGraph(int v)
{
 printf("%c", v + 'a');
 cout<<endl;
 return 1;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值