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

相关文章

  • C语言数据结构顺序表中的增删改(头插头删)教程示例详解

    C语言数据结构顺序表中的增删改(头插头删)教程示例详解 什么是顺序表? 顺序表是一种用数组实现的线性表,所有元素存储在一块连续的存储区中。顺序表的操作包括插入、删除、查找等。 常用的顺序表操作 增加元素 删除元素 修改元素 查找元素 以下以头插和头删为例,讲解如何在C语言数据结构顺序表中实现这些操作。 头插操作 头插的实现首先需要考虑插入位置的下标,由于是头…

    数据结构 2023年5月17日
    00
  • python学习数据结构实例代码

    “Python学习数据结构实例代码”的完整攻略如下: 1. 学习前提 在学习Python数据结构之前,需要具备一定的Python基础知识,包括语法、数据类型、操作符、控制流等基础知识。 2. 学习步骤 2.1 选择学习资料 可以选择阅读相关书籍或者参加在线课程来学习Python数据结构。推荐一些经典的学习资料: 《Python基础教程》第二版(作者:Magn…

    数据结构 2023年5月17日
    00
  • C语言数据结构树的双亲表示法实例详解

    C语言数据结构树的双亲表示法实例详解 什么是双亲表示法 在树上,每个节点都有且仅有一个父节点(根节点除外)。对于一个树结构,我们可以使用许多方法来表示这个树,其中最常见的一种方法是双亲表示法。该表示法使用一个一维数组来存储树的节点,数组的下标即为该节点的编号,数组的值则表示该节点的父节点编号。 当一个节点没有父节点时,该节点即为根节点。 双亲表示法的优缺点 …

    数据结构 2023年5月17日
    00
  • 数据结构之哈夫曼树与哈夫曼编码

    一、背景 编码是信息处理的基础(重新表示信息)。 普通的编码是等长编码,例如7位的ASCIL编码,对出现频率不同的字符都使用相同的编码长度。但其在传输和存储等情况下编码效率不高。 可使用不等长编码,来压缩编码:高频字符编码长度更短,低频字符编码长度更长。   [例] 将百分制的考试成绩转换成五分制的成绩 按顺序分别编码。 按频率分别编码(高频短编码,类似于香…

    算法与数据结构 2023年4月17日
    00
  • 数据结构 数组顺序存储详细介绍

    数据结构数组顺序存储详细介绍 什么是数组顺序存储? 数组是最基本的数据结构之一,在计算机程序中使用广泛。在数组中,存储的元素类型相同且占用相同的内存空间,可以通过下标进行快速访问和修改。数组可以使用不同的方法来存储在内存中,其中最简单的方法是数组顺序存储。 数组顺序存储是指将元素按照顺序依次存储在内存中的一块连续地址中,可以方便地进行随机访问。这种方式与链式…

    数据结构 2023年5月17日
    00
  • 一文学会数据结构-堆

    一文学会数据结构-堆 什么是堆 在计算机科学中,堆是一个特殊的树状数据结构。堆通常有如下几个特性: 堆是完全二叉树; 堆中每个节点的值都大于或等于(小于或等于)其子节点的值,这个取值规则称为堆的“属性”; 堆顶元素(即根节点)总是为最大值或最小值。 堆的种类 堆分为小根堆和大根堆两种。小根堆要求每个节点的值都不大于其父节点的值,即A[PARENT[i]] &…

    数据结构 2023年5月17日
    00
  • 带你了解Java数据结构和算法之2-3-4树

    带你了解Java数据结构和算法之2-3-4树 1. 什么是2-3-4树 2-3-4树是一种自平衡二叉查找树,也叫B树的一种,它可以保持树的平衡,使得每个节点的左右子树高度差最多为1。在2-3-4树中,每个节点可以包含2个、3个或4个子节点,这也是其名称的来源。2-3-4树是B树的特殊形式,通常用于内存储存结构。 2. 2-3-4树的特点 2-3-4树的特点如…

    数据结构 2023年5月17日
    00
  • redis中hash数据结构及说明

    Redis中Hash数据结构及说明 简介 Redis中的Hash是一个string类型的field和value的映射表,可以将多个键值对存储在一个数据结构中,适合于存储对象。 通过HASH数据结构,我们可以方便的对单个field进行增删改查操作,增加了程序编写的方便性。 命令 以下是Hash数据结构的基础命令: HSET 将哈希表 key 中的域 field…

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