⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 9-4.c

📁 这个是数据结构经典实现算法
💻 C
字号:
#include "stdio.h"
#define MaxVertexNum 100
typedef int VertexType;
typedef enum{FALSE,TRUE}Boolean;/*FALSE为0,TRUE为1*/
Boolean visited[MaxVertexNum]; /*访问标志向量是全局量*/
typedef   int  datatype;
typedef	 struct	qnode{
	datatype	 data;
	struct 	qnode  *next;
} position;
typedef  struct queue{
		position 	*front;
		position 	*rear;
}queuetype;

typedef struct node{/*边表结点*/
	int adjvex; /*邻接点域*/
	struct node *next; /*链域*/
	/*若要表示边上的权,则应增加一个数据域*/
}EdgeNode;
typedef struct vnode{ /*顶点表结点*/
	VertexType vertex; /*顶点域*/
	EdgeNode *firstedge;/*边表头指针*/
}VertexNode;
typedef VertexNode AdjList[MaxVertexNum];/*AdjList是邻接表类型*/
typedef struct ALGraph{
	AdjList adjlist;/*邻接表*/
	int n,e; /*图中当前顶点数和边数 */
}Graphic; /*对于简单的应用,无须定义此类型,可直接使用AdjList类型。*/

int Dequeue(queuetype *  q)
{
	position* p;
	int data;
	p=q->front;
	q->front=q->front->next;
	data=p->data;
	free(p);
	return data;
}
// 在队列中加入新元素:
void Enqueue(queuetype * q,datatype x)
{
	position* p;
	p=(position*)malloc(sizeof(position*));
	p->data=x;
	p->next=NULL;
	q->rear->next=p;
	q->rear=p;
}
//判断是否为空队列:
int Empty(queuetype * q)
{
	return (q->front==q->rear);
}
void InitQueue(queuetype *Q)
{
	///*队列初始化*/
}
void BFS(Graphic*G,int k)
{/* 以vk为源点对用邻接表表示的图G进行广度优先搜索*/
    int i;
    queuetype Q; /*须将队列定义中DataType改为int*/
    EdgeNode *p;
    InitQueue(&Q);/*队列初始化*/
     /*访问源点vk*/
    printf("visit vertex:%e",G->adjlist[k].vertex);
    visited[k]=TRUE; 
    Enqueue(&Q,k);/*vk已访问,将其人队。(实际上是将其序号人队)*/
    while(!Empty(&Q))
	{  /*队非空则执行*/
        i=Dequeue(&Q); /*相当于vi出队*/
        p=G->adjlist[i].firstedge; //取vi的边表头指针
        while(p){//依次搜索vi的邻接点vj(令p->adjvex=j)
            if(!visited[p->adjvex])
			{ /*若vj未访问过*/
			    printf("visitvertex:%c",G->adjlist[p->adjvex].vertex); 
              /*访问vj*/
               visited[p->adjvex]=TRUE; 
               Enqueue(&Q,p->adjvex);/*访问过的vj人队*/
			}            
            p=p->next;/*找vi的下一邻接点*/
		}      
	} 
}
void CreateGraphic(Graphic *G)
{/*建立无向图的邻接表表示*/
     	int i,j,k;
      	EdgeNode *s;
      	scanf("%d%d",&G->n,&G->e); /*读人顶点数和边数*/
      	for(i=0;i<G->n;i++){/*建立顶点表*/
        	G->adjlist[i].vertex=getchar(); /*读入顶点信息*/
        	G->adjlist[i].firstedge=NULL;/*边表置为空表*/
       	}
      	for(k=0;k<G->e;k++){/*建立边表*/
         	scanf("%d%d",&i,&j);/*读入边(vi,vj)的顶点对序号*/
         	s=(EdgeNode *)malloc(sizeof(EdgeNode)); /*生成边表结点*/
         	s->adjvex=j; /*邻接点序号为j*/
         	s->next=G->adjlist[i].firstedge;
 	        G->adjlist[i].firstedge=s; /*将新结点*s插入顶点vi的边表头部*/
         	s=(EdgeNode *)malloc(sizeof(EdgeNode));
         	s->adjvex=i; /*邻接点序号为i*/
         	s->next=G->adjlist[j].firstedge;
         	G->adjlist[j].firstedge=s; /*将新结点*s插入顶点vj的边表头部*/
        }   
} 
void BFSTraverse(Graphic *G)
{    
	    int i;
    	for(i=0;i<G->n;i++)
      		visited[i]=FALSE; /*标志向量初始化*/
    	for(i=0;i<G->n;i++)
      		if(!visited[i]) /*vi未访问过*/
       BFS(G,i); /*以vi为源点开始DFS搜索*/
}
void main(void)
{
	Graphic Create;
	CreateGraphic(&Create);
	BFSTraverse(&Create);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -