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日

相关文章

  • C#常用数据结构之数组Array

    C#常用数据结构之数组Array 什么是数组 在C#中,数组是一种数据结构,它可以用于存储具有相同数据类型的多个元素。数组中的元素可以通过下标来访问,数组下标从0开始,最大下标为数组长度-1。 声明和初始化数组 声明数组 声明数组需要指定数据类型和数组名称,括号中指定数组的容量。例如,声明一个包含5个整数的数组: int[] arr = new int[5]…

    数据结构 2023年5月17日
    00
  • NTP时间同步服务器(频率同步)包含帧同步、载波同步、位同步

    NTP时间同步服务器(频率同步)包含帧同步、载波同步、位同步 NTP时间同步服务器(频率同步)包含帧同步、载波同步、位同步 京准电子科技官微——ahjzsz 同步的概念   同步技术是数字通信系统中非常重要的技术。一般来说数字通信系统要实现多种同步功能才能实现正确的数据通信任务。其技术目标是实现不同地域收发双方的同步通信互联,实现一致的信息数据交换,因此,通…

    算法与数据结构 2023年4月17日
    00
  • 2021年最新Redis面试题汇总(1)

    下面我将为您详细讲解“2021年最新Redis面试题汇总(1)”的完整攻略。 1. Redis概述 首先,我们需要了解Redis是什么,以及它的特点和应用场景。 1.1 什么是Redis Redis是一种内存中的数据结构存储,可以用作数据库、缓存和消息中间件。它支持多种数据结构,如字符串、哈希、列表、集合和有序集合,并提供了丰富的功能,如事务、持久化、Lua…

    数据结构 2023年5月17日
    00
  • C语言 数据结构之数组模拟实现顺序表流程详解

    C语言 数据结构之数组模拟实现顺序表流程详解 什么是顺序表? 顺序表是一种基于连续存储结构的数据结构,它可以用一段连续的存储单元来存储线性表中的所有元素。 顺序表的实现思路 顺序表的实现主要依赖数组。我们可以定义一个数组来存储线性表的数据元素,同时再定义一个变量来保存线性表当前的长度。当需要对线性表进行插入、删除、查找等操作时,根据需求,可以通过数组的下标来…

    数据结构 2023年5月17日
    00
  • C++中的数组、链表与哈希表

    C++中的数组、链表与哈希表 数组 数组是一种数据结构,它存储的是一组相同类型的值。数组中每个元素的类型都是相同的,而且数组中的元素是按照一定的顺序排列的。C++中的数组是有序的,并且可以通过下标来访问数组中的元素。 数组的定义和初始化 在C++中定义数组的语法如下: type arr_name[arr_size]; 其中,type表示数组元素的类型,arr…

    数据结构 2023年5月17日
    00
  • Java数据结构与算法之栈(动力节点Java学院整理)

    Java数据结构与算法之栈攻略 什么是栈? 栈是一种线性结构,属于“先进后出”(Last In First Out,LIFO)的数据结构。它只允许在栈顶进行插入和删除操作。 栈的实现 栈的实现有两种方式: 基于数组实现的顺序栈(ArrayStack) 基于链表实现的链式栈(LinkedStack) 1. 基于数组实现的顺序栈 顺序栈的实现需要一个固定大小的数…

    数据结构 2023年5月17日
    00
  • Java数据结构之双向链表图解

    以下是Java数据结构之双向链表图解的完整攻略: 一、双向链表简介 1.1 定义 双向链表(Doubly Linked List),也叫双向链式线性表,是链式存储结构的基本形式之一。双向链表的每个节点都含有两个指针,分别指向前驱节点和后继节点,因此可以支持双向遍历。 1.2 结构 双向链表的结构可以用下图表示: +——-+ +——-+ +–…

    数据结构 2023年5月17日
    00
  • 【ACM算法竞赛日常训练】DAY3题解与分析【旅游】【tokitsukaze and Soldier】

    DAY3共2题: 旅游 tokitsukaze and Soldier ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 原文链接(阅读原文获得更好阅读体验): 旅游 题目传送门:https://ac.nowcoder…

    算法与数据结构 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部