小白学C语言数据结构之图

定义

由点集和边集形成的一个东西..

比如 A ——————————B

| |

| |

| |

C——————————D

当然C和B也有可能有连接 A和D也有可能有连接

邻接表法

A:B(可以在括号里封装一个AB间的距离),C

B:C,D

C:A,D

D:B,C

矩阵法

A

B

C

D

A

0

AB距离

无穷(不存在)

B

0

C

0

D

0

除了这两种,还有N多种....

所以表示和算法,要找到普适、常用、熟悉的。

就是用一招鲜,吃遍天

用自己的模板套所有东西

学会了给妈妈做蛋炒饭

就要学会 “ 为了建设美好中国,先给妈妈做一顿蛋炒饭”

图的表达

左神在课程里教的是点集和边集表达...

但是C语言实现麻烦的一批...

所以我就问chatgpt哪种方式最值得一学

考研书上对邻接表法的定义是这样的:

对图G中的每个顶点Vi建立一个单链表,第i个单链表中的节点表示依附于顶点Vi的边,这个单链表就称为顶点Vi的边表(有向图叫出边表)。边表的头指针和顶点的数据信息采用顺序存储(称为顶点表),所以在邻接表中存在两种节点:顶点表节点和边表节点。

// 邻接表的节点
struct AdjListNode {int dest;                    // 目标顶点int weight;                  // 两点之间的权重struct AdjListNode* next;    // 指向下一个邻接节点的指针
};// 邻接表的头结点
struct AdjList {struct AdjListNode* head;    // 邻接链表的头指针
};// 图的结构体
struct Graph {int V;                      // 顶点数/链表数struct AdjList* array;      // 邻接链表的数组
};

按链表的知识来看。

AdjListNode就是节点, 其中包括的value有 dest(下一顶点的value)和weight(两点间的权重),而AdjListNode* next是指向下一节点的指针。

ArrayList是链表结构体,存储头节点,就能顺着找到整条列表。

Graph是图的结构体,其中包含两部分:V是顶点数量。array是存储链表的数组。

就是 类似于

 struct AdjList* array = (struct AdjList*)malloc( V * sizeof(struct AdjList));
// V大小的动态数组, 存储 AdjList型的变量

假设这样一个邻接表

0: 1->4

1: 0->2->3->4

2: 1->3

3: 1->2->4

4: 0->1->3

这里面的V就是5。因为存储了5个顶点,每个顶点延伸出一条链表.

比如0节点,其延伸出的链表就是

0->1->4 其中0作为头指针

遍历姿势

图的宽度优先遍历(BFS)

比如 A ——————————B

| |

| |

| |

C——————————D

回到小红图

宽度优先遍历类似于二叉树按层遍历

就是说 谁离得近 我先遍历谁

这里面的顺序就应该是 A B C D

当然因为不知道B和C和A之间边的权重 所以也可能是 A C B D

看起来是先进先出的结构

那就用队列来实现

A进队 判断他的下一节点 B、C

B、C进队,但是在无向图里, A也是B、C的下一节点,还能让A再进队吗?显然不能。

于是创建一个存储机制让他记住 A已经输出完了

coding~

还是 先写这个队列所需的一些基本操作

struct QueueNode{struct AdjListNode* node;struct QueueNode* next;
};
struct Queue{struct QueueNode* front;struct QueueNode* rear;
};
// 新建队列节点
struct Queue* newQueueNode(struct AdjListNode* node) {struct Queue* newNode = (struct Queue*)malloc(sizeof(struct Queue));newNode->data = node;newNode->next = NULL;return newNode;
}
//入队
void enqueue(struct Queue* queue, struct AdjListNode* node){// 定义一个队列节点类型的newnodestruct QueueNode* newnode = (struct QueueNode*)malloc(sizeof(struct QueueNode));newnode->node = node;newnode->next = NULL;   //初始化if(queue->rear ==NULL){queue->front = queue->rear = newnode;}else{newnode->next = queue->rear;queue->rear = newnode;
}
//出队,返回AdjListNode*变量
struct AdjListNode* dequeue(struct Queue* queue){if(queue->front ==NULL){return NULL;}AdjListNode* node = queue->front->node;    //把队头的值取出来struct QueueNode* temp = queue->front;queue->front = queue->front->next;if(queue->front ==NULL){queue->rear =NULL;}free(temp);return node;                                    //返回头节点
}
//判断是否为空
bool is_empty(struct Queue* queue){return queue->front ==NULL;
}         

