首页 > 其他分享 >[数据结构10分钟入门] 面向初学者从零实现(基于C语言)-- 单链表

[数据结构10分钟入门] 面向初学者从零实现(基于C语言)-- 单链表

时间:2022-09-04 10:00:32浏览次数:77  
标签:node 10 -- list C语言 链表 next 节点 指针

一、链表是什么

    链表是一种通过指针串联在一起的线性结构,在内存中是分散存储的(数组在内存中连续分布),链表由一系列节点组成,每个节点都由数据域和指针域组成。主要有三种类型的链表:

        1、单链表(本章介绍内容)

        2、双链表

        3、循环链表 

链表与数组对比:

  插入/删除 时间复杂度 查询 时间复杂度 适用场景
数组 O(n) O(1) 内容固定,查询较为频繁
链表 O(1) O(n) 内容不固定,较少查询

二、单链表定义

1、一个单链表的节点:

c9d8a72482148df806626a6c32dfa153.png​编辑

  • 数据域data:存放数据的地方
  • 指针域*next:指向下一个节点的地址

2、将节点链接起来,每个节点的*next指针指向下一节点,最后一个节点的指针指向NULL,就形成了单链表。

d3a3aff337f130ec2b526390bf7bae21.png​编辑

3、头指针的作用

    设置一个头指针指向整条链表的首节点,这样对首节点的操作将和其余节点一致,无需使用两套处理逻辑。

三、节点结构体

typedef struct node {

    int data;   /**数据域*/

    struct node *next;    /**指向下一个节点*/      

}list_node;

因为每个节点的数据结构都是一样的,都为struct node,所以指针域*next的类型也是struct node。

四、创建链表

list_node* list_init()

{

    /**从内存动态申请 #1*/

    list_node *head = (list_node *)malloc(sizeof(list_node));

    /** #2*/

    if(head == NULL) {

        return NULL;

    }

    /**初始化头指针 #3*/

    head->data = 0;

    head->next = NULL;  //链表暂无节点,指针赋为NULL

    /** #4*/

    return head;

}

1、malloc动态申请list_node大小(8个字节)的内存,作为链表的头指针;

2、if(head == NULL)   对malloc的返回值进行判断;

3、初始化头指针,头指针的数据域data没有什么作用,可以用来代表链表的节点数量;

4、返回头指针。

五、插入节点

int list_insert(list_node *head, int data, int pos/** #1*/)

{

    list_node *p = head;



    /**如果要插入的位置比链表长,则属于非法操作 #2*/

    if (pos > p->data) {

        return -1;

    }



    /**动态申请一个节点*/

    list_node *node = (list_node *)malloc(sizeof(list_node));

    if (node == NULL) {

        return -1;

    }

    node->data = data;

    node->next = NULL;



    /**遍历链表,找到要插入的位置 #3*/

    for (int i=0; i<pos; i++) {

        p = p->next;

    }



    /**插入节点 #4*/

    node->next = p->next;

    p->next = node;



    /**链表长度加1*/

    head->data++;

   

    return 0;

}

1、参数pos代表节点插入的位置,首节点的位置为0;

2、对插入位置进行判断,不能大于链表长度,异常返回-1;

3、遍历链表找到新节点要插在哪个节点之后,p指向这个节点;

4、如下图假设node4要插入到node1与node2之间,此时的p指针指向节点为node1,新创建的节点指针node指向node4;

node->next = p->next;   即为 node4->next=node1->next=node2

​p->next = node;   即为 node1->next=node4

d6c2667cd7007e47f47d3ce5b00b6a0c.png​编辑

六、删除节点

int list_delete_node(list_node *head, int pos)

{

    list_node *p = head;



    /**删除的位置比链表长,则属于非法操作*/

    if (pos > p->data) {

        return -1;      

    }

    /**遍历链表,找到要删除的节点的前一个节点的指针*/

    for (int i=0; i<pos; i++) {

        p = p->next;

    }

    /**记录将被删除的节点, 用于最后释放该节点内存 #1*/

    list_node *p2 = p->next;

   

    /**跳过被删除的节点,释放内存,完成删除 #2*/

    p->next = p->next->next;

    free(p2);

   

    head->data--;

    return 0;

}

1、被删除的节点的内存需要进行释放,避免内存泄漏;

2、如下图,假设要删除node2,则只需直接将node1的next指针指向node3

871ce07718f5cdc475ede2933ac4ec3f.png

七、测试

目录结构

./

├── build                    //编译目录

├── CMakeLists.txt    //cmake 配置文件

├── list_01.c             //源码

├── list_01.h

└── test.c                   //测试文件

工程采用cmake构建,文件均经过测试,编译步骤如下:

1、mkdir build && cd build

2、cmake ../ && make

3、./list_test

源码路径在公众号(Linux杂记)同标题的文章里哈!!

 

标签:node,10,--,list,C语言,链表,next,节点,指针
From: https://www.cnblogs.com/linux-misc/p/16654317.html

相关文章

  • 【云原生】K8s pod 动态弹性扩缩容 HAP(metrics-server)
    目录一、概述二、安装metrics-server1)HAP前提条件2)开启APIAggregator3)开始安装metrics-server三、HorizontalPodAutoscaler工作原理1)原理架构图2)HPA扩缩容算法1、......
  • 使用 Python 改善您的交易
    使用Python改善您的交易Photoby奥斯汀蓟on不飞溅Python是一种具有多种应用程序的编程语言。特别是对于交易、分析、回测……它是你能找到的最好的语言之一。确......
  • 前端学习各种问题以及解决方法的记录
    问题描述:div宽度溢出问题,div设置margin和padding后宽度出现溢出。解决方式:css中添加如下代码:*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box......
  • Python机器学习-多元分类的5种模型
    Python机器学习-多元分类的5种模型最近上了些机器学习的课程,于是想透过Kaggle资料集来练习整个资料科学专案的流程,在模型训练阶段,虽然听过许多分类模型,但不是很了解其各别......
  • Python 中的命名空间、变量和范围
    Python中的命名空间、变量和范围什么是命名空间?首先,我们需要感知python中的名称(标识符)是什么。众所周知,在python中,一切都是对象。名称帮助我们访问底层对象。例如,当我们......
  • Leetcode — 34. 查找有序数组中元素的第一个和最后一个位置
    Leetcode—34.查找有序数组中元素的第一个和最后一个位置题目:查找排序数组中元素的第一个和最后一个位置难度:medium语言:Python中文题意:给一串以递增排序的整数......
  • Ubuntu常用快捷键
    一、打开Terminal的快捷键是Ctrl+Alt+T二、中止运行Ctrl+C一般最常用的是cd,ls, mkdir,rmdir,cp,rm,mv,clear,pwd,shutdown.一般使用时只需记住常用命令,不清......
  • 反应上下文
    反应上下文ReactContextD耳朵伙计们:反应上下文API今天将讨论。React最好的特性之一是ReactContextAPI。如果你有兴趣,你应该继续阅读,因为这将是一个了不起的......
  • 修复:无法对未安装的组件执行反应状态更新。
    修复:无法对未安装的组件执行反应状态更新。在开发react.js应用程序时可能会遇到此错误:警告:无法对未安装的组件执行React状态更新。这是一个空操作,但它表明您的应用......
  • SWR 与 React 的威力
    SWR与React的威力在本文中,我们将研究一种在ReactApps中检索数据的新方法,名为驻波比.这是一组用于远程数据获取的钩子,使事情变得更容易,例如缓存、分页等。在整篇......