C语言中单链表的基本操作指南(增删改查)

C语言中单链表的基本操作指南如下:

单链表

单链表是一种线性结构,具有链式存储的特点,即用指针相连的方式存储数据。单链表的每个节点包含一个数据域和一个指向下一个节点的指针域。单链表与数组相比,其插入和删除操作效率较高,但是查找效率较低。

在C语言中,可以使用结构体和指针实现单链表。如下所示,Node结构体表示单链表中的一个节点,包含一个数据成员和一个指向下一个节点的指针成员。

typedef struct Node {
    int data;
    struct Node *next;
} Node;

单链表操作

创建单链表

创建一个单链表,需要定义头节点,并让其指向NULL。创建一个新节点时,将其指针域指向头节点,再将头节点指向新节点。如下所示,createList函数创建一个带头节点的单链表,并返回头节点指针。

Node *createList() {
    Node *head = (Node *)malloc(sizeof(Node));
    head->next = NULL;
    return head;
}

插入节点

单链表的插入操作包括头插法和尾插法。头插法是指在链表头部插入节点,尾插法是指在链表尾部插入节点。

头插法

头插法的思路是,先创建一个新节点,然后将其指针域指向原头节点指向的节点,再将头节点指针域指向新节点。

以下是头插法的代码示例:

void insertHead(Node *head, int data) {
    Node *newNode = (Node *)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = head->next;
    head->next = newNode;
}

尾插法

尾插法的思路是,遍历链表找到最后一个节点,然后在其后面插入一个新节点。

以下是尾插法的代码示例:

void insertTail(Node *head, int data) {
    Node *newNode = (Node *)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = NULL;
    Node *p = head;
    while (p->next != NULL) {
        p = p->next;
    }
    p->next = newNode;
}

删除节点

单链表的删除操作包括删除头节点和删除其他节点。

删除头节点

删除头节点的思路是,先保存头节点的指针,然后将头节点的指针域指向下一个节点,最后释放原头节点的内存空间。

以下是删除头节点的代码示例:

void deleteHead(Node *head) {
    Node *p = head->next;
    head->next = p->next;
    free(p);
}

删除其他节点

删除其他节点的思路是,先找到要删除的节点的前一个节点,将前一个节点的指针域指向要删除节点的下一个节点,最后释放要删除节点的内存空间。

以下是删除其他节点的代码示例:

void deleteNode(Node *head, int data) {
    Node *p = head;
    while (p->next != NULL) {
        if (p->next->data == data) {
            Node *q = p->next;
            p->next = q->next;
            free(q);
            return;
        }
        p = p->next;
    }
}

修改节点

修改节点的思路是,先找到要修改的节点,然后修改其数据域的值。

以下是修改节点的代码示例:

void modifyNode(Node *head, int data, int newData) {
    Node *p = head->next;
    while (p != NULL) {
        if (p->data == data) {
            p->data = newData;
            return;
        }
        p = p->next;
    }
}

查找节点

查找节点的思路是,遍历整个链表,找到与目标数据相等的节点。

以下是查找节点的代码示例:

Node *findNode(Node *head, int data) {
    Node *p = head->next;
    while (p != NULL) {
        if (p->data == data) {
            return p;
        }
        p = p->next;
    }
    return NULL;
}

示例说明

示例1:用尾插法创建一个带头节点的单链表,再在头插法和尾插法的基础上分别插入10个节点,最后输出链表

Node *head = createList();
for (int i = 1; i <= 10; i++) {
    insertHead(head, i);
}
for (int i = 1; i <= 10; i++) {
    insertTail(head, i);
}
Node *p = head->next;
while (p != NULL) {
    printf("%d ", p->data);
    p = p->next;
}

示例2:创建一个带头节点的单链表,插入10个节点,查找值为5的节点并输出,修改值为5的节点的数据值为55后输出,删除第一个节点,并输出链表

