​​​​​​​C语言实现单链表基本操作方法

下面是C语言实现单链表基本操作方法的完整攻略:

1. 定义单链表结构体

首先,需要定义一个单链表结构体,来描述节点的信息。结构体应该包含两个部分:数据域和指针域。数据域存储节点的值,指针域存储指向下一个节点的指针。

struct ListNode {
    int val;                // 数据域,此处数据类型为 int
    struct ListNode *next;  // 指针域,指向下一个节点
};

2. 添加节点

添加节点是单链表的最基本操作。我们需要定义一个函数来实现添加节点的功能。

首先,我们需要创建一个新节点,并为它分配内存空间。然后,根据需求将新节点插入到链表中,这需要找到要插入的位置,即要插入节点的前一个节点。最后,将新节点插入到链表中,并调整前一个节点和后一个节点的指针。

void insertNode(struct ListNode **head, int val) {
    // 创建新节点,并为其分配内存空间
    struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
    newNode->val = val;
    newNode->next = NULL;

    // 特判链表为空的情况
    if (*head == NULL) {
        *head = newNode;
        return;
    }

    // 找到要插入的位置,即要插入节点的前一个节点
    struct ListNode* prev = NULL;
    struct ListNode* curr = *head;
    while (curr && curr->val < val) {
        prev = curr;
        curr = curr->next;
    }

    // 将新节点插入到链表中
    if (prev == NULL) {
        // 如果要插入到链表头部
        newNode->next = *head;
        *head = newNode;
    } else {
        // 如果要插入到链表中间或尾部
        newNode->next = prev->next;
        prev->next = newNode;
    }
}

上述函数中,使用了一个双重指针的技巧,用来修改头结点。具体实现过程如下:

struct ListNode* head = NULL;
...
insertNode(&head, 3);

3. 删除节点

删除节点是单链表的另一个基本操作。我们也需要定义一个函数来实现删除节点的功能。

在删除节点之前,我们需要首先找到要删除的节点,即要删除节点的前一个节点。然后,将前一个节点的指针指向要删除节点的下一个节点,再将要删除节点的空间释放。

void deleteNode(struct ListNode **head, int val) {
    // 特判链表为空的情况
    if (*head == NULL) {
        return;
    }

    // 特判要删除的节点为头结点的情况
    if ((*head)->val == val) {
        struct ListNode* temp = *head;
        *head = (*head)->next;
        free(temp);
        return;
    }

    // 找到要删除的节点,即要删除节点的前一个节点
    struct ListNode* prev = NULL;
    struct ListNode* curr = *head;
    while (curr && curr->val != val) {
        prev = curr;
        curr = curr->next;
    }

    // 删除节点,并释放空间
    if (curr) {
        prev->next = curr->next;
        free(curr);
    }
}

上述函数中也使用了双重指针的技巧。

示例说明

下面通过两个示例来说明如何使用上述函数操作单链表。

示例1:添加节点

#include <stdio.h>
#include <stdlib.h>

struct ListNode {
    int val;
    struct ListNode *next;
};

void insertNode(struct ListNode **head, int val) {
    struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
    newNode->val = val;
    newNode->next = NULL;
    if (*head == NULL) {
        *head = newNode;
        return;
    }
    struct ListNode* prev = NULL;
    struct ListNode* curr = *head;
    while (curr && curr->val < val) {
        prev = curr;
        curr = curr->next;
    }
    if (prev == NULL) {
        newNode->next = *head;
        *head = newNode;
    } else {
        newNode->next = prev->next;
        prev->next = newNode;
    }
}

int main() {
    struct ListNode* head = NULL;
    insertNode(&head, 3);
    insertNode(&head, 1);
    insertNode(&head, 2);
    insertNode(&head, 4);
    insertNode(&head, 5);
    struct ListNode* curr = head;
    while (curr) {
        printf("%d ", curr->val);
        curr = curr->next;
    }
    return 0;
}

输出结果为:1 2 3 4 5。

示例2:删除节点

#include <stdio.h>
#include <stdlib.h>

struct ListNode {
    int val;
    struct ListNode *next;
};

void insertNode(struct ListNode **head, int val) {
    struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
    newNode->val = val;
    newNode->next = NULL;
    if (*head == NULL) {
        *head = newNode;
        return;
    }
    struct ListNode* prev = NULL;
    struct ListNode* curr = *head;
    while (curr && curr->val < val) {
        prev = curr;
        curr = curr->next;
    }
    if (prev == NULL) {
        newNode->next = *head;
        *head = newNode;
    } else {
        newNode->next = prev->next;
        prev->next = newNode;
    }
}

