C语言之单链表的插入、删除与查找

C语言中单链表的插入、删除与查找是单链表操作中的基本操作。下面将对这三种操作进行详细讲解。

单链表基本知识

在讲解单链表的操作前,我们先来复习一下单链表的基本概念。单链表是一种链式存储结构,由若干个节点构成。每个节点由数据域和指针域组成,指针域指向下一个节点。单链表有一个头节点,头节点不存储实际的数据,其指针域指向第一个有效节点。

插入操作

单链表插入操作是在链表中任选一个节点的前面或后面,插入一个新节点。插入新节点大致分为以下几个步骤:

  1. 创建一个新节点;
  2. 找到要插入的位置,记录该位置节点和其前驱节点;
  3. 将新节点的指针指向位置节点,前驱节点的指针指向新节点。

下面是单链表插入操作的实现:

void insert_node(pNode head, int pos, int data) {
    pNode new_node, cur_node;
    int count = 0;

    new_node = (pNode)malloc(sizeof(Node));
    new_node->data = data;
    new_node->next = NULL;

    cur_node = head;
    while (cur_node && count < pos - 1) {
        cur_node = cur_node->next;
        ++count;
    }

    if (!cur_node || count > pos - 1) {
        printf("插入位置无效!\n");
        free(new_node);
        return;
    }

    new_node->next = cur_node->next;
    cur_node->next = new_node;
}

从代码中可以看出,我们首先创建一个新节点,并将其数据域设为要插入的数据,将指针域设为NULL。然后,从头节点开始遍历,找到要插入的位置位置节点和其前驱节点。当遍历到位置节点时,将新节点的指针指向位置节点,位置节点的前驱节点的指针指向新节点即可。

下面是一条插入操作的示例:

pNode head = create_list();
if (head == NULL) {
    printf("创建链表失败!\n");
    return -1;
}
printf("插入前:\n");
print_list(head);
insert_node(head, 2, 5);
printf("插入后:\n");
print_list(head);

这条示例代码首先创建一个链表头节点,然后在第二个节点前插入一个值为5的新节点,最后输出插入前后的链表。

删除操作

单链表删除操作是在链表中删除指定位置的节点。删除节点大致分为以下几个步骤:

  1. 找到要删除的位置,记录该位置节点和其前驱节点;
  2. 将前驱节点的指针指向位置节点的下一个节点;
  3. 释放要删除的节点。

下面是单链表删除操作的实现:

void delete_node(pNode head, int pos) {
    pNode del_node, cur_node;
    int count = 0;

    cur_node = head;
    while (cur_node->next && count < pos - 1) {
        cur_node = cur_node->next;
        ++count;
    }

    if (!cur_node->next || count > pos - 1) {
        printf("删除位置无效!\n");
        return;
    }

    del_node = cur_node->next;
    cur_node->next = del_node->next;
    free(del_node);
}

从代码中可以看出,我们首先遍历链表,找到要删除的位置位置节点和其前驱节点。然后,将前驱节点的指针指向位置节点的下一个节点,即可删除位置节点。最后,释放要删除的节点。

下面是一条删除操作的示例:

pNode head = create_list();
if (head == NULL) {
    printf("创建链表失败!\n");
    return -1;
}
printf("删除前:\n");
print_list(head);
delete_node(head, 2);
printf("删除后:\n");
print_list(head);

这条示例代码首先创建一个链表头节点,然后删除第三个节点,最后输出删除前后的链表。

查找操作

单链表查找操作是在链表中查找指定位置的节点。查找节点大致分为以下几个步骤:

  1. 遍历链表,找到指定位置的节点。

下面是单链表查找操作的实现:

pNode get_node(pNode head, int pos) {
    pNode cur_node = head;
    int count = 0;

    while (cur_node && count < pos) {
        cur_node = cur_node->next;
        ++count;
    }

    if (!cur_node || count > pos) {
        printf("查找位置无效!\n");
        return NULL;
    }

    return cur_node;
}

从代码中可以看出,我们首先从头节点开始遍历,找到指定位置的节点。查找结束后,如果找到了该节点,就返回该节点的指针;否则,输出错误信息并返回NULL。

下面是一条查找操作的示例:

pNode head = create_list();
if (head == NULL) {
    printf("创建链表失败!\n");
    return -1;
}
pNode p = get_node(head, 2);
if (p != NULL) {
    printf("查找成功,第二个节点的值为%d。\n", p->data);
} else {
    printf("查找失败!\n");
}

