`
langzhe
  • 浏览: 286718 次
  • 性别: 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. 插入元素:`insertList_after`函数允许在链表的指定位置(由索引i指示)之后插入新元素x。它遍历链表找到正确的位置,然后插入新节点。 3. 删除元素:`delete_LinkList`函数根据元素值x删除链表中的节点。函数...

    链表基本操作实验报告.doc

    链表的基本操作包括链表的创立、输出、插入、删除、查找等。本实验报告的主要目的是通过实验和编程实践,掌握链表的基本操作和算法设计。 一、链表的定义和基本操作 链表是一种动态的数据结构,它由多个结点组成,...

    C语言自学链表,单向链表,双向链表,适合新手学习。

    常见的单向链表操作包括创建、插入、删除节点以及遍历链表。 - **创建链表**:通常从一个空链表(即头节点)开始,然后逐步添加节点。 - **插入节点**:在链表中的某个位置插入新节点,需要修改前后两个节点的...

    双向循环链表源码

    插入函数根据插入位置的不同进行相应操作,删除函数处理节点间的指针连接变化,遍历函数则按循环顺序打印链表中的所有元素。 在实际应用中,双向循环链表常被用于需要频繁进行双向操作的场景,如实现浏览器的历史...

    计算机科学:C++中链表数据结构详解及其基本操作实现

    此外还详尽解析了用C++语言分别针对单链表、双链表、循环链表这三种类型的典型实例化结构进行编码的具体步骤,涵盖了节点创建、多种方式下的节点插入和移除以及列表的完整遍历等多方面的实用操作指南。 适合人群:...

    链表倒序__实现单向链表倒序

    基本思路是将链表的反转问题分解为两部分:首先反转当前节点之后的部分,然后将当前节点插入到反转后的链表的头部。递归的终止条件是链表为空或只有一个元素。递归法虽然直观,但可能会导致较大的栈空间消耗。 ```...

    单链表操作验证

    插入操作的时间复杂度为O(n)。 3. **删除节点**:删除操作涉及找到要删除的节点并更新其前一个节点的指针以指向删除节点的下一个节点。同样,时间复杂度为O(n)。 4. **遍历链表**:通过从头节点开始,依次访问每个...

    数据结构链表

    接下来,我们需要实现链表的基本操作,如创建链表、插入节点、删除节点、遍历链表等。创建链表通常从空链表开始,通过不断插入节点来构建。插入节点时,我们需要找到合适的位置,并更新前后节点的指针。删除节点时,...

    比特数据结构课件-Lesson3-顺序表-链表.pdf

    - **问题与思考**:顺序表在中间或头部插入删除操作时效率较低(O(N)),且增容可能导致额外开销和空间浪费。为解决这些问题,链表作为一种灵活的数据结构被引入。 2. **链表**: - **概念与结构**:链表是一种非...

    04-反转链表.md

    链表的查询效率低,因为需要从头节点开始遍历,但是它在插入和删除操作上效率很高,因为不需要像数组那样移动大量元素。 在文件中还提到了单向链表和双向链表的区别,单向链表的节点只包含数据和指向下一个节点的...

    C++用链表完成学籍管理系统

    相较于数组,链表无需连续存储空间,适合于频繁插入和删除操作的场景,如本题中的学籍管理系统。 #### 功能模块分析 1. **创建链表(`createlist()`)**: - 用户输入学生信息,包括学号、姓名和成绩,每输入一组...

    [计算机]C程序设计基础课程设计设计报告_链表建立学生成绩管理系统.doc

    综上所述,这个C程序设计基础课程设计项目,通过链表和文件操作,实现了学生成绩管理系统的各项功能,为学习者提供了实际操作数据结构和文件系统的宝贵经验。在设计过程中,不仅提升了编程技能,也锻炼了解决问题和...

    数据结构实验1_数据结构实验1_数据结构实验_

    链表与数组相比,更灵活地处理插入和删除操作,因为它们不需要移动元素。树结构如二叉树和多路搜索树,是解决查找、排序等问题的重要工具,它们在文件系统、数据库索引等方面有广泛应用。图数据结构用于表示对象之间...

    数据结构实验代码线性表的存储结构定义及基本操作(必做

    - 实现循环链表的创建、插入、删除等操作。 #### 实验指导 - **实验准备**: - 理解线性表的概念及其在顺序表和链表中的实现差异。 - 准备好开发环境(推荐使用Visual C++或其他支持C/C++的IDE)。 - **实验步骤...

    java-leetcode题解之第23题合并K个升序链表.zip

    同时,为了优化性能,我们还可以使用最小堆(二叉堆)的数据结构,这可以保证插入和删除的时间复杂度为O(logK),其中K是链表的数量。 通过解决这个问题,你可以深入理解链表数据结构、优先队列的使用,以及如何在...

    自己写的单链表的增删查改

    插入操作需要改变插入点前后节点的指针关系。 3. **删除元素**:根据给定的条件(如节点值或位置)找到目标节点并删除,同时调整相邻节点的指针以保持链表的连续性。 4. **查找元素**:遍历链表,根据特定条件(如...

    C语言实现2048

    `gotoxy`通常不是C语言的标准库函数,但可以在不同的操作系统环境下实现,例如在Windows环境下,可以使用`conio.h`库中的`gotoxy`函数。 - **移动方块**:根据用户输入的方向,遍历棋盘,逐行或逐列进行合并操作。...

    C语言培训 指针 数组 结构体 链表

    链表提供了一种灵活的方式来管理内存和数据,特别是在处理大量数据或需要高效插入和删除操作时。 **四、预处理器、sizeof和参考书籍** 预处理器在编译阶段处理宏定义和其他指令,如`#include`。`sizeof`运算符用于...

Global site tag (gtag.js) - Google Analytics