C语言实题讲解快速掌握单链表上

C语言实题讲解快速掌握单链表

什么是单链表?

单链表是一种链式存储的线性数据结构,它由一系列称为节点的组成。每个节点都包括两个部分:数据域和指针域。指针域指示了下一个节点的地址,因此,我们可以通过遍历链表的方式访问所有节点。

单链表的操作

创建一个单链表

我们可以通过以下步骤来创建一个单链表:
1. 定义单链表的节点结构体,包括数据域和指针域。
2. 定义一个指针变量作为头指针,并分配内存空间。
3. 将所有节点依次插入链表中。

// 定义节点结构体
typedef struct Node {
    int data;
    struct Node *next;
} Node;

// 创建单链表
Node* createList(int data[], int length) {
    // 定义头结点
    Node *head = malloc(sizeof(Node));
    head->next = NULL;
    Node *tail = head;

    // 将数据依次插入链表中
    for (int i = 0; i < length; i++) {
        Node *newNode = malloc(sizeof(Node));
        newNode->data = data[i];
        newNode->next = NULL;
        tail->next = newNode;
        tail = tail->next;
    }

    return head;
}

插入节点

在单链表中插入一个新节点通常需要知道两个节点的位置:待插入节点的前驱节点和后继节点。我们可以通过遍历单链表的方式找到这两个节点,并插入新节点。

// 在单链表中插入一个新节点
void insertNode(Node *head, int index, int data) {
    // 找到待插入节点的前驱节点和后继节点
    Node *p = head;
    for (int i = 1; i < index && p; i++) {
        p = p->next;
    }

    if (!p) {
        printf("Error: invalid index\n");
        return;
    }

    Node *newNode = malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = p->next;
    p->next = newNode;
}

删除节点

在单链表中删除一个节点同样需要知道待删除节点的前驱节点和后继节点。我们可以通过遍历单链表的方式找到这两个节点,并删除待删除节点。

// 在单链表中删除一个节点
void deleteNode(Node *head, int index) {
    // 找到待删除节点的前驱节点和后继节点
    Node *p = head;
    for (int i = 1; i < index && p; i++) {
        p = p->next;
    }

    if (!p || !p->next) {
        printf("Error: invalid index\n");
        return;
    }

    Node *temp = p->next;
    p->next = temp->next;
    free(temp);
}

示例说明

假设我们需要操作以下链表:1 -> 2 -> 3 -> 4 -> 5

示例1:在链表中插入一个新节点

插入一个新节点8到链表的第2个位置,操作后链表为:1 -> 8 -> 2 -> 3 -> 4 -> 5

Node *list = createList((int[]){1, 2, 3, 4, 5}, 5);
insertNode(list, 2, 8);

示例2:删除链表中的一个节点

删除链表的第3个节点,操作后链表为:1 -> 2 -> 4 -> 5

Node *list = createList((int[]){1, 2, 3, 4, 5}, 5);
deleteNode(list, 3);

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实题讲解快速掌握单链表上 - Python技术站

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

相关文章

  • 带你了解Java数据结构和算法之前缀,中缀和后缀表达式

    带你了解Java数据结构和算法之前缀、中缀和后缀表达式 1. 前缀表达式(Prefix Expression) 前缀表达式是指运算符位于操作数之前的表达式,也被称为波兰式。前缀表达式的优点在于,每个运算符的优先级都可以通过括号来明确,不需要考虑运算符的优先级。同时,整个表达式的意义也可以很清晰地传达。 举个例子,下面是一个前缀表达式: + * 4 5 6 /…

    数据结构 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
  • Leetcode Practice — 字符串

    目录 14. 最长公共前缀 思路解析 151. 反转字符串中的单词 思路解析 125. 验证回文串 思路解析 415. 字符串相加 思路解析 3. 无重复字符的最长子串 思路解析 8. 字符串转换整数 (atoi) 思路解析 14. 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。 输入:strs = […

    算法与数据结构 2023年4月18日
    00
  • nginx内存池源码解析

    Nginx内存池源码解析 Nginx是一个高性能、高并发的Web服务器。为了提高其性能和速度,Nginx采用了特殊的内存管理机制,即内存池。 什么是内存池? 内存池是一种高效的内存分配和管理机制。它将一块内存划分成多个大小相等的块,并按需分配给系统。当内存块不再使用时,它并不被立即释放,而是留在内存池中待重复利用。 Nginx内存池结构 Nginx内存池主要…

    数据结构 2023年5月17日
    00
  • 【ACM算法竞赛日常训练】DAY5题解与分析【储物点的距离】【糖糖别胡说,我真的不是签到题目】| 前缀和 | 思维

    DAY5共2题: 储物点的距离(前缀和) 糖糖别胡说,我真的不是签到题目(multiset,思维) ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 原文链接(阅读原文获得更好阅读体验):https://www.eri…

    算法与数据结构 2023年4月18日
    00
  • java数据结构之实现双向链表的示例

    Java数据结构之实现双向链表的示例 1. 什么是双向链表? 双向链表,英文名为doubly linked list,是一种链表结构。与单向链表不同,双向链表中的每一个节点除了保存了指向下一个节点的指针外,还保存了指向前一个节点的指针。因此,双向链表可双向遍历,可以从前向后或从后向前遍历。 2. 双向链表的实现 2.1 节点类的实现 创建节点类Node,并定…

    数据结构 2023年5月17日
    00
  • Python数据结构之二叉排序树的定义、查找、插入、构造、删除

    Python数据结构之二叉排序树 一、定义 二叉排序树(Binary Search Tree,BST),也称为二叉查找树或二叉搜索树,是一种基于二叉树的数据结构,其中每个节点都包含一个键值,且满足: 左子树中所有节点的键值均小于当前节点; 右子树中所有节点的键值均大于当前节点; 这是一种自平衡的数据结构,可以快速地进行查找、插入、删除等操作。 二、查找 查找…

    数据结构 2023年5月17日
    00
  • 贪心算法基础及leetcode例题

    理论 本质:找到每个阶段的局部最优,然后去推导得到全局最优两个极端:常识&&很难: 很多同学通过了贪心的题目,但都不知道自己用了贪心算法,因为贪心有时候就是常识性的推导,所以会认为本应该就这么做! 套路:贪心没有套路,说白了就是常识性推导加上举反例做题的时候,只要想清楚 局部最优 是什么,如果推导出全局最优,其实就够了。 贪心算法一般分为如下…

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