C语言实现单链表的基本功能详解

C语言实现单链表的基本功能详解

简介

单链表是一种常见的数据结构,由一系列的节点(Node)组成,每个节点包含数据和指向下一个节点的指针,最后一个节点的指针为NULL。C语言实现单链表需要掌握指针和动态内存分配的知识,具有一定难度。本文将详细讲解C语言实现单链表的基本功能。

基本结构

定义单链表结点的结构体,包括数据和指向下一个结点的指针,如下所示:

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

该结构体定义了一个Node类型的节点,包含数据data和指向下一个节点的指针next。

定义头节点,头节点不存储数据,只用于表示单链表的开始。

Node *head = NULL;

head是一个指向Node类型的指针,初始值为NULL,表示链表为空。

基本功能

添加节点

添加节点是单链表最基本的操作之一,在单链表中,可以在头节点或者尾节点后面添加一个新节点。

在头节点后插入

在头节点后插入新节点,需要先创建一个新节点,然后将新节点的next指针指向head,再将head指向新节点。

void insertAtHead(int data)
{
    Node *newNode = (Node *)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = head;
    head = newNode;
}

在尾节点后插入

在尾节点后插入新节点,需要先找到尾节点,然后创建新节点,将尾节点的next指向新节点,再将新节点的next指针设置为NULL。

