图的邻接表
#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);
}