这条示例代码首先创建一个链表头节点,然后查找第三个节点,并输出该节点的值。

好了,以上就是关于单链表插入、删除和查找操作的详细讲解。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言之单链表的插入、删除与查找 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 详解C语言之操作符

    详解C语言之操作符 本文将详细讲解C语言中常见的操作符,包括算术操作符、关系操作符、逻辑操作符、位操作符以及其他操作符,以帮助读者更好地理解和熟练运用这些操作符。 算术操作符 C语言中的算术操作符包括加、减、乘、除和取模五种。它们的含义和用法如下: 操作符 含义 示例 + 加 a + b – 减 a – b * 乘 a * b / 除 a / b % 取模(…

    other 2023年6月27日
    00
  • gis中的引擎:地图引擎

    GIS中的引擎: 地图引擎 GIS(地理信息系统)是现代地理学和计算机技术相结合的产物,常常用于研究地球上空间分布的现象。而地图引擎则是GIS中的一个重要组成部分,是实现地图数据可视化的核心。 地图引擎的基本概念 地图引擎是一种能够将地图数据转化为图像的软件工具。它会读取GIS中存储的地理数据,并将这些数据转换为图像、矢量图形、动画等形式,以便在屏幕上展示。…

    其他 2023年3月29日
    00
  • cmd怎么修改文件扩展名? cmd显示修改文件扩展名的教程

    当使用命令提示符(cmd)修改文件扩展名时,可以使用ren命令来完成。下面是一个详细的攻略,包含了两个示例说明: 首先,打开命令提示符(cmd)窗口。可以通过按下Win + R键,然后输入\”cmd\”并按下Enter键来打开。 在命令提示符窗口中,使用cd命令导航到包含要修改扩展名的文件所在的目录。例如,如果文件位于D盘的Documents文件夹中,可以输…

    other 2023年8月5日
    00
  • C语言入门篇–变量[定义,初始化赋值,外部声明]

    C语言入门篇–变量[定义,初始化赋值,外部声明] 1. 变量定义 变量是C语言中非常重要的概念,变量定义指的是声明一个变量来存储特定类型的数据,并为该变量分配内存空间。 //一般形式为:数据类型 变量名; int num; char ch; float f; double d; C语言中支持多种基本数据类型,包括整型、字符型、浮点型、双精度型等。其中,in…

    other 2023年6月20日
    00
  • Java代码注释规范(动力节点整理)

    Java代码注释规范攻略 1. 注释的作用 注释是用来解释代码的工具,它可以提高代码的可读性和可维护性。良好的注释规范可以帮助其他开发人员理解你的代码,并且在后续的维护和修改过程中提供指导。 2. 注释的类型 Java代码注释主要分为三种类型:块注释、行注释和文档注释。 2.1 块注释 块注释是用/和/包围起来的注释内容,可以跨越多行。块注释通常用于对整个方…

    other 2023年8月6日
    00
  • MyBatis 如何获取子类的属性

    要获取子类的属性,最简单的做法就是使用反射机制。MyBatis也提供了相应的API来支持反射获取子类的属性。具体步骤如下: 添加MyBatis的反射依赖包。 在Maven项目中添加依赖: <!– MyBatis –> <dependency> <groupId>org.mybatis</groupId> &…

    other 2023年6月26日
    00
  • java的四种引用——强弱软虚

    Java的四种引用——强弱软虚 Java中的内存管理是一个关键问题,为了更好地利用内存资源,Java引入了垃圾回收机制,但是垃圾回收并不意味着内存就完全不需要管理了。Java中有四种引用类型,分别是强引用,弱引用,软引用和虚引用,这四种引用类型分别有不同的使用场景和生命周期,是Java内存管理的重要组成部分。 强引用 强引用是Java中默认的引用类型,如果存…

    其他 2023年3月28日
    00
  • Android安卓5.0系统正式版刷机包(镜像)官方下载地址汇总(适配设备)

    Android安卓5.0系统正式版刷机包(镜像)官方下载地址汇总(适配设备)攻略 1. 准备工作 在开始刷机之前,确保你已经完成以下准备工作:- 一台适配Android 5.0系统的设备(例如:手机、平板等)- 电脑,并确保已经安装了ADB工具和相应的驱动程序- USB数据线- 备份你的设备数据,因为刷机会清除所有数据 2. 下载刷机包 在这里,我们提供了A…

    other 2023年8月4日
    00
合作推广
合作推广
分享本页
返回顶部