总结:
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。
马上还有两门水课考试,希望我能安排好时间,在应该的时间做应该做的事情,胡思乱想留给周日吧。