图的邻接表C语言实现

图的邻接表
#include <stdio.h>
#include <stdlib.h>
#define n 5
typedef struct arcnode
{

int weight;
int yu;
struct arcnode *next;

} arcnode;

typedef struct node//头
{

int rudu;//统计一下入度
struct arcnode *firstnext;

}node;
int m;

void setTu(struct node Tu[])
{

int i,j,k,w;
arcnode *p;
printf("请输入是否有方向(0无 1有):");
scanf("%d",&k);//0or1
for(i=1;i<=n;i++)//初始化
{
	Tu[i].rudu=0;//每个的入度的值为0
	Tu[i].firstnext=NULL;
}
printf("请输入边的集合:");
scanf("%d%d%d",&i,&j,&w);//由i,->j, 权值
while((i>=1)&&(i<=n)&&(j>=1)&&(j<=n))//当输入(0 0 0)跳出
{
	p=Tu[i].firstnext;//把头的指向下一个的指针给p
	while(p!=NULL&&(p->yu!=j))//判断是否加过,防止重复
		p=p->next;
	if(p==NULL)
	{
		p=(arcnode*)malloc(sizeof(arcnode));
		p->yu=j;
		p->weight=w;
		p->next=Tu[i].firstnext;
		Tu[i].firstnext=p;
		++(Tu[i].rudu);
	}
	if(k==0)
	{
		p=(arcnode*)malloc(sizeof(arcnode));
		p->yu=i;
		p->weight=w;
		p->next=Tu[j].firstnext;
		Tu[j].firstnext=p;
		++(Tu[j].rudu);
	}
	printf("请输入i,j,w(若结束输入000)");
	scanf("%d%d%d",&i,&j,&w);
}

}

void split_shen(struct node Tu[],int x)//x是从哪个元素开始
{

int mark[n+1],k;//mark为标记数组
int s[n+1],t;//s是栈数组
arcnode *p;
for(k=1;k<=n;k++)//初始化
	mark[k]=0;
printf("%d",x);//把头的先打印出来
mark[x]=1;//改为1,遍历过了
t=1;s[1]=x;//t是栈的第一个,把x入栈
do
{
	k=s[t];//把他取出来
	p=Tu[k].firstnext;
	while(p&&mark[p->yu])//p不为空,且yu对应的mark不是0
		p=p->next;
	if(p==NULL)//如果p是空的
		t--;//退栈
	else
	{
		x=p->yu;
		printf("%d",x);
		mark[x]=1;
		s[++t]=x;
	}
}while(t);

}

void split_guang(struct node Tu[],int x)//x为头
{

int mark[n+1],k;
int q[n+1],f,r;
arcnode *p;
for(k=1;k<=n;k++)
	mark[k]=0;
printf("%d",x);
mark[x]=1;
f=1;r=2;q[1]=x;//队头的指针为1,队尾的指针为2,把x入队
do
{
	k=q[f];
	f++;
	p=Tu[k].firstnext;
	while (p!=NULL)
	{
		x=p->yu;
		if(mark[x]==0)
		{
			printf("%d",x);
			mark[x]=1;
			q[r]=x;
			r++;
		}
		p=p->next;
	}	

}while(f!=r);

}

void main()
{

struct node Tu[n+1];
setTu(Tu);
printf("rudu:%d\n",Tu[1].rudu);
printf("按照深度遍历的结果是:\n");
split_shen(Tu,1);
printf("\n按照广度遍历的结果是:\n");
split_guang(Tu,1);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值