邻接表 有向表 1建一个表头数组[n]存放边表头
2 n个边表头数组存放每个边表信息
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define MAXNODE 100;
#define LEN sizeof(ArcNode)
int vexnum,arcnum; //顶点个数 和弧的个数
struct ArcNode //边表
{
int adjvex; //存邻接点
ArcNode *next;
}; //Arc 英文 弧
typedef struct //顶点表节点
{
int vexdata; //顶点信息
ArcNode *firstarc; //指向头个接点的指针
}VerNode; //vertex 英文 顶点
void CreatAdjList(VerNode G[]) //建立有向图的邻接表存储结构
{
int k,w,i,n,m=0;
printf("输入顶点个数 和信息");
scanf("%d",&n); //输入个数
for(i=1;i<=n;i++)
{ //如果还想加存储数据 可以在这里泻进来
G[i].vexdata=i; //这个i其实就是点的名字 如果要变得话可以在这里改一下
G[i].firstarc=NULL;
}
scanf("%d %d",&k,&w); //输入弧(k w)00结束
while(k!=0&&w!=0)
{ ArcNode *p;
p=(struct ArcNode*)malloc(LEN); //先开一个空间
p->adjvex=w; //给他赋值 相当于第一个空格 用来保存邻接信息
p->next=G[k].firstarc; //这一步和下一步 就是在第K个边表头插一个w节点
G[k].firstarc=p;
m++; //弧的个数+1
scanf("%d %d",&k,&w);
}
vexnum=n;arcnum=m; //n就是节点数 m就是弧长数
}
void PrintAdjList(VerNode G[])
{ int i,n; //n是统计邻接点个数
for( i=1;i<=vexnum;i++)
{ printf("%d:",G[i].vexdata);
n=0;
while(G[i].firstarc!=NULL)
{printf("->%d",G[i].firstarc->adjvex);
G[i].firstarc=G[i].firstarc->next;n++;}
printf(" 邻接点个数是%d\n",n);
}
}
int main()
{
VerNode G[100];
CreatAdjList(G); //建立邻接表
PrintAdjList(G); //打印邻接表
return 0;
}