图的邻接表存储完整代码
- 建立邻接表
- 计算各顶点的入读出度总度
- 计算权值最大的边
- 打印邻边
- 主函数
- 实现代码
- 程序样例
建立邻接表
void CreateALGraph(ALGraph *G,ALGraph *G2)
{
int i,j,k,qz;
EdgeNode *s,*d;
printf("请输入顶点数:");
scanf("%d",&(G->n));G2->n=G->n;
printf("请输入边数:");
scanf("%d",&(G->e));G2->e=G->e;
printf("-------------------------------------\n");
printf("请输入顶点信息(输入格式为:<回车>顶点号,顶点):\n");
for(i=0;i<G->n;i++)
{
printf("请输入第%d个顶点的信息:",i+1);
scanf("\n%d,%c",&(G->adjlist[i].vertex),&G->a[i]);
G->adjlist[i].firstedge=NULL;
G2->adjlist[i].vertex=G->adjlist[i].vertex;
G2->a[i]=G->a[i];
G2->adjlist[i].firstedge=NULL;
}
printf("-------------------------------------\n");
printf("请输入边表的信息(输入格式为:i,j,权重):\n");
for(k=0;k<G->e;k++)
{
printf("请输入第%d个边表的信息:",k+1);
scanf("%d,%d,%d",&i,&j,&qz);
s=(EdgeNode *)malloc(sizeof(EdgeNode));
s->adjvex=j;
s->next=G->adjlist[i].firstedge;
s->info=qz;
G->adjlist[i].firstedge=s;
d=(EdgeNode *)malloc(sizeof(EdgeNode));
d->adjvex=i;
d->next=G2->adjlist[j].firstedge;
G2->adjlist[j].firstedge=d;
}
printf("邻接表方式存储图建立成功\n\n");
printf("-------------------------------------\n");
}
计算各顶点的入读出度总度
void Degree(ALGraph *G,ALGraph *G2)
{
int i;
for(i=0;i<G->n;i++)
{
int outnum=0;
int innum=0;
struct node *q,*p;
q=G->adjlist[i].firstedge;
while(q!=NULL)
{
outnum++;q=q->next;
}
p=G2->adjlist[i].firstedge;
while(p!=NULL)
{
innum++;p=p->next;
}
printf("%c顶点的出度是%d\n",G->a[i],outnum);
printf("%c顶点的入度是%d\n",G->a[i],innum);
printf("%c顶点的总度是%d\n\n",G->a[i],outnum+innum);
}
printf("顶点度输出完毕\n\n");
printf("-------------------------------------\n");
}
计算权值最大的边
void Weights(ALGraph *G)
{
int i,maxi=0,max=0,maxj=0;
struct node *q;
for(i=0;i<G->n;i++)
{
q=G->adjlist[i].firstedge;
while(q!=NULL)
{
if(max<G->adjlist[i].firstedge->info)
{
maxi=i;
maxj=G->adjlist[i].firstedge->adjvex;
max=G->adjlist[i].firstedge->info;
}
q=q->next;
}
}
printf("\n权值最大的边是:%c--->%c 权值为%d\n",G->a[maxi],G->a[maxj],max);
printf("\n");
}
打印邻边
void Print(ALGraph *G)
{
struct node *q;
int i,j,k,cnt,t;
int b[10];
for(i=0;i<G->n;i++)
{
q=G->adjlist[i].firstedge;
for(cnt=0,j=0;q!=NULL;j++)
{
b[j]=q->adjvex;
q=q->next; cnt++;
}
if(cnt==1) ;
else
for(j=0;j<cnt-1;j++)
for(k=0;k<cnt-i-1;k++)
if(b[k]>b[k+1])
{
t=b[k];
b[k]=b[k+1];
b[k+1]=t;
}
for(j=0;j<cnt;j++)
{
printf("%c---->%c\n",G->a[i],G->a[b[j]]);
}
}
printf("邻边输出完毕.......\n");
printf("-------------------------------------\n");
}
主函数
void main()
{
ALGraph G;
ALGraph G2;
CreateALGraph(&G,&G2);
Degree(&G,&G2);
Print(&G);
Weights(&G);
}
实现代码
#include
#include
typedef struct node
{
int adjvex;
struct node *next;
int info;
}EdgeNode;
typedef struct vnode
{
int vertex;
EdgeNode *firstedge;
}VertexNode;
typedef struct
{
VertexNode adjlist[10];
int n,e;
char a[10];
}ALGraph;
void CreateALGraph(ALGraph *G,ALGraph *G2)
{
int i,j,k,qz;
EdgeNode *s,*d;
printf("请输入顶点数:");
scanf("%d",&(G->n));G2->n=G->n;
printf("请输入边数:");
scanf("%d",&(G->e));G2->e=G->e;
printf("-------------------------------------\n");
printf("请输入顶点信息(输入格式为:<回车>顶点号,顶点):\n");
for(i=0;i<G->n;i++)
{
printf("请输入第%d个顶点的信息:",i+1);
scanf("\n%d,%c",&(G->adjlist[i].vertex),&G->a[i]);
G->adjlist[i].firstedge=NULL;
G2->adjlist[i].vertex=G->adjlist[i].vertex;
G2->a[i]=G->a[i];
G2->adjlist[i].firstedge=NULL;
}
printf("-------------------------------------\n");
printf("请输入边表的信息(输入格式为:i,j,权重):\n");
for(k=0;k<G->e;k++)
{
printf("请输入第%d个边表的信息:",k+1);
scanf("%d,%d,%d",&i,&j,&qz);
s=(EdgeNode *)malloc(sizeof(EdgeNode));
s->adjvex=j;
s->next=G->adjlist[i].firstedge;
s->info=qz;
G->adjlist[i].firstedge=s;
d=(EdgeNode *)malloc(sizeof(EdgeNode));
d->adjvex=i;
d->next=G2->adjlist[j].firstedge;
G2->adjlist[j].firstedge=d;
}
printf("邻接表方式存储图建立成功\n\n");
printf("-------------------------------------\n");
}
void Degree(ALGraph *G,ALGraph *G2)
{
int i;
for(i=0;i<G->n;i++)
{
int outnum=0;
int innum=0;
struct node *q,*p;
q=G->adjlist[i].firstedge;
while(q!=NULL)
{
outnum++;q=q->next;
}
p=G2->adjlist[i].firstedge;
while(p!=NULL)
{
innum++;p=p->next;
}
printf("%c顶点的出度是%d\n",G->a[i],outnum);
printf("%c顶点的入度是%d\n",G->a[i],innum);
printf("%c顶点的总度是%d\n\n",G->a[i],outnum+innum);
}
printf("顶点度输出完毕\n\n");
printf("-------------------------------------\n");
}
void Weights(ALGraph *G)
{
int i,maxi=0,max=0,maxj=0;
struct node *q;
for(i=0;i<G->n;i++)
{
q=G->adjlist[i].firstedge;
while(q!=NULL)
{
if(max<G->adjlist[i].firstedge->info)
{
maxi=i;
maxj=G->adjlist[i].firstedge->adjvex;
max=G->adjlist[i].firstedge->info;
}
q=q->next;
}
}
printf("\n权值最大的边是:%c--->%c 权值为%d\n",G->a[maxi],G->a[maxj],max);
printf("\n");
}
void Print(ALGraph *G)
{
struct node *q;
int i,j,k,cnt,t;
int b[10];
for(i=0;i<G->n;i++)
{
q=G->adjlist[i].firstedge;
for(cnt=0,j=0;q!=NULL;j++)
{
b[j]=q->adjvex;
q=q->next; cnt++;
}
if(cnt==1) ;
else
for(j=0;j<cnt-1;j++)
for(k=0;k<cnt-i-1;k++)
if(b[k]>b[k+1])
{
t=b[k];
b[k]=b[k+1];
b[k+1]=t;
}
for(j=0;j<cnt;j++)
{
printf("%c---->%c\n",G->a[i],G->a[b[j]]);
}
}
printf("邻边输出完毕.......\n");
printf("-------------------------------------\n");
}
void main()
{
ALGraph G;
ALGraph G2;
CreateALGraph(&G,&G2);
Degree(&G,&G2);
Print(&G);
Weights(&G);
}
程序样例