C程序实现图的邻接表表示
2016-05-07 22:07
323 查看
#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;
}
相关文章推荐
- HDU 5117 Fluorescent(期望+DP)
- mysql线程池
- .css()与.addClass()设置样式的区别
- javascript基础-提交事件
- kmean算法理解
- hiho第九十七周 数论六·模线性方程组
- 清北学堂学习总结 day1 数据结构 练习
- 腾讯C++代码规范
- Android获取应用程序信息——PackageManager的基本使用
- HDU 5122 K.Bro Sorting
- Java Swing 秒表
- LBP(Local Binary Patterns)
- python入门学习课程推荐
- 用C++语言写游戏——打飞机
- 入门篇---作为一名菜鸟起飞的第一步,sqlite.lib编辑失败分析原因
- redhat7 上安装dummynet
- 维护代码简洁,使用lombok消除冗长的Java代码
- redhat7 上安装dummynet
- HDU 5120 Intersection(计算几何+容斥)
- Android View 事件分发机制梳理