数据结构---图---邻接表

关于图的存储结构,可以参考:http://blog.csdn.net/gongda2014306/article/details/51891637

下面是邻接表的实现方式:

//图的邻接表存储C语言实现
//2016.7.12
//author:xukeyi

#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

#define MAXV 10

//边节点结构
typedef struct _EdgeNode{
	int adjvex;
	int weight;
	struct EdgeNode *next;
}EdgeNode;

//表头节点结构(顶点表)
typedef struct _VertexNode{
	char data; //顶点对应的名称或其他信息
	EdgeNode *firstEdgeNode; // 对应顶点的链表中第一个边节点
}VertexNode;

typedef VertexNode AdjList[MAXV]; //AdjList是邻接表类型,AdjList类型就代表VertexNode[MAXV]

//完整的图-邻接表类型
typedef struct _Graph{
	AdjList adjList;
	int vertex_num;
	int edge_num;
}Graph;

//取某一顶点的坐标
int GetLocationGraph(Graph *graph,char ver){
	int i;
	for(i=0;i<graph->vertex_num;i++){
		if(graph->adjList[i].data==ver){
			return i;
		}
	}
}

//创建图(不带权值),无向
void CreateGraph(Graph *graph){
	int i,j,v1,v2;
	char ch1,ch2;
	EdgeNode *nodeList1,*nodeList2;
	printf("请输入图的顶点数与边数:\n");
	scanf("%d%d",&graph->vertex_num,&graph->edge_num);
	printf("The vertex_num and edge_num are : %d %d\n",graph->vertex_num,graph->edge_num);
	
	printf("请输入顶点编号:\n");
	while((ch1=getchar())=='\n'){
		continue;
	}

	//初始化顶点
	for(i=0;i<graph->vertex_num;i++){
		if(ch1!='\n'){
			graph->adjList[i].data=ch1;
			graph->adjList[i].firstEdgeNode=NULL;
			ch1=getchar();
		}	
	}
	
	//输入图中边的信息(以下代码不含权值),格式:abae,代表ab边和ae边
	printf("请输入边信息:\n");
	for(j=0;j<graph->edge_num;j++){
		ch1=getchar();
		ch2=getchar();
		v1=GetLocationGraph(graph,ch1);
		v2=GetLocationGraph(graph,ch2);
		if(v1==v2){
			return;
		}
		
		//使用单链表的头插法
		nodeList1=(EdgeNode*)malloc(sizeof(EdgeNode));
		if(nodeList1==NULL){
			return;
		}
		nodeList1->adjvex=v2;
		nodeList1->next=graph->adjList[v1].firstEdgeNode;
		graph->adjList[v1].firstEdgeNode=nodeList1;
		
		//如果构建有向图,则下面代码需要注释掉
		nodeList2=(EdgeNode*)malloc(sizeof(EdgeNode));
		if(nodeList2==NULL){
			return;
		}
		nodeList2->adjvex=v1;
		nodeList2->next=graph->adjList[v2].firstEdgeNode;
		graph->adjList[v2].firstEdgeNode=nodeList2;
	}
}

//打印图的顶点信息,以及每个顶点的边节点
void PrintfGraph(Graph *graph){
	Graph *pnew;
	int k;
	pnew=graph;
	int i;
	
	//打印图的顶点编号
	for(i=0;i<pnew->vertex_num;i++){
		printf(" %c ",pnew->adjList[i].data);
	}
	printf("\n");
	
	//打印图中每个顶点本身及其边节点
	for(i=0;i<pnew->vertex_num;i++){
		printf(" %c ",pnew->adjList[i].data);
		while(pnew->adjList[i].firstEdgeNode!=NULL){
			k=pnew->adjList[i].firstEdgeNode->adjvex;
			printf(" %c ",pnew->adjList[k].data);
			pnew->adjList[i].firstEdgeNode=pnew->adjList[i].firstEdgeNode->next;
		}
		printf("\n");
	}
	
}

int main(int argc, char *argv[]) {
	Graph *graph;
	graph=(Graph*)malloc(sizeof(Graph));
	CreateGraph(graph);
	PrintfGraph(graph);
	return 0;
}

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值