#include<stdio.h>
#include<stdlib.h>
#define MaxVertexNum 100
typedef struct ArcNode//边表结点
{
int adjvex;//该弧指向的顶点的位置
struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode//顶点结点
{
int data;
ArcNode *firstarc;
}VNode,AdjList[MaxVertexNum];
typedef struct
{
AdjList vertices;//邻接表
int vexnum,arcnum;
int kind;//图的类型(有向图,无向图)
}ALGraph;
int LocateVex(ALGraph G,int u)//返回顶点在图中的位置
{
int i;
for(i = 0; i < G.vexnum; ++i)
{
if(u==G.vertices[i].data)
return i;
return -1;
}
}
int CreateGraph(ALGraph *G)
{
ArcNode *p;
int i,j,k;
int va,vb;//弧尾和弧头
printf("请输入图的类型:(有向图:0 无向图:2)\n");
scanf("%d",&(*G).kind);
printf("请输入图的顶点数和边数,中间以空格间隔:\n");
scanf("%d%d",&(*G).vexnum,&(*G).arcnum);
printf("请连续输入%d个顶点的值: ",(*G).vexnum);
for(i=0;i<(*G).vexnum;++i)//建立顶点节点单链表
{
scanf("%d",&(*G).vertices[i].data);
(*G).vertices[i].firstarc=NULL;
}
printf("请顺序输入每条边的弧尾和弧头,以空格作为间隔:\n");//建立边结点链表
for(k=0;k<(*G).arcnum;++k)
{
scanf("%d%d",&va,&vb);
// i=LocateVex(*G,va);//弧尾
// j=LocateVex(*G,vb);//弧头
i=va-1;
j=vb-1;
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=j;
p->nextarc=(*G).vertices[i].firstarc;
(*G).vertices[i].firstarc=p;
if((*G).kind>=2)//如果是无向图
{
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=i;
p->nextarc=(*G).vertices[j].firstarc;
(*G).vertices[j].firstarc=p;
}
}
return 1;
}
void Display(ALGraph G)
{
int i;
ArcNode *p;
switch(G.kind)
{
case 0:
printf("这是一个有向图!\n");
break;
case 2:
printf("这是一个无向图!\n");
break;
}
printf(" %d 个顶点分别为:\n",G.vexnum);
for(i = 0; i < G.vexnum; ++i)
{
printf("%d\t",G.vertices[i].data);
}
printf("\n");
printf(" %d 条边:\n",G.arcnum);
if(G.kind==0)//当是有向图时
{
for(i = 0; i < G.vexnum; ++i)
{
p=G.vertices[i].firstarc;
while(p)
{
if(i<p->adjvex)
{
printf("%d-->%d\t",G.vertices[i].data,G.vertices[p->adjvex].data);
}
p=p->nextarc;
}
printf("\n");
}
}
else if(G.kind==2)//是无向图时
{
for(i = 0; i < G.vexnum; ++i)
{
p=G.vertices[i].firstarc;
while(p)
{
if(i<p->adjvex)
{
printf("%d-->%d\t",G.vertices[i].data,G.vertices[p->adjvex].data);
printf("%d-->%d\t",G.vertices[p->adjvex].data,G.vertices[i].data);
}
p=p->nextarc;
}
printf("\n");
}
}
}
void FindIndegree(ALGraph G,int indegree[])//计算顶点的入度
{
}
int main()
{
ALGraph G;
CreateGraph(&G);
Display(G);
}
数据结构——图的邻接表建立
最新推荐文章于 2023-05-25 16:03:12 发布