C语言编写一个链表

以下是C语言编写一个链表的完整攻略:

概述

链表是一种基本数据结构,它是由一系列不连续的节点组成的。每个节点包含两部分,一部分是数据,一部分是指向下一个节点的指针。链表中的数据可以是任何类型的,如int、char、结构体等。链表有单向链表和双向链表两种类型,本文主要介绍单向链表。

相关操作

链表的基本操作包括插入、删除、查找等。下面介绍单向链表的几个基本操作:

链表节点的定义

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

链表节点包含两部分,一部分是节点的值,另一部分是指向下一个节点的指针。

在链表头插入一个节点

ListNode* addAtHead(ListNode* head, int val)
{
    ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
    newNode->val = val;
    newNode->next = head;
    return newNode;
}

上述函数实现在链表头插入一个节点。

在链表尾插入一个节点

ListNode* addAtTail(ListNode* head, int val)
{
    ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
    newNode->val = val;
    newNode->next = NULL; 

    if (head == NULL) return newNode;

    ListNode* cur = head;
    while (cur->next != NULL) {
        cur = cur->next;
    }
    cur->next = newNode;
    return head;
}

上述函数实现在链表尾插入一个节点。

删除链表中第一个值为给定值的节点

ListNode* deleteNode(ListNode* head, int val)
{
    if (head == NULL) return NULL;
    if (head->val == val) return head->next;

    ListNode* cur = head;
    while (cur->next != NULL && cur->next->val != val) {
        cur = cur->next;
    }
    if (cur->next != NULL) {
        cur->next = cur->next->next;
    }
    return head;
}

上述函数实现删除链表中第一个值为给定值的节点。

示例

下面给出两个示例:

示例1

输入:head = [1,2,3,4,5], val = 3
输出:[1,2,4,5]

ListNode* head = NULL;
head = addAtTail(head, 1);
head = addAtTail(head, 2);
head = addAtTail(head, 3);
head = addAtTail(head, 4);
head = addAtTail(head, 5);

printList(head);
head = deleteNode(head, 3);
printList(head);

示例2

输入:head = [1,2,3,4,5], val = 6
输出:[1,2,3,4,5]

ListNode* head = NULL;
head = addAtTail(head, 1);
head = addAtTail(head, 2);
head = addAtTail(head, 3);
head = addAtTail(head, 4);
head = addAtTail(head, 5);

printList(head);
head = deleteNode(head, 6);
printList(head);

总结

本文介绍了C语言编写一个链表的基本操作,包括链表节点的定义、在链表头插入一个节点、在链表尾插入一个节点、删除链表中第一个值为给定值的节点等。同时给出了两个示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言编写一个链表 - Python技术站

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

相关文章

  • Win11连接wifi频繁掉线怎么办 Win11网络不稳定的解决办法

    针对 Win11 连接 WIFI 频繁掉线和网络不稳定的问题,以下是详细攻略: 1. 关闭电脑和路由器的防火墙 有时,电脑和路由器的防火墙可能会阻止连接,导致 WIFI 频繁掉线。因此,我们可以尝试暂时关闭它们。 首先,我们需要关闭电脑的防火墙:在 Windows 系统中,打开“控制面板”>“系统和安全”>“Windows Defender 防火…

    other 2023年6月27日
    00
  • 怎么激活StarUML StarUML激活教程分享 附补丁下载

    怎么激活StarUML StarUML是一款流行的UML建模工具,但是它的免费试用期有限。为了继续使用它的全部功能,您需要激活StarUML。下面是激活StarUML的完整攻略。 步骤一:下载StarUML 首先,您需要下载StarUML的安装程序。您可以在官方网站(https://staruml.io)上找到最新版本的StarUML。根据您的操作系统选择正…

    other 2023年7月27日
    00
  • 魔兽世界7.3.5酒仙怎么堆属性 wow7.35酒仙配装属性优先级攻略

    魔兽世界7.3.5酒仙怎么堆属性 wow7.35酒仙配装属性优先级攻略 在游戏中,给自己的角色进行配装是提升战斗力的重要手段之一。而在魔兽世界7.3.5版本中,酒仙职业的属性堆叠较为特殊,需要注重一些细节。下面将详细讲解魔兽世界7.3.5酒仙怎么堆属性和酒仙配装属性优先级攻略。 1. 属性堆叠 酒仙作为坦克职业,其属性堆叠应以耐力(Stamina)和身法(A…

    other 2023年6月27日
    00
  • 鼠标右键失灵怎么办?鼠标右键失灵原因分析及解决方法

    鼠标右键失灵怎么办?鼠标右键失灵原因分析及解决方法 原因分析 鼠标右键失灵可能是因为以下几个原因: 鼠标驱动问题:鼠标驱动程序出现错误,导致鼠标工作异常。 软件设置问题:某些软件设置鼠标右键点击无效或者拦截了鼠标右键的操作。 硬件问题:鼠标出现故障,右键点击功能出现异常。 解决方法 以下是几种解决方法: 方法一:重新安装鼠标驱动 1.在开始菜单中搜索设备管理…

    other 2023年6月27日
    00
  • SpringBoot整合RocketMQ的方法详解

    下面我将为您详细讲解“SpringBoot整合RocketMQ的方法详解”的完整攻略。 简介 首先,让我们来了解一下 SpringBoot 和 RocketMQ。SpringBoot 是一个快速开发的框架,通过提供开发者友好的接口,使开发者可以轻松地构建 Web 应用,并且可以集成多种开源框架。RocketMQ 是阿里巴巴开源的消息中间件,可以实现高可靠、高…

    other 2023年6月27日
    00
  • 33种Javascript 表格排序控件收集

    一、介绍 在前端开发中,表格是一个常见的展示数据的方式。其中,表格排序是一个重要的功能,可以让用户更方便地查看数据。在Javascript中,有许多表格排序插件可以使用。本文将介绍33种Javascript 表格排序控件,帮助开发者更好地了解和选择适合自己的插件。 二、具体操作步骤 1、了解不同类型的表格排序插件 了解不同类型的表格排序插件是选择合适插件的第…

    other 2023年6月27日
    00
  • Java中static修饰的静态变量、方法及代码块的特性与使用

    Java中static修饰的静态变量、方法及代码块的特性与使用 1. 静态变量 静态变量是属于类的变量,可以通过类名或者对象名来访问。静态变量的特点是在内存中只有一个副本,被类所有的实例共享。定义静态变量的格式为:static dataType variableName。 静态变量的使用示例: public class Dog { private Strin…

    other 2023年6月27日
    00
  • zigbee和z-wave的区别与未来

    Zigbee和Z-Wave的区别 Zigbee和Z-Wave都是无线通信协议,用于智能家居设备之间的通信。它们的主要区别在于以下几个方面: 1. 工作频段 Zigbee和Z-Wave使用不同的频段进行通信。Zigbee使用2.4GHz频段,而Z-Wave使用900MHz频段。这意味着Z-Wave在穿墙能力和信号传输距离方面更好,但Zigbee在信道数量和带宽…

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