#include<stdio.h>
#include<stdlib.h>
#define Max 50
//边节点结构体
typedef struct ArcNode
{
int adjnode; //边指向的节点
struct ArcNode* next; //指向下一条边的地址
}ArcNode;
//顶点结构体
typedef struct VNode
{
int data; //顶点的信息
ArcNode* first; //此顶点指向第一条边的地址
}VNode;
//图的结构体
typedef struct ALGraph
{
VNode ver[Max]; //顶点的数组
int node_num, ver_num; //顶点的个数,边的个数
}ALGraph;
void Create_ALGraph(ALGraph* p)
{
int i, j;
int x;
ArcNode* s, * r;
printf("请输入顶点和边的个数:");
scanf_s("%d %d", &p->node_num, &p->ver_num);
getchar();
for (i = 1; i <= p->node_num; i++)
{
printf("请输入【第%d个】顶点:", i);
scanf_s("%d", &p->ver[i].data);
getchar();
p->ver[i].first = NULL;
}
for (i = 1; i <= p->node_num; i++)
{
printf("请输入【第%d个】顶点第一条边指向的节点下标:", i);
scanf_s("%d", &j);
s = (ArcNode*)malloc(sizeof(ArcNode));
s->adjnode = j;
s->next = NULL;
p->ver[i].first = s;
while (1)
{
printf("若有下一条边请输入1,否则输入0:");
scanf_s("%d", &x);
if (x == 0)
break;
r = (ArcNode*)malloc(sizeof(ArcNode));
printf("请输入这条边指向的结点下标:");
scanf_s("%d", &j);
r->adjnode = j;
r->next = NULL;
s->next = r;
s = r;
}
}
printf("图已创建完成!\n");
}
void Print(ALGraph p)
{
int i;
ArcNode* s;
for (i = 1; i <= p.node_num; i++)
{
s = p.ver[i].first;
printf("节点【%d】指向的数据下标为:", p.ver[i].data);
while (s != NULL)
{
printf("%d ", s->adjnode);
s = s->next;
}
printf("\n");
}
}
int main()
{
ALGraph p;
Create_ALGraph(&p);
Print(p);
}