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日

相关文章

  • 超详细讲解Java线程池

    《超详细讲解Java线程池》是一篇讲解Java线程池的详细攻略,本文将介绍如何使用Java线程池,在什么情况下应该使用线程池,以及线程池的几种常见类型。下面将逐一介绍相关内容。 什么是线程池 线程池是一组线程的集合,可以异步地执行多个任务。通常情况下,当一个任务被提交到线程池时,线程池中的一个线程会执行该任务。当该任务完成后,线程会返回到线程池中,等待下一个…

    other 2023年6月27日
    00
  • ios中关于taptic-engine震动反馈的深入解析

    以下是iOS中关于Taptic Engine震动反馈的深入解析的完整攻略: Taptic Engine简介 Taptic Engine是苹果公司在iPhone 7及以后的设备中引入的一种震动反馈技术。使用线性马达来产生不同类型的震动反馈,包括轻触、重击、弹跳等。Taptic Engine可以用于各种应用程序,包括游戏、通知、用户界面等。 Taptic Eng…

    other 2023年5月8日
    00
  • 检查上传图片是否合法的函数,木马改后缀名、图片加恶意代码均逃不过

    检查上传图片是否合法的函数攻略 为了确保上传的图片是合法的,我们可以采取以下步骤: 验证文件类型:首先,我们需要验证上传的文件是否是图片文件。我们可以通过检查文件的扩展名或者使用文件的魔术数字(magic number)来确定文件类型。常见的图片文件类型有JPEG、PNG、GIF等。以下是一个示例函数,用于验证文件类型: import imghdr def …

    other 2023年8月5日
    00
  • 详解C++-(=)赋值操作符、智能指针编写

    详解C++-(=)赋值操作符、智能指针编写 1. (=)赋值操作符 C++中,(=)是一种赋值操作符。它允许我们将一个值赋值给一个变量。在C++中,(=)是右结合的,也就是说,赋值语句的右边的操作数先被计算。 例如,我们有一个类Person,它有一个name字符串和一个age整数: class Person { string name_; int age_;…

    other 2023年6月26日
    00
  • 第2课,python while循环的使用

    下面是关于Python while循环的使用的完整攻略,包括基本概念、使用方法和两个示例等方面。 Python while循环的基本概念 Python中的while循环是一种重复执行代码块的结构,只要指定的条件为真,就会一直执行循环体中的代码。while循环的基本语法如下: while 条件: 循环体 其中,条件是一个布尔表达式,循环体是需要重复执行的代码块…

    other 2023年5月6日
    00
  • DIV多层嵌套margin-top的BUG问题

    DIV多层嵌套margin-top的BUG问题攻略 问题描述 在HTML和CSS中,当多个DIV元素嵌套在一起,并且每个DIV元素都设置了margin-top属性时,可能会出现一个BUG。这个BUG会导致内层DIV元素的margin-top属性不会像预期的那样应用于外层DIV元素的底部,而是应用于外层DIV元素的顶部。 解决方案 为了解决这个问题,我们可以使…

    other 2023年7月28日
    00
  • JavaScript实现判断图片是否加载完成的3种方法整理

    下面是详细讲解“JavaScript实现判断图片是否加载完成的3种方法整理”的攻略。 前言 在前端开发中,图片加载是个很常见的问题。有时候我们需要在图片加载完成后执行某个操作,或者需要知道图片是否加载出错。那么如何在JavaScript中实现这个功能呢?这篇文章将介绍3种实现方法,并进行详细讲解。 方法一:onload事件 可以通过给img元素绑定onloa…

    other 2023年6月25日
    00
  • vs2015详细安装步骤

    VS2015详细安装步骤 Visual Studio是一款非常优秀的集成开发环境,它支持多种编程语言,包括C++, C#, VB等。本文将介绍VS2015的详细安装步骤。 1. 下载VS2015安装包 首先,你需要从微软官网下载VS2015的安装包。前往官网下载页面(https://www.visualstudio.com/downloads/),找到VS2…

    其他 2023年3月29日
    00
合作推广
合作推广
分享本页
返回顶部