`
langzhe
  • 浏览: 278573 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

链表的不同的插入操作的思考

    博客分类:
  • c
阅读更多

1、此函数中的head被定义为static,所以不需要用return来返回

来自http://learn.akae.cn/media/ch26s01.html

insert函数虽然简单,其中也隐含了一种特殊情况(Special Case)的处理,当head为NULL时,执行insert操作插入第一个节点之后,head指向第一个节点,而第一个节点的next指针域成为NULL,这很合理,因为它也是最后一个节点。所以空链表虽然是一种特殊情况,却不需要特殊的代码来处理,和一般情况用同样的代码处理即可,这样写出来的代码更简洁

,但是在读代码时要想到可能存在的特殊情况。 

当然,insert函数传进来的参数p也可能有特殊情况,传进来的p可能是NULL,甚至是野指针,本章的函数代码都假定调用者的传进来的参数是合法的,不对参数做特别检查。事实上,对指针参数做检查是不现实的,如果传进来的是NULL还可以检查一下,如果传进来的是野指针,根本无法检查它指向的内存单元是不是合法的,C标准库的函数通常也不做这种检>查,例如strcpy(p, NULL)就会引起段错误。 

void insert(link p)

{

        p->next = head;

        head = p;

}

2、远离C语言好久了所以打算不用static实现这个单链表

 

链表的插入操作,每个插入的新元素都会变成新的表头

受Erlang编程的影响,每个函数都想返回一个值

 

 87 struct node * insert(struct node *list, char ch)                                                          

 88 {

 89     struct node *head = create_node(ch);

 90     head->next = list;  

 91     return head;        

 92 }

 

3、写完2、后感觉怪怪的,觉得在C语言中可以借助指针,没必要直接返回,如下:

 

164 void insert_no_return(struct node *list, char ch)

165 {

167     struct node *node = create_node(ch);

168     node->next = list->next;

169     list->next=node;                                                                                      

170 }

 

如果list传进的是 NULL程序运行,肯定出错。想判断一下,LinuxC编程一站式学习的作者提到,是可以添加判断NULL问题,但如果使用者传一个野指针就无法检查了。 继续思考这问题后面研究

0
0
分享到:
评论

相关推荐

    数据结构实验

    2.掌握顺序表的基本操作,实现顺序表的插入、删除、查找以及求并集等运算。 3.掌握对多函数程序的输入、编辑、调试和运行过程。 二、实验要求 1.预习C语言中结构体的定义与基本操作方法。 2.对顺序表的每个基本...

    数据结构与算法的学习与思考.zip

    基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和空间复杂度。 算法: 算法设计:研究如何将解决问题的步骤形式化为一系列指令,...

    传智播客扫地僧视频讲义源码

    08_链表的插入操作和辅助指针变量分析_传智扫地僧 09_链表的删除和销毁 10_链表的逆置_传智扫地僧 11_链表的逆置_课堂答疑 12_课堂答疑pheadnextnext 13_中午课程回顾 14_传统链表和非传统链表 15_链表的技术体系...

    数据结构课程设计 四题

    本次实习的主要目的在于熟悉线性表的基本运算在两种存储结构上的实现,其中以熟悉各种链表的操作为侧重点。通过本次实习还可帮助读者复习高级语言的使用方法。 [问题描述] 约瑟夫(Joeph)问题的一种描述是:编号为...

    算法导论中文版

     2.1 插入排序  2.2 分析算法  2.3 设计算法  2.3.1 分治法  2.3.2 分析分治算法  思考题  本章注记 第3章 函数的增长  3.1 渐近记号  3.2 标准记号与常用函数  思考题  本章注记 第4章 分治...

    LeetCode解题总结

    6.4 使用插入排序来排序链表 6.5 归并排序排序链表 6.6 第一个缺少的正数 6.7 排序颜色 7. 查找 7.1 在排序数组中查找数出现的范围 7.2 在排序数组中查找给定值的插入位置 7.3 在二维排序数组中查找给定值 7.4 在...

    计算机二级C语言考试题预测

    线性链表是非线性结构 D. 二叉树是线性结构 (22) 下列关于栈的叙述中正确的是(D) A. 在栈中只能插入数据 B. 在栈中只能删除数据 C. 栈是先进先出的线性表 D. 栈是先进后出的线性表 (23) 下列关于队列的叙述中正确的...

    LeetCode判断字符串是否循环-leetcode:leetcode练习

    逆向思考:根据“守则”,倒退边界场景出现的场景,以及应该进行的操作,保证边界 守则 守则1:(空指针引用)凡是涉及指针的使用,前面必须做非空判断 守则2:(边界问题)根据其他指针规则,倒推边界条件出现的场景,...

    leetcode算法题主函数如何写-leetcode_solution:这是我在leetcode上刷题是提交成功的代码

    哨兵节点广泛应用于树和链表中,如伪头、伪尾、标记等,它们是纯功能的,通常不保存任何数据,其主要目的是使链表标准化,如使链表永不为空、永不无头、简化插入和删除。 解决问题: 简化移除链表元素中要移除的元素...

    二叉树排序树建立及平衡处理

    这个课程设计的各个基本操作大部分都在我的综合性实验中实现了,所以做这个主要攻克插入和删除这两个算法!其中插入在书本上已经有了,其中的右平衡算法虽然没有给出,但通过给出的左平衡算法很容易就可以写出右平衡...

    数据结构课程设计-银行账户管理系统.doc

    本程序需要先建立结点类模板,然后使用链表的基本操作应用实现各个程序的实现, 头插法先建立链表使之成当前操作数据基础,然后可以使用节点的删除进行储户的销户 ,结点的插入的应用成为程序的开户(注意:建立新的...

    积分兑换系统java源码-leetcode:每天坚持两道题,整理数据结构与算法相关代码

    其最大特点是支持随机访问,但删除,插入操作低效。 数组在定义时需要预先指定大小,因为需要分配连续的内存空间。 Java中的ArrayList支持动态扩容,当存储空间不够时,其空间自动扩容为1.5倍大小。 数组和链表的...

    数据结构–队列(Java实现)

    队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队...

    lrucacheleetcode-LeetCode:复制和思考

    双向链表的删除和插入节点 20200525 190. Reverse Bits 二进制位数 二进制的&和>> << >>== 20200525 172. Factorial Trailing Zeroes 数学分析 递归和循环 20200525 191. Number of 1 Bits 二进制 二进制如何...

    Absolute C++中文版(原书第2版)-完美的C++教程,文档中还包含英文版

    17.1.4 向链表中插入或移除节点 495 17.1.5 搜索链表 498 17.2 链表的应用 504 17.3 迭代器 514 17.3.1 指针作为迭代器 514 17.3.2 迭代器类 515 17.4 树 520 第18章 异常处理 535 18.1 异常处理基础 535 ...

    leetcode中国-leetcode:记录我解决和解释LeetCode问题的方式。(Java)

    这个存储库展示了我如何思考 LeetCode 问题的解决方案,以及我想如何向其他人(包括面试官)解释它们。 所有的解决方案都在 Java 中。 必须掌握 基本问题,其解决方案可以成为更大问题的一部分。 你需要在面试中一次...

    数据结构课程设计航空订票系统.doc

    需要说明的是插入、查找 、修改和删除这些线性表的基本操作的流程图在订票系统源程序中没有单独函数,是因 为此系统主要是运用线性表的基本操作解决实际问题,具体问题所对应的基本操作代码 有所不同,但思维是相同...

    C++大学教程,一本适合初学者的入门教材(part2)

    15.4 链表 15.5 堆栈 15.6 队列 15.7 树 小结 术语 自测练习 自测练习答案 练习 特殊小节:建立自己的编译器 第16章 位、字符、字符串和结构 16.1 简介 16.2 结构的定义 16.3 结构的初始化 16.4 函数和结构 ...

    C++大学教程,一本适合初学者的入门教材(part1)

    15.4 链表 15.5 堆栈 15.6 队列 15.7 树 小结 术语 自测练习 自测练习答案 练习 特殊小节:建立自己的编译器 第16章 位、字符、字符串和结构 16.1 简介 16.2 结构的定义 16.3 结构的初始化 16.4 函数和结构 ...

    用C编写班级成绩管理系统

    在对链表操作时,要特别链表指针的移动(p=p->next)和链表尾的判断 (p= =NULL)。没有指针的移动,就很容易出现死循环。而在运行过程中不能控制。所以你就会认为是死机。如果没有链表尾的判断。就会在运行过程出现...

Global site tag (gtag.js) - Google Analytics