用C语言实现单链表的各种操作(一)

yizhihongxing

“用C语言实现单链表的各种操作(一)”详细介绍了如何通过C语言来实现单链表的常见操作。下面,我会结合该文章的内容,对其进行完整攻略的介绍。

文章的主要内容包括:单链表的定义、单链表的初始化、判断单链表是否为空、获取单链表中元素个数、在链表开头插入元素、在链表末尾插入元素、在链表中间插入元素、删除链表中指定元素、在链表中查找指定元素、链表的反转以及链表的销毁。下面将逐一介绍这些操作。同时,我们假设我们已经定义了如下结构体:

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

1. 单链表的定义

单链表定义为一个指向Node结构体的指针head,并且初始化为NULL。

Node *head = NULL;

2. 单链表的初始化

单链表初始化即将head指针初始化为NULL即可。

head = NULL;

3. 判断单链表是否为空

判断单链表是否为空就是判断head指针是否为NULL。

if (head == NULL)
{
    printf("Single Linked List is empty.\n");
}
else
{
    printf("Single Linked List is not empty.\n");
}

4. 获取单链表中元素个数

获取单链表中元素个数可以遍历单链表计数的方法实现,这里采用while循环实现。定义一个计数器cnt,当链表中有下一个节点时,cnt自增1,直到链表遍历完毕。

int cnt = 0;
Node *p = head;
while (p != NULL)
{
    cnt++;
    p = p->next;
}
printf("Single Linked List size is %d.\n", cnt);

5. 在链表开头插入元素

在链表开头插入元素,即在head指针指向的节点前插入元素。具体操作是:新建一个节点,并将新节点的next指向head所指向的节点,然后将head指针指向新节点。

Node *newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->next = head;
head = newNode;

6. 在链表末尾插入元素

在链表末尾插入元素,即找到最后一个节点,然后将新的节点插入到其后面。

Node *newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->next = NULL;

if (head == NULL)
{
    head = newNode;
}
else
{
    Node *p = head;
    while (p->next != NULL)
    {
        p = p->next;
    }
    p->next = newNode;
}

7. 在链表中间插入元素

在链表中间插入元素,即给定某个节点,在该节点后插入新节点。具体操作是:找到该节点,将新节点插入到该节点后面。

Node *newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;

Node *p = head;
while (p != NULL && p->data != insertValue)
{
    p = p->next;
}

if (p == NULL)
{
    printf("Insertion failed. Node with value %d not found.\n", insertValue);
}
else
{
    newNode->next = p->next;
    p->next = newNode;
}

8. 删除链表中指定元素

删除链表中指定元素,即找到该元素,然后将其从链表中删除。具体操作是:找到该元素所在的节点,将该节点从链表中删除。

Node *p = head;
Node *pre = NULL;

while (p != NULL && p->data != deleteValue)
{
    pre = p;
    p = p->next;
}

if (p == NULL)
{
    printf("Deletion failed. Node with value %d not found.\n", deleteValue);
}
else
{
    if (pre == NULL)
    {
        head = p->next;
    }
    else
    {
        pre->next = p->next;
    }

    free(p);
    p = NULL;
}

9. 在链表中查找指定元素

在链表中查找指定元素,即查找链表中是否存在该元素。具体操作是:遍历链表,判断元素是否在链表中。

Node *p = head;
while (p != NULL && p->data != searchValue)
{
    p = p->next;
}

if (p == NULL)
{
    printf("Node with value %d not found.\n", searchValue);
}
else
{
    printf("Node with value %d found.\n", searchValue);
}

10. 链表的反转

链表的反转,即将单链表中的元素反转过来。将head指针指向的单链表中的元素倒序排列。

Node *pre = NULL;
Node *p = head;
Node *next = NULL;
while (p != NULL)
{
    next = p->next;
    p->next = pre;
    pre = p;
    p = next;
}
head = pre;

11. 链表的销毁

链表的销毁,即释放链表中的所有元素所占用的内存空间。具体操作是:遍历单链表,逐个释放节点占用的内存空间,并将节点指针设为NULL。

Node *p = head;
Node *next = NULL;

while (p != NULL)
{
    next = p->next;
    free(p);
    p = next;
}
head = NULL;

示例1:

Node *head = NULL;
head = (Node*)malloc(sizeof(Node));
head->data = 1;
head->next = NULL;

Node *newNode = (Node*)malloc(sizeof(Node));
newNode->data = 2;
newNode->next = NULL;
head->next = newNode;

以上代码代码创建了两个节点,一个节点的data为1,另外一个节点的data为2,并且让head指针指向第一个节点。同时将第二个节点作为第一个节点的下一个节点。