再写一些图的基础操作

//先实现图的结构
struct AdjListNode{int dest;int weight;struct AdjListNode* next;
};
struct AdjList{struct AdjListNode* head;
};
struct Graph{int V;struct AdjList* array;
};// 创建链表节点
struct AdjListNode* CreateAdjListNode(int dest){struct AdjListNode* newnode = (struct AdjListNode*)malloc(sizeof(struct AdjListNode));newNode->dest = dest;newNode->next = NULL;return newNode;
}
//创建图
struct Graph* CreateGraph(int V){struct Graph* graph = (struct Graph*)malloc(sizeof(struct Graph));graph->V = V;graph->array = (struct AdjList*)malloc(V * sizeof(struct AdjList));for(int i=0; i<V; i++){graph->array[i]->head = NULL;}return graph;
}
//添加边
void addEdge(struct Graph* graph, int src, int dest){struct AdjListNode* newNode = CreateAdjListNode(dest);   //建一个新节点newNode->next = graph->array[src]->head;                 //让原来图的顶点 指向新节点的nextgraph->array[src]->head = newNode;                       //让新节点变成新顶点//newNode = newAdjListNode(src);                         //双向图需要处理//newNode->next = graph->array[dest]->head;//graph->array[dest]->head = newNode;
}

最后是实现宽度优先遍历函数

void BFS(struct Graph* graph, int start){//创建一个队列struct Queue* queue = (struct Queue*)malloc(sizeof(struct Queue)); queue->front = queue->rear =NULL;//创建一个大小为V, bool类型的动态数组 来记录某个点是否已经存在了 bool* visited = (bool*)malloc(graph->V * sizeof(bool));for(int i=0; i<graph->v; i++){visited[i] = false;}//visited[start] = true;enqueue(queue, start);while(!is_empty(queue)){//出队int current = dequeue(queue);printf("%d  ", current);//遍历与当前节点相邻的节点struct AdjListNode* temp = graph->array[current]->head;while(temp!=NULL){int adj_node = temp->dest;if(!visited[adj_node]){visited[adj_node] = true;enqueue(queue, adj_node);}temp= temp->next;}}
}

深度优先遍历

搞个新的图

A -- B -- C
|    |    |
|    |    |
D -- E -- F

我问了chatgpt很多很多次,每次深度优先遍历的结果都不同

深度优先遍历类似于二叉树的中序遍历,一条路走到黑再返回

比如A->B->C->F->E->D

void DFS(struct Graph* graph, int v){//还是建一个动态的bool数组bool* visited = (bool*)malloc(graph->V * sizeof(bool));for(int i=0; i<graph->v; i++){visited[i] = false;}visited[v] = true;  // 标记当前节点已访问printf("%d ", v);   // 输出访问的节点struct AdjListNode* current = graph->array[v]->head;while(current != NULL){if(!visited[current->dest]){  // 如果当前节点的邻居节点没有访问过,则递归访问它DFS(graph, current->dest, visited);}current = current->next;      // 处理下一个邻居节点}
}

这里的操作真的很像二叉树那块

只要当前节点的邻居节点没有被访问过,就往下继续访问

总结

看到最后一个题的递归的时候还是做的不太好...

这么点内容写了大半天,太久不学习真的脑子生锈- -

先写熟这一套图的表达吧。视频里的建议是,熟到无论怎么变型都能定制出来要求。~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/52794.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络漏洞,我把全校学生信息都搞出来了!

因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享 点击关注#互联网架构师公众号&#xff0c;领取架构师全套资料 都在这里 0、2T架构师学习资料干货分 上一篇&#xff1a;ChatGPT研究框架&#xff08;80页PPT&#xff0c;附下载&#xff09;…

比尔·盖茨:AI将为每人创造一个私人助手 科技市场面临洗牌?

