简单邻接表构造图


采用经典的数据结构算法,略有改动。

#include <stdio.h>
#include <stdlib.h>
#define ElenType int
#define InfoType char
#define VertextType int//顶点信息
#define Status int//返回值类型
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define MAX_VERTEX_NUM 20
//顶点的最大数量
//讨论无向图(虽然arc代表弧)的邻接表,采用经典的代码命名
/*表节点*/
typedef struct ArcNode{
	int adjvex;//该边所指向的顶点位置
	ArcNode *nextarc;//指向下一条边
	InfoType *info;//边的信息
}ArcNode;
typedef struct VNode{
	VertextType data;//顶点信息
	ArcNode *firstarc;//指向第一条依附于该点的边
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct{
	AdjList vertices;
	int vexnum,arcnum;//图的顶点数和边数
}ALGraph;//Adjacency List Graph


/*创建图*/
void CreateALG(ALGraph &G){
	int i,j,k;
	ArcNode *an;
	printf("输入图的顶点数和边数:");
	scanf("%d%d",&G.vexnum,&G.arcnum);
	printf("请输入%d个顶点的值:\n",G.vexnum);
	for(k=0;k<G.vexnum;k++){
		scanf("%d",&G.vertices[k].data);
		G.vertices[k].firstarc = NULL;
	}
	for(k=0;k<G.arcnum;k++){
		printf("请输入第%d条边的两个结点位置:",k+1);
		/*如果输入的是结点的值,还要通过LocateVex函数来查找结点在图中的位置*/
		/*这里简单起见。直接输入*/
		scanf("%d%d",&i,&j);
		an = (ArcNode*)malloc(sizeof(ArcNode));
		an->info = NULL;//没有信息
		an->adjvex = j;//先是i到j
		an->nextarc = G.vertices[i].firstarc;//前插法
		G.vertices[i].firstarc = an;
		an = (ArcNode*)malloc(sizeof(ArcNode));
		an->info = NULL;//没有信息
		an->adjvex = i;//同时j也会到i
		an->nextarc = G.vertices[j].firstarc;
		G.vertices[j].firstarc = an;
	}
}

/*打印邻接表*/
void DisPlayALG(ALGraph G){
	printf("<结点的值(这里同时也是序号位置)>--位置->\n");
	for(int i=0;i<G.vexnum;i++){
		printf("<%d>--",i);
		while(G.vertices[i].firstarc){//第i个结点的邻接结点没打印完
			printf("%d->",G.vertices[i].firstarc->adjvex);
			G.vertices[i].firstarc = G.vertices[i].firstarc->nextarc;//移动指针
		}
		printf("\n");
	}
}
int main(){
	ALGraph G;
	CreateALG(G);
	DisPlayALG(G);
	return 0;
}

运行结果:



对应的图是这个:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值