链表
只爱编程的菜鸟
这个作者很懒,什么都没留下…
展开
-
双链表的算法之删除节点
双链表的算法之删除节点#include <stdio.h>#include <stdlib.h>struct node{ int data; //有效数据 struct node* pPrev; //前向指针,指向前一个节点 struct node* pNext; //后向指针,指向后一个节点};struct node* create_node(int data){ struct node* p = (struct原创 2021-12-23 22:04:08 · 2360 阅读 · 0 评论 -
双链表的算法之遍历节点
双链表的算法之遍历节点(1)双链表是单链表的一个父集。双链表中如何完全无视pPrev指针,则双链表就变成了单链表。这就决定了双链表的正向遍历(后向遍历)和单链表是完全相同的。(2)双链表中因为多了pPrev指针,因此双链表还可以前向遍历(从链表的尾节点向前面依次遍历直到头节点)。但是前向遍历的意义并不大,主要是因为很少有当前当了尾节点需要前向遍历的情况。(3)总结:双链表是对单链表的一种有成本的扩展,但是这个扩展在有些时候意义不大,在另一些时候意义就比较大。因此在实践用途中要根据业务要求选择适合的链表原创 2021-12-23 21:13:13 · 688 阅读 · 0 评论 -
双链表的算法之插入节点
双链表的算法之插入节点1.尾部插入和头部插入#include <stdio.h>#include <stdlib.h>struct node{ int data; //有效数据 struct node* pPrev; //前向指针,指向前一个节点 struct node* pNext; //后向指针,指向后一个节点};struct node* create_node(int data){ struct node*原创 2021-12-23 20:54:13 · 1247 阅读 · 0 评论 -
双链表的引入和基本实现
双链表的引入和基本实现1.单链表的局限性(1)单链表是对数组的一个扩展,解决了数组的大小比较死板不容易扩展的问题。使用堆内存来存储数据,将数据分散到各个节点之间,其各个节点在内存中可以不相连,节点之间通过指针进行单向链接。链表中的各个节点内存不相连,有利于利用碎片化的内存。(2)单链表各个节点之间只由一个指针单向链接,这样实现有一些局限性。局限性主要体现在单链表只能经由指针单向移动(一旦指针移动过某个节点就无法再回来,如果要再次操作这个节点除非从头指针开始再次遍历一次),因此单链表的某些操作就比较麻烦原创 2021-12-23 20:10:59 · 86 阅读 · 0 评论 -
单链表的算法之逆序
单链表的算法之逆序1.什么是链表的逆序(1)链表的逆序又叫反向,意思就是把链表中所有的有效节点在链表中的顺序给反过来。2.单链表逆序算法分析(1)思路:首先遍历原链表,然后将原链表中的头指针和头节点作为新链表的头指针和头节点,原链表中的有效节点挨个依次取出来,采用头插入的方法插入新链表中即可。(2)链表逆序 = 遍历 + 头插入在这里插入代码片#include <stdio.h>#include <strings.h>#include <stdlib.h>原创 2021-12-23 19:52:10 · 3057 阅读 · 0 评论 -
单链表的算法之删除节点
单链表的算法之删除节点1.为什么要删除节点(1)有时候链表节点中的数据不想要了,因此要删掉这个节点。2.删除节点的2个步骤(1)第一步:找到要删除的节点;第二部:删除这个节点3.如何找到待删除的节点(1)通过遍历来查找节点。从头指针+头结点开始,顺着链表依次将各个节点拿出来,按照一定的方法比对,找到我们要删除的那个节点。4.如何删除一个节点(1)待删除的节点不是尾结点的情况:首先把待删除的节点的前一个节点的pNext指针指向待删除的节点的后一个节点的首地址(这样就把这个节点从链表中摘出来了)原创 2021-12-22 21:24:12 · 7814 阅读 · 0 评论 -
单链表的算法之遍历节点
单链表的算法之遍历节点1.什么是遍历?(1)遍历就是把单链表中的各个节点挨个拿出来,就叫遍历。(2)遍历的要点:一是不能遗漏、二是不能重复、追求效率。2.如何遍历单链表(1)分析一个数据结构如何遍历,关键是分析这个数据结构本身的特点。然后根据本身特点来制定它的遍历算法。(2)单链表的特点就是由很多个节点组成,头指针+头节点为整个链表的起始,最后一个节点的特征是它内部的pNext指针值为NULL。从起始到结尾中间由各个节点内部的pNext指针来挂接。由起始到结尾的路径有且只有一条。单链表的这些特点原创 2021-12-22 20:19:11 · 2432 阅读 · 0 评论 -
单链表的算法之头部插入节点
1.从头部添加新节点(1)注意写代码过程中的箭头符号,和说话过程中的指针指向。这是两码事,容易搞混。箭头符号实际上是用指针方式来访问结构体,所以箭头符号的实质是访问结构体中的成员。更清楚一点说程序中的箭头和链表的连接没有任何关系;链表中的节点通过指针指向来连接,编程中表现为一个赋值语句(用=来进行连接),实质是把后一个节点的首地址,赋值给前一个节点中的pNext元素做为值。#include <stdio.h>//构建一个链表的节点struct node{ int data;原创 2021-12-22 19:50:06 · 1850 阅读 · 0 评论 -
单链表的算法之尾部插入节点
单链表的算法之插入节点1.访问链表中各个自己的指针(1)只能用头指针,不能用各个节点自己的指针。因为实际中我们保存链表不会保存各个节点的指针,只能通过头指针来访问链表节点。(2)前一个节点内部的pNext指针能帮助我们找到下一个节点。2.将创建节点的代码封装成一个函数(1)封装时的关键点就是函数的接口(函数参数和返回值)的设计3.从链表尾部插入新节点#include <stdio.h>//构建一个链表的节点struct node{ int data;原创 2021-12-22 17:24:34 · 5163 阅读 · 0 评论 -
单链表的实现
单链表的实现:1.单链表的节点构成(1)链表是由节点组成的,节点中包含:有效数据和指针。(2)定义的struct node只是一个结构体,本身并没有变量生成,也不占用内存。结构体定义相当于为链表节点定义了一个模板,但是还没有一个节点,将来在实际创链表时需要一个节点时用这个模板来复制一个即可。2.堆内存的申请和使用(1)链表的内存要求比较灵活,不能用栈,也不能用data数据段。只能用堆内存。(2)使用堆内存来创建一个链表节点的步骤:1.申请堆内存,大小为一个节点的大小(检查申请结果是否正确);2.原创 2021-12-22 16:41:44 · 183 阅读 · 0 评论 -
链表添加/遍历/统计/查找/插入/删除算法实现
#include <stdio.h>#include <stdlib.h> struct Test { int data; struct Test *next; }; struct Test* insertFromfor(struct Test *head,int data,struct Test *new) {原创 2020-10-05 17:36:40 · 521 阅读 · 0 评论 -
链表动态创建之头/尾插法
实现代码:#include <stdio.h>#include <stdlib.h>struct Test{ int data; struct Test *next;};int printLink(struct Test *head){ struct Test *point; point = head; whi原创 2020-10-05 17:21:10 · 157 阅读 · 0 评论