无向图的邻接表表示法

在这里插入图片描述
总结:
1、邻接表表示由表头结点、邻接结点组成;
2、为了方便插入边(即将两个结点连起来)的操作,定义边(两个邻接点下标+边权重);
3、表头结点的权重存放的是结点的权重,邻接点的权重存放的是边权重

//无向图的邻接表表示法
#include <stdio.h>
#include <stdlib.h>
#define MaxVertexNum 100
typedef int Vertex;
typedef int WeightType;
typedef char DataType;
typedef struct ENode *PtrToENode;
struct ENode{
	Vertex V1,V2;
	WeightType Weight;//边权重 
}; 
typedef PtrToENode Edge;

typedef struct AdjVNode *PtrToAdjVNode; 
struct AdjVNode{
	Vertex AdjV;
	WeightType Weight;//边权重 
	PtrToAdjVNode Next;
};

typedef struct VNode{
	PtrToAdjVNode FirstEdge;
//	DataType Data;//结点的数据 ,很多时候顶点无数据 
}AdjList[MaxVertexNum];

typedef struct GNode *PtrToGNode;
struct GNode{
	int Nv;
	int Ne;
	AdjList G;
};
typedef PtrToGNode LGraph;

LGraph CreateGraph(int VertexNum)
{
	Vertex V;
	LGraph Graph;
	
	Graph=(LGraph)malloc(sizeof(struct GNode));
	Graph->Nv=VertexNum;
	Graph->Ne=0;
	for(V=0;V<Graph->Nv;V++)
		Graph->G[V].FirstEdge=NULL;
	return Graph;
}
void InsertEdge(LGraph Graph,Edge E)
{
	PtrToAdjVNode NewNode;
	NewNode=(PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
	NewNode->AdjV=E->V2; 
	NewNode->Weight=E->Weight;
	NewNode->Next=Graph->G[E->V1].FirstEdge;
	Graph->G[E->V1].FirstEdge=NewNode;
	
	
	NewNode=(PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
	NewNode->AdjV=E->V1;
	NewNode->Weight=E->Weight;
	NewNode->Next=Graph->G[E->V2].FirstEdge;
	Graph->G[E->V2].FirstEdge=NewNode;
} 

LGraph BuildGraph()
{
	LGraph Graph;
	Edge E;
	Vertex V;
	int Nv,i;
	printf("请输入结点数:\n"); 
	scanf("%d",&Nv);
	Graph=CreateGraph(Nv);
	printf("请输入边数:\n"); 
	scanf("%d",&(Graph->Ne));
	if(Graph->Ne!=0){
		E=(Edge)malloc(sizeof(struct ENode));
		for(i=0;i<Graph->Ne;i++){
			printf("请输入结点1 结点2 边权重:\n"); 
			scanf("%d %d %d",&E->V1,&E->V2,&E->Weight);
			InsertEdge(Graph,E);
		}
	}
	
//	for(V=0;V<Graph->Nv;V++){
//		scanf("%c",&Graph->G[V].Data);
//	}
	return Graph;
}
int main()
{
	LGraph Graph=BuildGraph();
	PtrToAdjVNode Adj;
	for(int i=0;i<Graph->Nv;i++){
		printf("边表头%d ",i);
		Adj=Graph->G[i].FirstEdge;
		while(Adj){
			printf("%d(%d) ",Adj->AdjV,Adj->Weight);//括号内是边权重 
			Adj=Adj->Next;
		}
		printf("\n");
	}
	
	return 0;
} 

最近一周多基本没有学数据结构,也没学其他的计算机相关课程。主要有原因:
1、可能PTA上有些题没做出来有点沮丧;
2、最近在做决定,死磕Java还是Golang。询问过陈越姥姥和师兄的意见,决定死磕Java更适合我。每次做决定的时候,我就会半夜在床上刷别人的看法+躺很久不能入睡,权衡弊利。
3、以为轮到我要开始讲组会了,要读文献,读文献进度很慢。
4、老师交代要写的综述,说两个月后给他,我一直拖着,还剩半个月,要读很多文献。

近期暂定安排:
1、早上8点-10点,一篇听力+阅读;
2、白天其他时间查文献、读文献,写综述;
3、11点20-13点30,17点-18点30吃饭休息;
3、晚上18点30-22点30,数据结构;
4、6休1。
马上还有两门水课考试,希望我能安排好时间,在应该的时间做应该做的事情,胡思乱想留给周日吧。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值