示例2:

Node *head = NULL;
head = (Node*)malloc(sizeof(Node));
head->data = 1;
head->next = NULL;

while (head != NULL)
{
    Node *p = head;
    head = head->next;
    free(p);
}

以上代码销毁了一个单链表,将节点依次释放,并且将head指针设为NULL。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:用C语言实现单链表的各种操作(一) - Python技术站

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

相关文章

  • C数据结构中串简单实例

    下面我将为您详细讲解C语言中串的简单实例。 1. 什么是串 在C语言中,串(String)是由一系列字符组成的序列,是一种常见的数据类型。在C语言中,串通常是以字符数组(Char Array)的方式进行存储的。 2. 定义和初始化串 在C语言中,定义和初始化串可以通过以下方式进行: #include <stdio.h> #include <…

    数据结构 2023年5月17日
    00
  • 虹科案例 | 虹科Domo商业智能,助力保险公司逃离繁杂数据池!

    金融行业的发展充满着不确定性,一个具备强大承保能力和精算专业知识的资金池,对于身处该领域的公司和个人都是十分必要的。 在全国城市联盟(NLC)的协助下成立的NCL Mutual会员制互助保险公司,为各个地区城市提供了稳定的再保险答案。,然而,面对数字化转型这场已经打响的战斗,NCL Mutual却因缺乏中心商业智能系统,在利用数据处理索赔和承保的能力受到了极…

    算法与数据结构 2023年4月17日
    00
  • C++ 数据结构线性表-数组实现

    C++ 数据结构线性表-数组实现 什么是线性表 线性表,简单来说,就是一种有序的数据结构,数据元素起来往往构成一列,比如数组、链表等等。 数组实现线性表 数组是一种容器,它可以存储相同类型的数据元素。使用数组实现线性表,就是将数据元素按照一定的顺序依次存储在数组中。 数组实现线性表的基本思路 定义一个数组,用来存储数据元素; 定义一个变量,用来记录线性表中元…

    数据结构 2023年5月17日
    00
  • 字典树的基本知识及使用C语言的相关实现

    字典树的基本知识 字典树,英文名为Trie树,又称单词查找树或键树,是一种树形数据结构,用于表示关联数组或映射。它的优点是,可以大大减少无谓的字符串比较,查询效率比哈希表高。 字典树的核心概念是节点,每个节点包含一个字符和指向子节点的指针。根节点为空字符,每个字符串以一个独立的路径插入节点。如果一个字符串是另一个字符串的前缀,那么这个字符串的节点是另一个字符…

    数据结构 2023年5月17日
    00
  • JavaScript数据结构之广义表的定义与表示方法详解

    JavaScript数据结构之广义表的定义与表示方法详解 什么是广义表 广义表是一种包含了无数元素的数据结构,可以是元素或者嵌套的子表。广义表可以表示为: $\quad\quad\quad GL = (a_0,a_1,…,a_n)$ 其中$a_i$可以是元素或者一个子表,如果$a_i$为一个子表,那么$a_i$本身也是一个广义表。广义表中,第一个元素$a…

    数据结构 2023年5月17日
    00
  • C语言数据结构与算法之链表(一)

    欢迎阅读本篇文章,本文将为大家详细讲解C语言中数据结构与算法之链表。接下来,将从以下几个方面为大家讲述: 链表的定义 链表的特点 链表的分类 单向链表的实现及应用 双向链表的实现及应用 示例说明 1. 链表的定义 链表是由一系列节点组合而成的数据结构,每个节点都包含了一个数据域和一个指向下一个节点的指针域。其中,链表的头结点为第一个节点,而尾节点为最后一个节…

    数据结构 2023年5月17日
    00
  • Halcon学习教程(一) 之提取十字线中心 图像分割

      原文作者:aircraft   原文链接:https://www.cnblogs.com/DOMLX/p/17266405.html      废话不多说,因为毕业后工作原因比较忙,好久没更新博客了,直接上图。。。     上图有个十字线,我们要提取出十字线的中心(Hhhh这个线是我随手画的 没画直!!) 第一步:肯定是读取图像进行灰度提取处理啦。   …

    算法与数据结构 2023年4月18日
    00
  • 考研数据结构模板:顺序表、链表、栈、队列

    考研数据结构模板:顺序表、链表、栈、队列 前言 代码风格偏向于考研风格而非算法竞赛风格。 代码实现参考《2024数据结构王道复习指导》。 注释详细、保证看懂。 下面是已实现的数据结构模板: 顺序表SeqList 链表LinkList 双链表DLinkList 顺序栈SeqStack 循环顺序队列CircleQueue 链队列LinkQueue 顺序表SeqL…

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