图及其应用

2.(必做题)设计并验证如下算法:带权图采用邻接表表示,实现无向图的广度优先搜索与有向图的深度优先搜索。
#define MAX_VERTEX_NUM 20 //图的邻接表存储表示
typedef struct ArcNode{
int adjvex; //该弧所指向的顶点的位置
struct ArcNode *nextarc; //指向下一条弧的指针
InfoType *info; //该弧相关信息的指针
}ArcNode;
typedef struct VNode {
VertexType data; //顶点信息
ArcNode *firstarc; //指向第一条依附该顶点弧的指针
}VNode,AdjList[MAX_VERTEX_NUM]
Typedef struct {
AdjList vertices;
int vexnum,arcnum; //图的当前顶点数和弧数
int kind; //图的种类标志
}ALGraph;

#include"stdio.h" 
#include"stdlib.h"
#include"Q.h"
#define MaxVex 255 
#define TRUE   1  
#define FALSE  0
#define maxsize 10 
bool visited[MaxVex]; 
typedef char elemtype;  
typedef int Status;
typedef struct LoopQueue
{ 
    int data[MaxVex];
    int front,rear;
}LoopQueue,*Queue; 
void initQueue(Queue &Q)
{
    Q->front=Q->rear=0;
}
Status QueueEmpty(Queue &Q)
{
    if(Q->front == Q->rear)
	{return TRUE;}
	else
	{return FALSE;}
}
Status QueueFull(Queue &Q)
{
    if((Q->rear+1)%MaxVex == Q->front)
	{return TRUE;}
	else
	{return FALSE;}
}
void EnQueue(Queue &Q,int e)
{
    if(!QueueFull(Q))
	{
        Q->data[Q->rear] = e;
        Q->rear = (Q->rear+1)%MaxVex;
    }
}
void DeQueue(Queue &Q,int *e)
{
    if(!QueueEmpty(Q))
	{
        *e = Q->data[Q->front];  
        Q->front = (Q->front+1)%MaxVex;
    }
}
Status locatevex(graph g,elemtype v)
 {
      int i;
      for(i=0;i<g.n;i++)
      if(g.vexlist[i].data==v)return i;
      return -1;
  }
void print(graph g)
 {
      int i;
      edgenode *p;
      printf("图的邻接表表示:\n");
      for(i=0;i<g.n;i++)
	  {
         printf("\n%4c",g.vexlist[i].data);
         p=g.vexlist[i].firstedge;
         while(p!=NULL)
		 {
             printf("-->%d",p->adjvex);p=p->next;
         }
      }
      printf("\n");
  }
void creategraphW(graph *g)
{
      int i,j,k;
      elemtype v1,v2;
      edgenode *s;
      printf("请输入无向图的顶点数及边数\n");
      printf("顶点数 n=");scanf("%d",&g->n);
      printf("边  数 e=");scanf("%d",&g->e);
      printf("请输入无向图的顶点信息:\n");getchar();
      for(i=0;i<=g->n;i++)
	  {
          scanf("%c",&g->vexlist[i].data); 
          g->vexlist[i].firstedge=NULL;
      }
      printf("请输入无向图的边的信息:\n");
      for(k=0;k<g->e;k++)
      {
          printf("请输入第%d条边的两个端点下标:",k+1);
          scanf("%c%c",&v1,&v2);getchar();
          i=locatevex(*g,v1);
          j=locatevex(*g,v2);
          if(i>=0&&j>=0)
		  {
          s=(edgenode *)malloc(sizeof(edgenode));
          s->adjvex=j;
          s->next=g->vexlist[i].firstedge;
          g->vexlist[i].firstedge=s;
          s=(edgenode *)malloc(sizeof(edgenode));
          s->adjvex=i;
          s->next=g->vexlist[j].firstedge;
          g->vexlist[j].firstedge=s;    
          }
      }
}
void creategraphY(graph *g)
{
      int i,j,k;
      elemtype v1,v2;
      edgenode *s;
      printf("请输入有向图的顶点数及边数\n");
      printf("顶点数 n=");scanf("%d",&g->n);
      printf("边  数 e=");scanf("%d",&g->e);
      printf("请输入有向图的顶点信息:\n");getchar();
      for(i=0;i<=g->n;i++)
	  {
         scanf("%c",&g->vexlist[i].data); 
         g->vexlist[i].firstedge=NULL;
      }
      printf("请输入有向图的边的信息:\n");
      for(k=0;k<g->e;k++)
      {
          printf("请输入第%d条边的两个端点下标:",k+1);
          scanf("%c%c",&v1,&v2);getchar();
          i=locatevex(*g,v1);
          j=locatevex(*g,v2);
          if(i>=0&&j>=0)
		  {
              s=(edgenode *)malloc(sizeof(edgenode));
              s->adjvex=j;
              s->next=g->vexlist[i].firstedge;
              g->vexlist[i].firstedge=s;
          }
      }
 }
void DFS(graph g,int i)
{
      edgenode *p;
      printf("%3c",g.vexlist[i].data);
      visited[i]=1;
      p=g.vexlist[i].firstedge;
      while(p!=NULL)
	  {
         if(visited[p->adjvex]==0)
         DFS(g,p->adjvex);
         p=p->next;
      }
}
void DFStraverse(graph  g)
{
     int v;
     for (v=0; v<g.n;v++)visited[v]=0; 
     for  (v=0; v<g.n;v++) 
     if (!visited[v])DFS(g,v);        
 }
void BFSTraverse(graph g)
{  
    int i;  
    Queue Q = (Queue)malloc(sizeof(LoopQueue));  
    for (i=0; i<g.n; ++i)
	{  
        visited[i] = FALSE; 
    } 
    initQueue(Q);  
    for (i=0; i<g.n; ++i)
	{  
        if(!visited[i])
		{  
            visited[i] = TRUE;  
            printf("%c ", g.vexlist[i].data);  
            EnQueue(Q, i);  
            while (!QueueEmpty(Q))
			{  
                DeQueue(Q, &i);  
                edgenode *p = g.vexlist[i].firstedge;  
                while (p)
				{  
                    if (!visited[p->adjvex])
					{  
                        visited[p->adjvex] = TRUE;  
                        printf("%c ", g.vexlist[p->adjvex].data);  
                        EnQueue(Q, p->adjvex);  
                    }  
                    p = p->next;  
                }
            }
        }  
    }    
}
/*.h*/
#include"stdio.h" 
#include"stdlib.h"
#define queuesize 100
#define MaxVex 255 
#define queuesize 100
#define TRUE   1  
#define FALSE  0
#define maxsize 10 
typedef char elemtype;  
typedef int Status;
typedef struct edgenode
{
    int adjvex;
    struct edgenode *next;
    int weight;
}edgenode;
typedef struct vexnode 
{
    elemtype data; 
    edgenode *firstedge;
}vexnode;
typedef struct 
{
    vexnode vexlist[maxsize];
    int n,e;
}graph;
/*main*/
#include"stdio.h" 
#include"stdlib.h"
#include"Q.h"
void creategraphW(graph *g);
void creategraphY(graph *g);
void DFStraverse(graph  g);
void BFSTraverse(graph g);
void print(graph g);
int main()
{  
	graph g;
    creategraphW(&g); 
    printf("\n无向图的广度优先遍历为: ");
    BFSTraverse(g);
	print(g);
	creategraphY(&g);
	printf("有向图的深度优先遍历序列:\n");
    DFStraverse(g);
	print(g);
    printf("\n");
    return 0;
} 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值