数据结构7-关于“图”的生成与操作的实例

程序实现用邻接表存储的形式创建一棵无向图,应用深度优先搜索的方法遍历图中各点,并打印出数据,代码如下所示:

#include"stdio.h"

typedef struct ArcNode{
	/*单链表中的结点的类型*/
	int adjvex; /*该边指向的顶点在顺序表中的位置*/
	struct ArcNode *next; /*下一条边*/
}ArcNode;

typedef struct VNode{
	/*顶点类型*/
	int data; /*顶点中的数据信息*/
	ArcNode *firstarc; /*指向单链表,即指向第一条边*/
}VNode;

int visited[5]={0,0,0,0,0};

CreatGraph(int n,VNode G[]){
	int i,e;
	ArcNode *p,*q;
	printf("Input the information of the vertex\n");
	for(i=0;i<n;i++){
		scanf("%d",&G[i]);
		G[i].firstarc = NULL; /*初始化第一条边为空*/
	}
	for(i=0;i<n;i++){
		printf("Creat the edges for the %dth vertex\n",i);
		scanf("%d",&e);
		while(e!=-1){
			p = (ArcNode *)malloc(sizeof(ArcNode)); /*创建一条边*/
			p->next = NULL;
			p->adjvex = e;
			if(G[i].firstarc == NULL)
				G[i].firstarc = p; /*i结点的第一条边*/
			else
				q->next = p; /*下一条边*/
			q = p;
			scanf("%d",&e);
		}
	}
}

int FirstAdj(VNode G[],int v){
	if(G[v].firstarc != NULL)
		return (G[v].firstarc)->adjvex;
	return -1;
}

int NextAdj(VNode G[],int v){
	ArcNode *p;
	p=G[v].firstarc;
	while(p!=NULL){
		if(visited[p->adjvex])
			p=p->next;
		else
			return p->adjvex;
	}
	return -1;
}

void DFS(VNode G[],int v){
	int w;
	printf("%d ",G[v]); /*访问当前顶点,打印出该顶点中的数据信息*/
	visited[v]=1; /*将顶点v对应的访问标记置1*/
	w=FirstAdj(G,v); /*找到顶点v的第一个邻接点,如果无邻接点,返回-1*/
	while(w != -1){
		if(visited[w] == 0) /*该顶点未被访问*/
			DFS(G,w); /*递归地进行深度优先搜索*/
		w = NextAdj(G,v); /*找到顶点v的下一个邻接点,如果无邻接点,返回-1*/
	}
}

main(){
	VNode G[5];
	CreatGraph(5,G);
	DFS(G,0);
	getche();
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值