C语言数据结构之单链表的查找和建立

C语言数据结构之单链表的查找和建立

什么是单链表?

单链表是一种常见的数据结构,是由若干个节点(Node)组成的链式结构,每个节点存储着链表中的元素和指向下一个节点的指针。

单链表的优点是插入、删除元素简单,但是查找元素比较困难。

在C语言中,我们可以使用结构体来定义一个节点:

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

其中,val存储着节点的值,next存储着指向下一个节点的指针。当next为NULL时,表示该节点为链表的最后一个节点。

单链表的建立

首先,我们需要定义一个头结点,头结点的作用是方便对链表的操作和遍历。头结点不存储任何值,其next指针指向第一个有效节点。

下面是一个简单的实现:

struct ListNode* createList(int nums[], int size) {
    struct ListNode *head = (struct ListNode *)malloc(sizeof(struct ListNode)); // 创建头结点
    head->next = NULL; // 初始化头结点
    struct ListNode *tail = head; // 定义链表的尾指针,方便链表的添加操作

    for (int i = 0; i < size; i++) {
        struct ListNode *node = (struct ListNode *)malloc(sizeof(struct ListNode)); // 创建一个新节点
        node->val = nums[i];
        node->next = NULL;
        tail->next = node; // 将新节点添加到链表尾部
        tail = node; // 更新链表的尾指针
    }

    return head;
}

示例:我们构建一个单链表1->2->3->4->5:

int nums[] = {1, 2, 3, 4, 5};
int size = sizeof(nums) / sizeof(nums[0]);

struct ListNode *head = createList(nums, size);

单链表的查找

顺序查找

顺序查找是比较简单的一种查找方式,从头结点开始遍历整个链表,直到找到待查找的元素或者遍历至链表末尾。

下面是顺序查找的实现代码:

struct ListNode *search(struct ListNode *head, int target) {
    struct ListNode *p = head->next;

    while (p) {
        if (p->val == target) {
            return p;
        }
        p = p->next;
    }

    return NULL;
}

示例:查找单链表中值为4的节点

struct ListNode *node = search(head, 4);
if (node) {
    printf("the node is %d\n", node->val);
} else {
    printf("the node is not found\n");
}

二分查找

由于单链表不支持随机访问,所以不适合使用二分查找进行查找操作。

总结

单链表是一种基础、常用的数据结构,掌握单链表的建立和查找操作对于进一步了解链表及其他数据结构有着重要的意义。在实现过程中需要留意指针的操作,确保链表的正确性和完整性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言数据结构之单链表的查找和建立 - Python技术站

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

相关文章

  • 【牛客小白月赛70】A-F题解【小d和超级泡泡堂】【小d和孤独的区间】【小d的博弈】【小d和送外卖】

    比赛传送门:https://ac.nowcoder.com/acm/contest/53366 难度适中。 ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 阅读原文获得更好阅读体验:https://www.erikt…

    算法与数据结构 2023年4月17日
    00
  • 纯C++代码详解二叉树相关操作

    纯C++代码详解二叉树相关操作 介绍 二叉树是一种非常常见的数据结构,适用于处理需要具有层级关系的数据。在本文中,我们将详细讲解如何使用C++来实现二叉树的基本操作,包括创建、遍历、插入、删除等。 创建二叉树 定义二叉树节点 在C++中实现二叉树的概念,需要先定义二叉树节点的结构,代码如下: struct BinaryTreeNode { int value…

    数据结构 2023年5月17日
    00
  • 题目 3158: 蓝桥杯2023年第十四届省赛真题-三国游戏(贪心)

    题目描述 小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵X, Y, Z (一开始可以认为都为 0 )。游戏有 n 个可能会发生的事件,每个事件之间相互独立且最多只会发生一次,当第 i 个事件发生时会分别让 X, Y, Z 增加Ai , Bi ,Ci 。当游戏结束时 (所有事件的发生与否已经确定),如果 X, Y, Z 的其中一个大于另外两个之…

    算法与数据结构 2023年4月30日
    00
  • 数据结构之线性表

    Linear_list 类型定义 一个线性表是n个数据元素的有限序列,线性表中的元素个数n定义为线性表的长度,n=0时成为空表;抽象数据类型: InitList(&L) //构造空线性表L DestroyList(&L) //销毁线性表L ClearList(&L) //将L重置为空表 ListEmpty(L) //若L为空表返回TR…

    算法与数据结构 2023年4月25日
    00
  • Golang Mutex互斥锁源码分析

    Golang Mutex互斥锁源码分析 介绍 Golang的Mutex互斥锁机制是一种非常重要的并发控制方式,它可以保证在同一时刻,同一共享资源只能被一个goroutine访问,其他的goroutine必须等待当前访问者释放锁之后才能访问该共享资源。 在使用Mutex机制时,需要进行锁定、解锁等操作,而这一过程是由Mutex的底层实现——sync包来完成的。…

    数据结构 2023年5月17日
    00
  • Java 数据结构算法Collection接口迭代器示例详解

    Java 数据结构算法 Collection 接口迭代器示例详解 如果你正在学习 Java 编程,那么数据结构和算法一定是一个不可避免的话题。在 Java 中,Collection 框架提供了许多有用的接口和类来管理和操作集合。其中,迭代器 Iterator 是 Collection 中最重要的接口之一,它提供了对集合元素进行迭代的方法。本文将对 Java …

    数据结构 2023年5月17日
    00
  • C语言线性表全面梳理操作方法

    C语言线性表全面梳理操作方法 线性表概述 线性表是一种常用的数据结构,是指数据元素之间存在一定逻辑顺序,每个元素都有唯一的前驱和后继。 线性表有两种存储方式: 顺序存储结构 和 链式存储结构。 顺序存储结构 顺序存储结构是指采用顺序存储方式存储线性表,即将线性表的元素依次存储在一段连续的存储空间内。 代码示例:创建顺序存储线性表 #define MaxSiz…

    数据结构 2023年5月17日
    00
  • 排序算法之详解选择排序

    引入 选择排序顾名思义是需要进行选择的,那么就要问题了,选择到底是选择什么呢? 选择排序的选择是选择数组中未排序的数组中最小的值,将被选择的元素放在未排序数组的首位 如果你对 ‘未排序数组’ , ‘选择’ 的概念不理解,那么你可以看看下面的图 思路 有了上面的一些基础之后,我们再来说说选择排序算法的思路 不断的选择未排序数组中最小的值,将其与未排序数组的首位…

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