void deleteNode(struct ListNode **head, int val) {
    if (*head == NULL) {
        return;
    }
    if ((*head)->val == val) {
        struct ListNode* temp = *head;
        *head = (*head)->next;
        free(temp);
        return;
    }
    struct ListNode* prev = NULL;
    struct ListNode* curr = *head;
    while (curr && curr->val != val) {
        prev = curr;
        curr = curr->next;
    }
    if (curr) {
        prev->next = curr->next;
        free(curr);
    }
}

int main() {
    struct ListNode* head = NULL;
    insertNode(&head, 3);
    insertNode(&head, 1);
    insertNode(&head, 2);
    insertNode(&head, 4);
    insertNode(&head, 5);
    deleteNode(&head, 3);
    deleteNode(&head, 1);
    struct ListNode* curr = head;
    while (curr) {
        printf("%d ", curr->val);
        curr = curr->next;
    }
    return 0;
}

输出结果为:2 4 5。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:​​​​​​​C语言实现单链表基本操作方法 - Python技术站

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

相关文章

  • linux下双网卡双网关配置

    以下是关于“Linux下双网卡双网关配置”的完整攻略: 步骤1:查看网络接口 首先,需要查看系统中的网络接口可以使用ifconfig命令查看系统中的网络接口。 以下是示例代码: ifconfig 在上面的代码,我们使用了ifconfig命来查看系统中的网络接口。 步骤2:配置网络接口 接下来,需要配置网络接口。可以使用ifconfig命令来配置网络接口。 以…

    other 2023年5月7日
    00
  • 获取Activity栈,判断当前Activity位置的方法

    获取Activity栈和判断当前Activity位置的方法可以通过Android的ActivityManager和ActivityTaskManager来实现。下面是详细的攻略: 1. 使用ActivityManager获取Activity栈 可以通过ActivityManager的方法来获取当前应用程序的Activity栈。 import android.…

    other 2023年6月28日
    00
  • 桌面右键快捷方式无效 压haozip快捷方式打不开的解决方法

    桌面右键快捷方式无效 压haozip快捷方式打不开的解决方法 如果你在使用Windows操作系统时遇到了桌面右键快捷方式无效或者压haozip快捷方式打不开的情况,可能会让你感到很困惑。本文将会为你提供解决这类问题的有效方法。 方法一:重置Windows资源管理器 当Windows资源管理器出现错误时,可能会导致桌面右键快捷方式无效或者压haozip快捷方式…

    other 2023年6月27日
    00
  • iPhone7如何删除软件 苹果iPhone7手机删除软件图文教程

    iPhone7如何删除软件 – 苹果iPhone7手机删除软件图文教程 1. 通过主屏幕删除应用 在主屏幕上找到您想要删除的应用程序图标,轻轻按住它(不要松开手),直到图标开始摇晃或震动 点击应用程序图标上出现的”X”符号,确认是否要删除该应用程序 点击“删除”以删除应用,或者点击“取消”放弃删除 示例说明: 假设你要删除手机上的“Instagram”,首先…

    other 2023年6月25日
    00
  • windows下用QTwebkit解析html实现过程

    下面是详细讲解“windows下用QTwebkit解析html实现过程”的完整攻略: 一、QTWebKit的简介 QTWebKit是一个基于QT的WebKit框架,可以用来解析HTML等Web页面。QTWebKit的使用非常简单,只需要在QT项目中添加相应的库即可开始使用。在Windows平台上,QTWebKit库的名称为Qt5WebKitWidgets。 …

    other 2023年6月26日
    00
  • 爬虫介绍+Jupyter Notebook

    爬虫介绍+Jupyter Notebook的完整攻略 爬虫介绍 爬虫是一种自动化程序,可以模拟人类在互联网上的行为,从网页中提取数据。爬虫通常用于数据挖掘、搜索引擎、价格比较、新闻聚合等领域。爬虫的基本流程包括发送请求、解析响应、提取数据和存储数据。 Jupyter Notebook Jupyter Notebook是一种交互式笔记本,可以在其中编写和运行代…

    other 2023年5月6日
    00
  • C sharp #001# hello world

    C Sharp #001# Hello World 在学习C#(C Sharp)编程语言时,第一个练习通常就是使用控制台打印出“Hello World”这个经典的字符串。本文将介绍如何使用C#实现这个简单的程序。 准备工作 在开始编写程序之前,需要先安装并配置好C#编程环境。我们推荐使用Visual Studio IDE(集成开发环境),它可以为你提供基本的…

    其他 2023年3月28日
    00
  • 修改注册表提高系统安全—注册表使用全攻略之十七

    根据你的要求,我来详细讲解一下“修改注册表提高系统安全—注册表使用全攻略之十七”的完整攻略,主要包括以下几个部分: 1.为什么要修改注册表来提高系统安全 注册表是Windows操作系统中非常重要的一部分,负责存储系统、用户和应用程序的各种配置信息。而黑客们就借助这一点来进行攻击行为。因此,通过修改注册表来提高系统安全到非常必要。 2.如何修改注册表来提高系统…

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