单链表:先回顾单链表的特点  逻辑相邻 物理上不一定相连

首先初始化单链表,其中主要保存的是该节点自身的值以及下个节点的地址。

有效节点结构体设计:
​
struct Node{
​
int data;//数据域
​
struct Node* next;//指针域
​
}

以下是单链表的插入以及删除操作:

(一)插入操作

单链表的插入主要分为头插,尾插,以及按位置插入这三种来进行操作。

(1)头插

bool Insert_head(PNode pn, int val)
{assert(pn!=NULL);//判断不为空//1.申请新节点struct Node* pnewnode = (struct Node*)malloc(1 * sizeof(struct Node));assert(pnewnode != NULL);pnewnode->data = val;pnewnode->next = NULL; // 这里可写可不写//2.找到合适的插入//头插时插入在头结点的后边,所以不用找//3.插入pnewnode->next = p->next;//先让C指向B  (不能先断开AB中间的线  不然找不到B)p->next = pnewnode;//此时再让A指向Creturn true;
}

(2)尾插

bool Inseret_tail(PNode pn, int val)
{//1.申请新节点struct Node* pnewnode = (struct Node*)malloc(1 * sizeof(struct Node));assert(pnewnode != NULL);pnewnode->data = val;pnewnode->next = NULL; // 这些步骤都与前面的一样//2.找到合适的插入位置(尾插,需要一个临时指针p指向尾结点)struct Node* p = pn;for (p; p->next != NULL; p = p->next);//3.插入pnewnode->next = p->next;p->next = pnewnode;return true;
}

(3)按位置插入(将C插入到AB)

bool Inseret_pos(PNode pn, int pos, int val)
{assert(pos >= 0 && pos <= Get_length(pn));//1.申请新节点struct Node* pnewnode = (struct Node*)malloc(1 * sizeof(struct Node));assert(pnewnode != NULL);//确保申请成功pnewnode->data = val;//传入valpnewnode->next = NULL; // //2.找到合适的插入位置(按位置插入AB之间,在这里发现规律,pos等于几则让指向头结点的指针p向后走pos步,此时p指向AB的A)struct Node* p = pn;for (int i = 0; i < pos; i++){p = p->next;}//3.插入pnewnode->next = p->next;//先让C指向B  (不能先断开AB中间的线  不然找不到B)p->next = pnewnode;//此时再让A指向Creturn true;
}

按位置插入这里改变pos的值便可以实现头插和尾插。

(二)删除操作

(1)头删

bool Del_head(PNode pn)
{//assertif (IsEmpty(pn)){return false;}struct Node* p = pn->next;//pn是头结点 pn->next则是第一个有效节点地址  即头删的节点   则此时p指向待删除节点//将待删除节点跨越指向(让带删除节点上家的next域指向下家的地址,而下家的地址在待删节点p的next中)pn->next = p->next;free(p);p = NULL;return true;
}

(2)尾删