void insertAtTail(int data)
{
    Node *newNode = (Node *)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = NULL;

    if (head == NULL)   // 空链表,直接插入
    {
        head = newNode;
        return;
    }

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

删除节点

删除节点同样是单链表的基本操作之一,可以删除指定位置的节点,或者删除指定数值的节点。

删除指定位置节点

删除指定位置节点,需要先找到指定位置,然后修改前一个节点的next指针,使其指向被删除节点的下一个节点。

void deleteByPos(int pos)
{
    if (head == NULL)
    {
        printf("链表为空\n");
        return;
    }

    if (pos == 1)   // 删除头节点
    {
        Node *temp = head;
        head = head->next;
        free(temp);
        temp = NULL;
        return;
    }

    Node *p = head;
    int i = 1;
    while (p != NULL && i < pos - 1)  // 找到要删除节点的前一个节点
    {
        p = p->next;
        i++;
    }

    if (p == NULL || p->next == NULL)  // 要删除的节点不存在
    {
        printf("要删除的节点不存在\n");
        return;
    }

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

删除指定数值节点

删除指定数值节点,需要遍历单链表,找到指定数值的节点,然后进行删除操作。

void deleteByData(int data)
{
    if (head == NULL)
    {
        printf("链表为空\n");
        return;
    }

    if (head->data == data)  // 删除头节点
    {
        Node *temp = head;
        head = head->next;
        free(temp);
        temp = NULL;
        return;
    }

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

    if (p->next == NULL)  // 要删除的节点不存在
    {
        printf("要删除的节点不存在\n");
        return;
    }

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

查找节点

查找节点可以按位置查找,也可以按数值查找。

按位置查找

按位置查找,需要遍历单链表,找到指定位置的节点。

Node *findByPos(int pos)
{
    if (head == NULL)
    {
        printf("链表为空\n");
        return NULL;
    }

    Node *p = head;
    int i = 1;
    while (p != NULL && i < pos)
    {
        p = p->next;
        i++;
    }

    if (p == NULL)  // 要查找的节点不存在
    {
        printf("要查找的节点不存在\n");
        return NULL;
    }

    return p;
}

按数值查找

按数值查找,同样需要遍历单链表,找到指定数值的节点。

Node *findByData(int data)
{
    if (head == NULL)
    {
        printf("链表为空\n");
        return NULL;
    }

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

    if (p == NULL)  // 要查找的节点不存在
    {
        printf("要查找的节点不存在\n");
        return NULL;
    }

    return p;
}

示例说明

示例一:在头节点插入新节点

#include <stdio.h>
#include <stdlib.h>

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

Node *head = NULL;

void insertAtHead(int data)
{
    Node *newNode = (Node *)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = head;
    head = newNode;
}

int main()
{
    insertAtHead(3);
    insertAtHead(2);
    insertAtHead(1);

    Node *p = head;
    while (p != NULL)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");

    return 0;
}

输出结果:

1 2 3

示例二:在尾节点插入新节点

#include <stdio.h>
#include <stdlib.h>

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

Node *head = NULL;

void insertAtTail(int data)
{
    Node *newNode = (Node *)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = NULL;

    if (head == NULL)
    {
        head = newNode;
        return;
    }

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

int main()
{
    insertAtTail(1);
    insertAtTail(2);
    insertAtTail(3);

    Node *p = head;
    while (p != NULL)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");

    return 0;
}

输出结果:

1 2 3

总结

本文主要讲解了C语言实现单链表的基本功能,包括添加节点、删除节点、查找节点等操作。需要掌握的知识点有指针和动态内存分配。单链表是一种非常常用的数据结构,掌握基本操作可以为后续数据结构和算法的学习打下基础。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现单链表的基本功能详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • C语言初识变量常量字符串转义符及注释方式简介

    C语言初识变量常量字符串转义符及注释方式简介 变量和常量 在C语言中,我们可以定义变量来存储数据。变量就像一个盒子,可以存储不同类型的数据,包括整数,浮点数,字符等等。在C语言中,我们可以使用已经定义好的数据类型来定义变量。 // 定义一个整型变量a,并且给它赋值为10 int a = 10; // 定义一个浮点型变量b,并且给它赋值为3.14 float …

    other 2023年6月20日
    00
  • JetBrains全家桶汉化包安装教程 附中文包下载地址

    JetBrains全家桶汉化包安装教程 本教程将详细讲解如何安装JetBrains全家桶汉化包,并提供中文包下载地址。JetBrains全家桶是一套集成开发环境(IDE)工具,包括IntelliJ IDEA、PyCharm、WebStorm等。 步骤一:下载中文包 首先,我们需要下载适用于你所使用的JetBrains全家桶版本的中文包。你可以从以下地址下载中…

    other 2023年8月5日
    00
  • Win10 Build 14393.1378累积更新补丁KB4022723下载地址(附修复解决问题+已知问题)

    Win10 Build 14393.1378累积更新补丁KB4022723下载地址(附修复解决问题+已知问题)攻略 下载地址 你可以从以下位置下载Win10 Build 14393.1378累积更新补丁KB4022723: 官方下载链接 备用下载链接 修复解决问题 该累积更新补丁KB4022723解决了以下问题: 问题1:某些应用程序在运行时崩溃。 解决方案…

    other 2023年8月5日
    00
  • Win11用户配置文件怎么设置? win11用户配置文件恢复技巧

    Win11 用户配置文件是储存在用户目录下的隐藏文件夹,其中储存了个性化设置、应用程序配置、文档和其他重要配置信息。在Win11系统中,如果用户配置文件发生问题,可能会导致程序无法启动,系统出现错误等问题。因此,正确地配置和备份用户配置文件非常重要。本文将详细讲解Win11用户配置文件的设置和恢复技巧。 配置Win11用户配置文件 步骤一:显示隐藏文件夹 首…

    other 2023年6月25日
    00
  • 轻松掌握Linux关机重启命令

    下面是轻松掌握Linux关机重启命令的攻略: 1. 关闭Linux系统 在命令行中使用shutdown命令可以用来关闭Linux系统,命令的格式如下: sudo shutdown [option] time 其中,option指定了shutdown的选项,time指定了关机时间。 1.1. 关机选项 -r,重启系统 -h,关机 -c,取消上一次的shutdo…

    other 2023年6月27日
    00
  • [下载]Win10 Build 10147 64位ISO镜像和语言包下载地址泄露

    [下载]Win10 Build 10147 64位ISO镜像和语言包下载地址泄露攻略 简介 本攻略将详细讲解如何获取并下载Win10 Build 10147 64位ISO镜像和语言包下载地址。请注意,这些下载地址的泄露可能涉及非法行为,我们强烈建议您遵守相关法律法规并仅在合法途径下获取软件。 步骤 步骤一:搜索相关信息 首先,您需要搜索相关信息以获取Win1…

    other 2023年8月5日
    00
  • win7/win8.1桌面右键”新建文件夹”不见了的快速找回方法

    下面是详细的攻略: 问题描述 在Windows7和Windows8.1系统中,桌面右键菜单中的“新建文件夹”不见了,无法快速创建新文件夹,应该如何解决呢? 解决方法 其实这个问题很容易解决,只要按照以下步骤操作即可: 打开“运行”窗口,可以通过快捷键Win + R打开; 在“运行”窗口中输入“regedit”并回车; 进入注册表编辑器界面后,在左侧导航栏中依…

    other 2023年6月27日
    00
  • Java使用Socket简单通讯详解

    下面是关于“Java使用Socket简单通讯详解”的完整攻略: 简介 在编写网络应用程序时,经常需要进行网络通信,而Socket就是这个时候经常使用的一种通信方式。本篇文章将分享如何使用Java中的Socket实现简单的通讯。 Socket通信原理 先介绍一下Socket通信的基本原理。在Socket通信中,客户端连接服务器后,双方建立起一个TCP连接,之后…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部