临界表储存图的数据(思路+详解+图示)

输出:为每个顶点和其相连边的顶点以及权值

1 5 3 3 8 2 5

2 3 2 5 6

3 5 4 4 10

4 5 11

5

输出的解释说明:1 5 3 3 8 2 5 顶点1和5相连权值为3,顶点1和3相连权值为8,顶点1和2相连权值为5

3.分析如何建立邻接表使其输出上述数据

1>:首先指出,我们采取用数组模拟指针来建立链表,采用结构体数组来存储每个结点的信息

2>:结构体数组中的值为{顶点下标,边的权值,指向下一个结点的下标}

注意指向下一个结点的下标,因为我们采用的是数组来模拟指针,所以我们的head 和 next

都是记录结构体的数组下标,而head[i] 中的 i才是真正的顶点下标

3>:模拟指针为空的状况我们采用 当 next的值为0是表示为空

4>:建立链表和遍历链表请看代码

**/

#include<bits/stdc++.h>

using namespace std;

#define max 20000

struct Node{

int to;//到达某个点

int val;//边的权值

int next;//指向下一个结点下标

} node[max];

int head[max] = {0},n,m,num = 0;//head为记录结构体下标,num为结构体的下标

//建立链表 这个过程类似于头插法,每次插入都插入到上一个结点的前面

void add(int from,int to,int val){

num++;

node[num].to = to;

node[num].val = val;

node[num].next = head[from];//指向下一个结点的下标

head[from] = num;//记录结构体数组的下标,下次插入的时候指向其

}

int main(){

cin >> n >> m;

for(int i = 0; i < m; i++){

int from,to,val;

cin >> from >> to >> val;

add(from,to,val);

//add(to,from,val); 这里表示的是无向图中邻接表

}

//遍历邻接表

for(int i = 1; i <= n; i++){//因为顶点是从1开始的

cout << i << ’ ';

for(int j = head[i]; j != 0; j = node[j].next){ //遍历顶点为i的链表 直到结构体的下标为0

cout << node[j].to << ’ '<< node[j].val << ’ ';

}

cout << endl;

}

}

//5 8

//1 2 5

//1 3 8

//1 5 3

//2 5 6

//2 3 2

//3 4 10

//3 5 4

//4 5 11

在这里插入图片描述

四:书上的例子创建邻接表(有亿点麻烦)

==================================================================================

//邻接表是图的一种链式存储结构,对图的每个顶点建立一个单链表,单链表第一个结点存放顶点信息,其余存放有关边信息。

//邻接表由表头结点表和边表组成。

// (01) LGraph是邻接表对应的结构体。

// vexnum是顶点数,edgnum是边数;vexs则是保存顶点信息的一维数组。

// (02) VNode是邻接表顶点对应的结构体。

// data是顶点所包含的数据,而first_edge是该顶点所包含链表的表头指针。

// (03) ENode是邻接表顶点所包含的链表的节点对应的结构体。

// ivex是该节点所对应的顶点在vexs中的索引,而next_edge是指向下一个节点的

#include<stdio.h>

#include<stdlib.h>

#define Max 100

typedef struct Graph* ptrGraph;

typedef struct Edgenode* ptrEdgenode;

typedef struct Edgenode{//边结点

int adjvex;//边结点位置下标

struct Edgenode* next;

}edgenode;

typedef struct Vnode{//顶点

int Data;

struct Edgenode* firstarc;

}vnode;

typedef struct Graph{

struct Vnode AdjList[Max];

int Nv;

int Ne;

}graph;

int locateVex(ptrGraph G,int v){//根据v点信息,找到相应坐标

int i;

for(i=0;iNv;i++){

if(G->AdjList[i].Data==v){

return i;

}

}

return -1;

}

int CreatGraph(ptrGraph G){

int i,j;

int V1,V2,K1,K2;

ptrEdgenode p1,p2;

scanf(“%d%d”,&G->Nv,G->Ne);

//输入头结点(即顶点的数据)

for(i=0;iNv;i++){

scanf(“%d”,&G->AdjList[i].Data);

G->AdjList[i].firstarc=NULL;

}

//输入边的两个结点

for(j=0;jNe;j++){

scanf(“%d%d”,&V1,&V2);

K1=locateVex(G,V1);

K1=locateVex(G,V2);

p1=(ptrEdgenode)malloc(sizeof(struct Edgenode));

p1->adjvex=K1;

p1->next=G->AdjList[K2].firstarc;//链表前插法

G->AdjList[K2].firstarc=p1;

p2=(ptrEdgenode)malloc(sizeof(struct Edgenode));

p2->adjvex=K2;

p2->next=G->AdjList[K1].firstarc;

G->AdjList[K1].firstarc=p2;

}

return 0;

}

void output_AL(ptrGraph G) //输出

{

int i;

for( i=0;iNv;i++)

{

printf(“顶点%d”,G->AdjList[i].Data);

ptrEdgenode p=G->AdjList[i].firstarc;

while(p!=NULL)

{

printf(“->%d”,p->adjvex); //输出下标
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。

最新整理面试题
在这里插入图片描述

上述的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2021收集的一些大厂的面试真题

最新整理电子书

在这里插入图片描述

最新整理大厂面试文档

在这里插入图片描述

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
存中…(img-BuKw86fq-1713459358728)]

上述的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2021收集的一些大厂的面试真题

最新整理电子书

[外链图片转存中…(img-MX8GVknH-1713459358729)]

最新整理大厂面试文档

[外链图片转存中…(img-x6BbO14p-1713459358729)]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值