#include<stdio.h>
#include<stdlib.h>
#define max 20
typedef struct ArcNode /*ArcNode存放邻接表中的信息,包括顶点的位置和权值,和连接下一个顶点的指针*/
{
int adjvex;
struct ArcNode *nextarc;
int info;
} ArcNode;
typedef struct VertexNode /*VertexNode存放顶点的信息和指向第一个邻接顶点的指针*/
{
char data;
ArcNode *firstarc;
}VertexNode;
typedef struct{ /*AdjList存放图的顶点个数,边的个数以及顶点构成的数组*/
VertexNode vertex[max];
int vexnum,arcnum;
}AdjList;
AdjList *G=(AdjList *)malloc(sizeof(AdjList));; /*建立图G*/
int locatevertex(AdjList *G,char x) /*定位顶点在邻接表中的位置*/
{
for(int i=0;i<G->vexnum;i++)
{
if(G->vertex[i].data==x)
return i;
}
return -1;
}
int creategraph(AdjList *G)
{
int i,j,k,power;
char v1,v2;
printf("请输入顶点数和边数:\n");
scanf("%d%d",&G->vexnum,&G->arcnum);
fflush(stdin);
printf("请输入顶点:\n");
for(i=0;i<G->vexnum;i++)
{
fflush(stdin);
scanf("%c",&G->vertex[i].data); /*将顶点存在数组中*/
G->vertex[i].firstarc=NULL;
}
printf("请输入边和权值:\n");
for(i=0;i<G->arcnum;i++)
{
fflush(stdin);
scanf("%c %c%d",&v1,&v2,&power);
j=locatevertex(G,v1); /*找到v1,v2的位置*/
k=locatevertex(G,v2);
ArcNode *arc=(ArcNode *)malloc(sizeof(ArcNode)); /*建立新结点将v2接在v1的链表后面*/
arc->adjvex=k;
arc->info=power;
arc->nextarc=G->vertex[j].firstarc;
G->vertex[j].firstarc=arc;
arc=(ArcNode *)malloc(sizeof(ArcNode)); /*建立新结点将v1接在v2的链表后面*/
arc->adjvex=j;
arc->info=power;
arc->nextarc=G->vertex[k].firstarc;
G->vertex[k].firstarc=arc;
}
}
void print(AdjList *G) /*打印邻接表*/
{
ArcNode *p;
p=(ArcNode *)malloc(sizeof(ArcNode));
for(int i=0;i<G->vexnum;i++)
{
printf("%c",G->vertex[i].data);
p=G->vertex[i].firstarc;
while(p)
{
printf("->%c(%d)",G->vertex[p->adjvex].data,p->info);
p=p->nextarc;
}
printf("\n");
}
}
int main()
{
creategraph(G);
printf("图的邻接表为:\n");
print(G);
return 0;
}
图(邻接表写法)
最新推荐文章于 2025-02-24 00:00:00 发布