图的建立及BFS,DFS遍历

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define MAX 20   //图可以存储的最大节点数为20;
struct tnode
{
	struct tnode * next;//指向下一个临节点
	int data;//存放邻节点在数组中的位置
};
struct node
{
	int valu;//存放节点的值
	struct tnode * link;//指向邻节点
};
struct picture
{
	struct node nd[MAX];	//声明一个节点数组
	int count;	//图中的节点数
	char a;	//建立的图的类型
};
struct picture * createpicture();
int search(struct picture *p,int value);//查找value在nd数组中的位置
void bfs(struct picture * q,int i,int visit[]); //广度优先遍历
void dfs(struct picture * q,int i,int visit[]);//深度优先遍历
void traversedfs(struct picture *p);
void traversebfs(struct picture *p);
int main()
{
	char a;
	struct picture *p;
	p=createpicture();
	while(1)
	{
		getchar();
		printf("现在将对图进行遍历,若使用广度优先遍历,请输入a,若使用深度优先遍历请输入b,清屏请输入c,退出请输入d:\n");
		scanf("%c",&a);
		if(a=='a')
		{
		printf("深度优先遍历如下:\n");
		traversebfs(p);
		}
		if(a=='b')
		{
		printf("广度优先遍历如下:\n");
		traversedfs(p);
		}
		if(a=='c')
		system("cls");
		if(a=='d')
		exit(0);
	}
	return 0;
}
struct picture * createpicture()
{
	int i,j,k,l;//l中存放返回的节点在数组中的位置
	char a;
	struct picture *p;
	p=(struct picture *)malloc(sizeof(struct picture));
	struct tnode * t;
	printf("请输入你要建立的图中的节点数以及图的类型(a表示无向图b表示有向图):\n");
	scanf("%d %c",&i,&a);
	p->count=i;
	p->a=a;
	printf("请依次输入各节点的值(每输完一个节点的值按回车结束):\n");
	for(i=0;i<p->count;i++)
	{
		scanf("%d",&j);
		p->nd[i].valu=j;
		p->nd[i].link=NULL;
	}
	for(i=0;i<p->count;i++)
	{
		printf("输入与数据值为%d的节点相邻的节点的数据值(每输完一个节点的值按回车结束),若不再含有相邻的值请输入-1\n",p->nd[i].valu);
		while(1)
		{
			scanf("%d",&k);
			if(k==-1)
				break;
			l=search(p,k);
			if(l!=-1)
			{
				t=(struct tnode *)malloc(sizeof(struct tnode));
				t->data=l;
				t->next=p->nd[i].link;
				p->nd[i].link=t;
			}
			else
				printf("无此数据值!\n");
			//getchar();
		}
	}
	return p;
}
int search(struct picture *p,int value)
{
	int i;
	for(i=0;i<p->count;i++)
	{
		if(value==p->nd[i].valu)
		{
			return i;
		}
	}
	return -1;
}
void traversedfs(struct picture *p)
{
	int i;
	int visit[MAX];//申明一个标志数组,将其初始值置为0,0表示该节点未被访问过,1表示该节点被访问过
	for(i=0;i<p->count;i++)
	{
		visit[i]=0;
	}
	for(i=0;i<p->count;i++)
	{
		if(visit[i]==0)
		{
			dfs(p,i,visit);
		}
	}
	//getchar();
}
void dfs(struct picture * q,int i,int visit[])//i表示数组的下标值visit的下标与p中的下标是一一对应的关系
{
	struct tnode * w;
	printf("%d\n",q->nd[i].valu);
	visit[i]=1;
	w=q->nd[i].link;
	while(w!=NULL)
	{
		if(visit[w->data]==0)
		{
			dfs(q,w->data,visit);
		}
		else
		{
			w=w->next;
		}
	}	
}
void traversebfs(struct picture *p)
{
	int i;
	int visit[MAX];//申明一个标志数组,将其初始值置为0,0表示该节点未被访问过,1表示该节点被访问过
	for(i=0;i<p->count;i++)
	{
		visit[i]=0;
	}
	for(i=0;i<p->count;i++)
	{
		if(visit[i]==0)
		{
			bfs(p,i,visit);
		}
	}
	//getchar();
}
void bfs(struct picture * q,int i,int visit[])
{
	struct tnode *w;
	int a[MAX];//声明一个队列
	int f,r;
	int v;
	f=r=0;
	visit[i]=1;
	printf("%d\n",q->nd[i].valu);
	a[r]=i;
	r++;//进行入队操作
	while(f!=r)
	{
		v=a[f];
		f++;//岀队操作
		w=q->nd[v].link;
		while(w!=NULL)
		{
			if(visit[w->data]==0)
			{
			visit[w->data]=1;
			printf("%d\n",q->nd[w->data].valu);
			a[r]=w->data;
			r++;
			}
			w=w->next;
		}
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值