bool Del_tail(PNode pn)
{//assertif (IsEmpty(pn)){return false;}//找到待删除节点用p指向(尾删的待删除节点就是倒数第一个节点)struct Node* p = pn;for (p; p->next != NULL; p = p->next);//当P指向的next域为空停下来//q指向倒数第二个节点struct Node* q = pn;for (q; q->next != p; q = q->next);q->next = pn;//q->next = p->next;free(p);return true;}

(3)按位置删    同样这里改变pos的值能实现头删和尾删

bool Del_pos(PNode pn, int pos)
{//assertassert(pos >= 0 && pos < Get_length(pn));if (IsEmpty(pn))//注意这里的判空操作在后面有定义{return false;}//先找到待删除节点的上一个节点,用q指向  规律:pos等于几 q就向后走几步struct Node* q = pn;for (int i = 0; i < pos; i++){q = q->next;}//此时 q指向待删除节点的上一个节点//接下来 再让p指向待删除节点 待删除节点在q的next中struct Node* p = q->next;//跨越指向,再释放q->next = p->next;free(p);//删除待删除节点return true;
}bool IsEmpty(PNode pn)
{return pn->next == NULL;
}

(4)按值删

bool Del_val(PNode pn, int val)
{//assertif (IsEmpty(pn)){return false;}struct Node* p = Search(pn, val);//判断value是否存在if (p == NULL)//search返回的地址为空代表没找到{return false;}//此时待删除节点存在,  且用指针p指向struct Node* q = pn;for (q; q->next != p; q = q->next);//再申请一个临时指针q  让q指向p的上一个节点q->next = p->next;free(p);//跨越指向,和释放return true;
}//查找
struct Node* Search(PNode pn, int val)
{//assertfor (struct Node* p = pn->next; p != NULL; p = p->next){if (p->data == val){return p; //找到 则扔出去}}return NULL; //没找到,返回NULL地址
}

以上便是一些单链表的相关操作,简单可直接拿去使用。

数据结构单链表插入和删除操作相关推荐

  1. 单链表插入、删除操作单步解析(十三)

    1.单链表定义 每个结点包含数据域和指针域,指针域存储下一个结点的地址.  2.插入操作 在第i个结点前面,插入一个e结点. 分析: <1>.s->next = p->next ...

  2. 双链表插入、删除操作单步解析(十四)

    1.双链表定义 单链表只能向后操作,不能向前操作.双链表可以向前和向后操作. 双链表特点:以下图解释 一个前驱指针:ai的前驱指针,指向ai-1结点,即存放ai-1的地址. 数据域:存放数据 一个后驱 ...

  3. 单链表插入、删除和查找操作

    一.链表的定义: 链表是一种物理存储结构上非连续存储结构. 二.节点的表示: 节点(Node)==>数据+补充信息 三.单链表的插入: 1.头插法 2.尾插法 3.任意位置插入 class No ...

  4. 数据结构单链表的创建以及简单操作

    在数据结构中: 目录 一.数据节点类型结构体封装 二.创建单链表 1.创建链表 2.头部插入 3.遍历链表 4.尾部插入 5.释放链表 链表可以解决顺序表无法开辟连续空间的问题,大大提高了内存的利用率 ...

  5. 数据结构单链表的基础操作(C语言)

    效果如图: 代码及详情如下:(文末总结) 目录 //主函数 //菜单 //创建链表 //插入结点 //删除结点 //查找结点 //链表长度 //打印链表 //清空链表 //逆置链表 //删除偶数元素结 ...

  6. [数据结构]顺序单链表插入

    一,单链表插入操作 [cpp] view plaincopy typedef struct NODE { struct NODE *link; int value; }Node; #include & ...

  7. 本科课程【数据结构与算法】实验1——线性表的顺序表示及插入、删除操作(C++实现)

    大家好,我是[1+1=王], 热爱java的计算机(人工智能)渣硕研究生在读. 如果你也对java.人工智能等技术感兴趣,欢迎关注,抱团交流进大厂!!! Good better best, never ...

  8. Java数据结构与算法-SingleLinkedList单向链表插入,删除,查找,修改详解及代码

    SingleLinkedList单向链表插入,删除,查找,修改详解及代码 单向链表学习目标 1. 链表的介绍 2. 单向链表的存储特点以及原理 3. 基本操作:插入,删除等 4. 单向链表应用场景举例 ...

  9. 数据结构:在一个单链表中,若删除p指向节点的后继节点,则执行的操作为:( )

    在一个单链表中,若删除p指向节点的后继节点,则执行的操作为:( ) A.q=p->next; p->next=p->next->next; free(q) B.p=p-> ...

最新文章

  1. Datawhale实验室
  2. CPU调度(CPU Scheduling)
  3. CV之NS之VGG16:基于预训练模型VGG16训练COCO的train2014数据集实现训练《神奈川冲浪里》风格配置yml文件
  4. ORACLE 各种闪回操作
  5. Spring Data JPA 从入门到精通~思维导图
  6. 深度优化LNMP之Nginx [2]
  7. WCF学习之旅—WCF概述(四)
  8. 047、JVM实战总结:高级工程师的硬核技能:JVM的Full GC日志应该怎么看?
  9. Java String常用的两个方法
  10. vmware虚拟化之vswitch详细资料
  11. AAAI'22 | 中稿的论文网友找出致命漏洞?
  12. [ctfshow]web入门——命令执行(web54-web71)
  13. BiLSTM-CRF模型理解
  14. 修改element插件样式---select样式
  15. 百度地图导航工具类,包含骑行步行及驾车导航
  16. iptables 流量统计
  17. 4底2分化查找程序的作业树
  18. TensorRT INT8量化原理与实现(非常详细)
  19. 「Python数据分析系列」10.使用数据
  20. C语言:用贪心策略计算活动安排问题的最优解

热门文章

  1. js和java导出txt文件怎么打开文件_JS本地文件操作,JS读写txt文件
  2. ubuntu关机卡死
  3. CentOS Linux 内核升级
  4. JS生成 UUID的四种方法
  5. 国自然php代码,2020国自然单细胞项目申请——你的学科代码申请对了吗? | 单细胞专题之国基金...
  6. 人脸识别眨眼张嘴软件_人脸识别张张嘴眨眨眼jar、css、js
  7. c语言如何用fscanf将字符串读取,fscanf如何使用C语言处理%c和%s
  8. C# /.NET6 实现语音转文字(科大讯飞语音转文字接口)
  9. 解决idea运行Tomcat项目时网页自动打开test1_Web_exploded文件并且打开其他链接时报错404的问题
  10. qq令牌64位密钥提取_QQ令牌工具 活令牌查询动态密码(大哥牌)