有向图的邻接表(用c++编译运行)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MaxVertexNum 100     //最大顶点数为100            
typedef int WeightType;        //假设边的权值为 int 类型
typedef char DataType;        // 假设顶点存储类型为 char 类型 

//边的定义
struct Edge{
int V1, V2;  // 俩个顶点的下标,用下标表示顶点
WeightType Weight;
};


//邻接点的定义
struct AdjVNode{
int AdjV;       //顶点下标
WeightType Weight;
AdjVNode *next;
};

//顶点表头结点的定义
typedef struct Vnode{
AdjVNode *next;
DataType Data;
}AdjList[MaxVertexNum];

//图结点定义
struct GNode{
int Nv;            //顶点数
int Ne;            //边数
AdjList G;
};

//初始化图(就是赋值)
GNode* CreateGraph(int VertexNum){
int V;
GNode *Graph;
Graph=(GNode*)malloc(sizeof(GNode));
Graph->Nv=VertexNum;
Graph->Ne=0;
for(V=0;V<Graph->Nv;V++)
   Graph->G[V].next=NULL;
   return Graph;
}

//插入边的数据
void InsertEdge(GNode *Graph, Edge* E){
AdjVNode *NewNode;
NewNode=(AdjVNode*)malloc(sizeof(AdjVNode));
NewNode->AdjV=E->V2;
NewNode->Weight=E->Weight;
NewNode->next=Graph->G[E->V1].next;
Graph->G[E->V1].next=NewNode;
}

//打印输出图的 俩个顶点 和 权值
void show(GNode*Graph){
	printf("起点                      终点                          权值\n");
	int i,j;
	AdjVNode*p;
	char ch;
	for(i=0; i<Graph->Nv; i++){
		p=Graph->G[i].next;
		while(1){
			if(p==NULL)break;
			printf("%c                          ", Graph->G[i].Data);
			//for循环找到下标所对应的顶点字符
			for(j=0;j<Graph->Nv; j++) if(j==p->AdjV) {printf("%c                            ", Graph->G[j].Data);break;}
			printf("%d       \n",p->Weight);
			p=p->next;
		}
		printf("\n");
	}
	
}

//建立邻接表
void BulidGraph(){
GNode *Graph;
Edge *E;
int V;    // 顶点的下标,用下标表示顶点
int Nv,i,j;
char c1,c2;
printf("请输入顶点数:");
scanf("%d", &Nv);
Graph=CreateGraph(Nv);
//插入顶点数据
printf("请输入顶点数据(注意:字符之间不能有空格):");
getchar();
for(V=0; V<Graph->Nv; V++){
   scanf("%c", &(Graph->G[V].Data));
}


printf("请输入边数:");
scanf("%d", &(Graph->Ne));

if(Graph->Ne!=0){
E=(Edge*)malloc(sizeof(Edge));


//输入数据
for(i=0; i<Graph->Ne; i++){getchar();
printf("\n请输入起点v1:");
c1=getchar();
printf("\n请输入终点v2:");
getchar();
c2=getchar();
printf("\n权值weight:");
scanf("%d",&E->Weight);
//俩个for分别找到顶点字符对应的下标,再调用InsertEdge(Graph, E)函数把边的值存进去
for(j=0;j<Nv; j++) if(Graph->G[j].Data==c1) {E->V1=j;break;}
for(j=0;j<Nv; j++) if(Graph->G[j].Data==c2) {E->V2=j;break;}

InsertEdge(Graph, E);
}
}

   
//打印图
show(Graph);

}


int main(){
	
	BulidGraph();
}

  • 20
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值