Node *head = createList();
for (int i = 1; i <= 10; i++) {
    insertTail(head, i);
}
Node *p = findNode(head, 5);
if (p != NULL) {
    printf("%d ", p->data);
}
modifyNode(head, 5, 55);
p = head->next;
while (p != NULL) {
    printf("%d ", p->data);
    p = p->next;
}
deleteHead(head);
p = head->next;
while (p != NULL) {
    printf("%d ", p->data);
    p = p->next;
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言中单链表的基本操作指南(增删改查) - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • Java数据结构学习之二叉树

    Java数据结构学习之二叉树 什么是二叉树 二叉树是一种树形数据结构,他的每个节点最多有两个子节点,分别称为左子节点和右子节点。如果一个节点没有子节点,则成为叶子节点。二叉树具有以下性质: 每个节点最多有两个子节点 左子树和右子树是二叉树 二叉树可以为空 二叉树的遍历 为了遍历一棵树,我们可以采用两种算法: 深度优先遍历 深度优先遍历的思路是:从根节点出发,…

    数据结构 2023年5月17日
    00
  • Android随手笔记44之JSON数据解析

    Android随手笔记44之JSON数据解析 1. JSON数据的基本概念 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于 JavaScript 的一个子集。JSON 格式最初是为了解决 JavaScript 程序通过 AJAX 传输数据时的数据交换格式问题而出现的,但是现在已经成为了一种通用的数据格式。…

    数据结构 2023年5月17日
    00
  • C语言数据结构深入探索顺序表

    C语言数据结构深入探索顺序表攻略 一、概述 顺序表是一种线性结构,是计算机程序中最常见的数据结构之一。在C语言中,顺序表可以用数组来实现。本篇文章将深入讲解顺序表的原理和实现方法,帮助读者加深对顺序表的理解,并掌握如何用C语言代码实现顺序表。 二、顺序表的定义和特点 顺序表是指用一组地址连续的存储单元依次存储线性表中的各个元素,用于表示具有相同数据类型的n个…

    数据结构 2023年5月17日
    00
  • JavaScript数据结构与算法之二叉树遍历算法详解【先序、中序、后序】

    JavaScript数据结构与算法之二叉树遍历算法详解 什么是二叉树 二叉树是一种每个节点最多只有两个子节点的树结构,可以用来组织数据、搜索、排序等。 二叉树的遍历 遍历是指按照一定次序访问二叉树中的所有节点。常见的二叉树遍历有三种方式:先序遍历、中序遍历、后序遍历。以下分别对它们进行详细讲解。 前序遍历 前序遍历是指先访问节点本身,然后再遍历其左子树和右子…

    数据结构 2023年5月17日
    00
  • TypeScript数据结构栈结构Stack教程示例

    下面就给您详细讲解一下“TypeScript数据结构栈结构Stack教程示例”的完整攻略。 1. 栈结构(Stack)概述 栈是一种特殊的数据结构,它的特点是后进先出(Last In First Out,LIFO)。和数组不同的是,栈只能在栈顶插入和删除元素。栈的常见操作有“- push() 元素入栈,将元素放到栈顶- pop() 元素出栈,从栈顶取出元素…

    数据结构 2023年5月17日
    00
  • Java数据结构之双向链表的实现

    Java数据结构之双向链表的实现 一、双向链表的定义 双向链表是一种包含两个指针的链表数据结构,每个节点都有两个指针,一个指向前一个节点,一个指向后一个节点。 二、双向链表的实现 1. 定义节点 首先,我们需要定义一个节点类,包含节点的值,指向前一个节点的指针pre和指向后一个节点的指针next,代码如下: public class Node { int v…

    数据结构 2023年5月17日
    00
  • 一起来看看C语言线性表的线性链表

    一起来看看C语言线性表的线性链表攻略 线性链表概述 线性链表是线性表的一种实现方式,它通过每个节点中包含指向下一个节点的指针来实现表中元素之间的链接,可以动态地增加、删除节点。线性链表分为带头节点的链表和不带头节点的链表,其中带头节点的链表更为常见。 实现思路 结构体定义 我们可以定义一个结构体来表示每个节点,例如: typedef struct ListN…

    数据结构 2023年5月17日
    00
  • 集合框架及背后的数据结构

    集合框架及背后的数据结构 集合框架是Java编程语言中的一组接口和实现类,用于存储数据的集合。集合框架中提供了许多不同类型的集合,包括List、Set、Map等。背后的数据结构是实现集合框架的关键,不同的数据结构适用于不同的集合类型和场景。 集合框架中的接口和实现类 Java中的集合框架定义了一些接口以及这些接口的实现类,在使用Java集合的时候,主要是使用…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部