自ChatGPT爆火以后&#xff0c;硅谷大厂们开启了生成式AI“军备竞赛”&#xff0c;都在争相推出能生成文字或影像的人工智能工具&#xff0c;科技圈或将迎来大变局。 在这场变局中&#xff0c;微软似乎已拔得头筹。微软首席执行官表示&#xff0c;“搜索引擎迎来了新时代”&…

我们学习到底是为了什么,到底什么才是我们真正想要的

原创 科大云炬 科大云炬 2019-04-26 、 今天看到一句话&#xff0c;感慨颇多:”现在的教育只是一味的强调一定要好好学习&#xff0c;却没有强调为什么要好好学习。 我们学习到底是为了什么&#xff0c;到底什么才是我们真正想要的。一千个读者会产生一千个哈姆雷特学过马哲…

ChatGPT与高等教育变革:价值、影响及未来发展

最近一段时间&#xff0c;ChatGPT吸引了社会各界的目光&#xff0c;它可以撰写会议通知、新闻稿、新年贺信&#xff0c;还可以作诗、写文章&#xff0c;甚至可以撰写学术论文。比尔盖茨、马斯克等知名人物纷纷为此发声&#xff0c;谷歌、百度等知名企业纷纷宣布要提供类似产品。…

用Python剪辑视频?太简单了

人生苦短&#xff0c;快学Python&#xff01; 最近我在网上下载一个视频&#xff0c;结果下载到本地是近百个视频片段&#xff0c;为了方便观看只能将这些片段合并为一个视频整体。 不过我并没有搜到能够处理类似情况的小工具&#xff0c;只是发现剪映等软件可以实现视频合并功…

python小应用之moviepy的视频剪辑制作gif图

对视频动画的编辑可以使用python的moviepy库&#xff0c;官方文档&#xff1a; http://zulko.github.io/moviepy/ 1、进入cmd&#xff0c;pip install moviepy 2、使用代码 #import imageio #imageio.plugins.ffmpeg.download() import moviepy.editor as mpy#视频文件的…

视频剪辑教程自学技巧:关于正确的短视频剪辑流程分享

视频剪辑教程自学技巧&#xff1a;关于正确的短视频剪辑流程分享 短视频的火热程度自然不用说&#xff0c;而这大概也是越来越多的人开始做短视频的原因。不过对于大多数的人来说&#xff0c;学习短视频剪辑&#xff0c;其实都是自学&#xff0c;这就导致很多人可能都还不知道…

做视频剪辑必须学会的几个剪辑软件,你知道哪些?

现在短视频非常火热&#xff0c;身边70%以上的人或多或少都会使用手机APP快速剪辑视频&#xff0c;但是如果大家想要通过视频剪辑变现&#xff0c;或者想要自己的视频出彩&#xff0c;那么掌握系统的剪辑方法、剪辑软件的使用是必不可少的&#xff0c;今天小编就给大家分享几款…

什么剪辑软件好用?视频剪辑这样做

什么剪辑软件好用&#xff1f;随着时代的快速发展&#xff0c;剪辑视频已经成为我们几乎人人必会的技能之一了。无论我们是专业人士还是非专业人士&#xff0c;在日常生活中多多少少都会使用到视频剪辑。很多小伙伴们潜意识里会觉得剪辑视频是一件十分困难的事情&#xff0c;其…

学习做视频剪辑,几分钟教会你剪辑技巧

现在很多人做自媒体&#xff0c;也有很多人想做自媒体。而视频剪辑是做自媒体必不可少的&#xff0c;所有我闪在分享视频之前&#xff0c;都会比如剔除一些多余的部分&#xff0c;或者是在视频画面添加图片等等&#xff0c;以此呈现更好的效果。但还是有许多的小伙伴不知道该怎…

百度发布「AI大底座」:一口气把10年AI技术积累打包了

鱼羊 发自 凹非寺量子位 | 公众号 QbitAI 技术创新的节点性时刻&#xff0c;往往是以基建变革的形式展现。 现在&#xff0c;中国AI头号玩家百度&#xff0c;再次明确复现了这一规律&#xff1a; AI大底座&#xff0c;已正式对外推出。 就在刚刚结束的百度AI开发者大会上&#…

