#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_VERTEX_NUM 20
typedef char VertexType;
//边结构
typedef struct Node
{
int adjvex;//边所指向的节点序号
struct ArcNode *nextarc;//指向下一条边的指针
} ArcNode;
//顶点结构
typedef struct Vnode
{
VertexType data;//顶点数据
ArcNode *firstarc;//指向第一条依附该顶点的边指针
}AdjList[MAX_VERTEX_NUM];
//图
typedef struct
{
AdjList vertices;
int vernum, arcnum;//顶点数和边数
} ALGraph;
int main()
{
int i, k, n, m, v1, v2;
ArcNode *s;
char c;
ALGraph *ph = (ALGraph *)malloc(sizeof(ALGraph));//分配图对象内存
printf("please input vertex and edge num:\n");
scanf("%d %d", &n, &m); //输入顶点数和边数
printf("please input data of every vertex:\n");
for(i = 0; i < n; i++)
{
fflush(stdin);
scanf("%c", &c);
ph->vertices[i].data = c;
ph->vertices[i].firstarc = NULL;
}
printf("please input Edge (v1 v2):\n");
for(i = 0; i < m; i++)
{
scanf("%d %d", &v1, &v2);
s = (ArcNode *)malloc(sizeof(ArcNode)); //倒插法对输入的边加入相应的邻接表
s->adjvex = v2;
s->nextarc = ph->vertices[v1].firstarc;
ph->vertices[v1].firstarc = s;
s = (ArcNode *)malloc(sizeof(ArcNode)); //对于无向图,加入反方向的边;对于有向图,则不需要
s->adjvex = v1;
s->nextarc = ph->vertices[v2].firstarc;
ph->vertices[v2].firstarc = s;
}
for(i = 0; i < n; i++)
{
printf("%c", ph->vertices[i].data); //输出第一个顶点数据
//ph->vertices[i].firstarc = ph->vertices[i].firstarc->nextarc;
while(ph->vertices[i].firstarc)
{
printf("->%c", ph->vertices[ph->vertices[i].firstarc->adjvex].data);//输出邻接表中和每一顶点相连接的数据
ph->vertices[i].firstarc = ph->vertices[i].firstarc->nextarc;
}
putchar('\n');
}
return 0;
}
#include <stdlib.h>
#include <string.h>
#define MAX_VERTEX_NUM 20
typedef char VertexType;
//边结构
typedef struct Node
{
int adjvex;//边所指向的节点序号
struct ArcNode *nextarc;//指向下一条边的指针
} ArcNode;
//顶点结构
typedef struct Vnode
{
VertexType data;//顶点数据
ArcNode *firstarc;//指向第一条依附该顶点的边指针
}AdjList[MAX_VERTEX_NUM];
//图
typedef struct
{
AdjList vertices;
int vernum, arcnum;//顶点数和边数
} ALGraph;
int main()
{
int i, k, n, m, v1, v2;
ArcNode *s;
char c;
ALGraph *ph = (ALGraph *)malloc(sizeof(ALGraph));//分配图对象内存
printf("please input vertex and edge num:\n");
scanf("%d %d", &n, &m); //输入顶点数和边数
printf("please input data of every vertex:\n");
for(i = 0; i < n; i++)
{
fflush(stdin);
scanf("%c", &c);
ph->vertices[i].data = c;
ph->vertices[i].firstarc = NULL;
}
printf("please input Edge (v1 v2):\n");
for(i = 0; i < m; i++)
{
scanf("%d %d", &v1, &v2);
s = (ArcNode *)malloc(sizeof(ArcNode)); //倒插法对输入的边加入相应的邻接表
s->adjvex = v2;
s->nextarc = ph->vertices[v1].firstarc;
ph->vertices[v1].firstarc = s;
s = (ArcNode *)malloc(sizeof(ArcNode)); //对于无向图,加入反方向的边;对于有向图,则不需要
s->adjvex = v1;
s->nextarc = ph->vertices[v2].firstarc;
ph->vertices[v2].firstarc = s;
}
for(i = 0; i < n; i++)
{
printf("%c", ph->vertices[i].data); //输出第一个顶点数据
//ph->vertices[i].firstarc = ph->vertices[i].firstarc->nextarc;
while(ph->vertices[i].firstarc)
{
printf("->%c", ph->vertices[ph->vertices[i].firstarc->adjvex].data);//输出邻接表中和每一顶点相连接的数据
ph->vertices[i].firstarc = ph->vertices[i].firstarc->nextarc;
}
putchar('\n');
}
return 0;
}