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

“用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日

相关文章

  • JS中的算法与数据结构之链表(Linked-list)实例详解

    JS中的算法与数据结构之链表(Linked-list)实例详解 什么是链表? 链表是计算机科学中的一种数据结构,由一系列结点(Link,也称为节点)组成,并通过每个节点中的指针(Pointer)链接在一起。每个节点包含数据和一个指向某个位置的引用。 链表的主要特点是在插入和删除操作中表现出很高的效率。与数组相比,链表的访问和操作速度较慢,但在处理动态结构数据…

    数据结构 2023年5月17日
    00
  • Python描述数据结构学习之哈夫曼树篇

    Python描述数据结构学习之哈夫曼树篇攻略 简介 本篇攻略旨在介绍哈夫曼树的概念、构建方法和应用场景,并结合Python代码进行演示。 哈夫曼树概念 哈夫曼树(Huffman Tree)又称最优树,它是一种带权路径长度最短的树。所谓带权路径长度,就是每个节点的权值乘以其到根节点的路径长度(即树的层数)之和。哈夫曼树广泛应用于数据压缩领域。 哈夫曼树构建方法…

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

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

    数据结构 2023年5月17日
    00
  • Redis之常用数据结构哈希表

    Redis之常用数据结构哈希表 Redis是一种开源的、高性能的、基于内存的数据存储系统,它支持多种数据结构,包括字符串、哈希表、列表、集合和有序集合等。其中哈希表是一种常用的数据结构,本文将详细讲解Redis中的哈希表。 哈希表概述 哈希表是一种通过哈希函数和数组实现的数据结构,能够快速地进行插入、查找和删除等操作,时间复杂度为O(1)。在Redis中,哈…

    数据结构 2023年5月17日
    00
  • C语言数据结构之简易计算器

    C语言数据结构之简易计算器攻略 简介 这是一个基于C语言的简易计算器,可以实现加、减、乘、除四个基本运算。 实现步骤 首先,需要声明四个变量,分别表示运算符、被加数、被减数、被乘数和被除数。 char op; double n1, n2, result; 然后,需要通过scanf()函数获取用户输入的运算符和数字。 printf(“请输入运算符和数字:\n”…

    数据结构 2023年5月17日
    00
  • Java数据结构学习之二叉树

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

    数据结构 2023年5月17日
    00
  • 浅谈iOS 数据结构之链表

    浅谈iOS 数据结构之链表 在计算机科学中,链表是一种数据结构,用于存储一系列按顺序排列的元素。链表的一个关键点是它不需要连续的内存空间来存储元素,相反,每个元素由一个指向下一个元素的指针组成。在iOS开发中,链表在各种场景下都有所应用,如UITableView和UICollectionView的数据源等。本文将详细讲解链表的基本知识和使用技巧。 链表的基本…

    数据结构 2023年5月17日
    00
  • Java数据结构之循环队列简单定义与用法示例

    Java数据结构之循环队列简单定义与用法示例 什么是循环队列? 循环队列是一种数据结构,它具有先进先出(FIFO)的特点,即最先进队列的元素总是被最先取出。不同于普通队列,循环队列的尾指针指向数组的头部,因此可以实现循环利用数组空间,提高存储空间的利用率,避免因队列的操作大量移动数组元素而导致的时间浪费。 循环队列的基本操作 循环队列的基本操作包括:入队、出…

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