打谱软件告诉你:编曲和作曲哪个难?

从各位学习打谱软件作曲大师的朋友反馈来看&#xff0c;我必须这麽说&#xff0c;编曲要能端上台面&#xff0c;一定比作曲难&#xff0c;但要作出一首好曲也绝对是不容易。 以进入的门槛来说&#xff0c;编曲当然是需要比较高的门槛&#xff0c;除了要懂乐理&#xff0c;各种…

guitar pro8.1免费的吉他学习辅助软件

从名字上看就知道这是一款针对吉他谱开发的软件&#xff0c;相信大多数吉他爱好者都用过或者听过这款软件。可以通过鼠标和键盘的操作对吉他谱的内容进行输入&#xff0c;支持四线谱&#xff0c;五线谱、六线谱等曲谱的制作。软件涵盖了几乎所有的吉他演奏技巧符号&#xff0c;…

Guitar Pro8最新版 学吉他打谱必备的APP

Guitar Pro以 GTP 结尾的曲谱文件都必须用 Guitar Pro 才能打开。Guitar Pro 凭借着其便利的制谱和读曲谱环境&#xff0c;在各大谱库论坛里都占据着一席之地&#xff0c;喜欢吉他的朋友一定略有耳闻。Guitar Pro 是 Windows 和 Mac OS 上可用的软件程序&#xff0c;允许所有音…

Guitar Pro8免费吉他曲谱mySongBook

每周都会发布新的谱子&#xff0c;目前已有有数千首歌曲可供选择&#xff0c;在谱库中&#xff0c;您能找到 Guns N Roses&#xff0c;Miles Davis&#xff0c;Ed Sheeran 等人的经典曲目。开头我们先做一个小实验&#xff1a;现在打开你电脑里存放曲谱的文件夹&#xff0c;里面…

Ziipoo(易谱)简谱编辑制作打谱软件免费版下载 WiN+MAC+安卓+Linux

更新说明&#xff1a; 最新版更新说明[2491版&#xff0c;2021-05-30日更新] 2474版开始支持原生的ARM芯片mac(M1芯片的mac) 2440版开始linux支持内置浏览器功能和mac/win平台同步。 2429版开始支持多文档及重做功能。 2362版开始提供原生linux版。 2346版开始支持内部浏览器。…

Guitar Pro8优秀的自动扒谱软件

对于一些技术娴熟的音乐人来说&#xff0c;不仅需要演奏已有的乐谱&#xff0c;有时还需要从听到的其他音乐中将谱子扒下来。扒谱时可以借助扒谱软件&#xff0c;比如Guitar Pro&#xff0c;就是一款优秀的扒谱软件。下面就和大家分享一下guitar pro能自动扒谱吗&#xff0c;gu…

Guitar Pro8中文版打谱软件新功能介绍

Guitar Pro 8 刚刚已经发布了&#xff0c;带来了大量的新功能。从老版本第7版更新后&#xff0c;新功能现在包括音轨、虚拟踏板、嵌套连音和进一步的定制。 增强和更新 Guitar Pro 8 增加了很多新功能。这些功能对任何想在吉他上写、记、学新音乐的吉他手来说都是很有意义的。…

计算机简谱转五线谱乐谱,五线谱如何转成简谱-五线谱转简谱图文教程 - Iefans...

五线谱如何转成简谱&#xff1f;很多朋友在使用中都存在这个疑惑&#xff0c;那就来看看iefans小编为大家分享的五线谱转简谱图文教程吧&#xff0c;感兴趣的朋友可以了解一下哦~ 方法/步骤分享&#xff1a; 1、在电脑上打开EOP NMN Master。 2、在EOP NMN Master主页左上角的文…

Guitar Pro8最新五线谱转六线谱软件

提到吉他谱的编写&#xff0c;有一款软件总是被第一时间想到&#xff0c;那就是Guitar Pro。 Guitar Pro8所开启的音乐未来&#xff0c;不仅仅是一种全新的学习乐器方式。更在于对整个乐队的掌控&#xff0c;将弦乐的悠然和打击乐的劲爆尽收其间&#xff01; 同时&#xff0c;…