数据结构之单链表在不带标准头的情况下C,C#,C++分别怎么实现?

news2024/12/28 22:03:18

文章目录

  • 单链表的概念
  • 单链表的操作
  • 单链表不带标准头结点示例
    • C语言实现
    • C#实现
    • C++实现

在这里插入图片描述


数据结构是计算机科学中非常重要的一部分,它帮助我们理解和操作数据。单链表是数据结构中的一种基本类型,它由一系列节点组成,每个节点包含数据域和指向列表中下一个节点的指针。在本文中,我们将详细讨论单链表的概念、操作和如何在几种常见的编程语言中实现它。

单链表的概念

单链表是一种线性数据结构,其中每个元素都是一个独立的对象,称为节点。每个节点都包含两个部分:数据域和指针域。数据域用于存储节点的数据,而指针域用于存储下一个节点的地址。

单链表可以分为两种类型:带头结点和不带头结点。带头结点的单链表在列表的第一个位置有一个特殊的头节点,它的数据域通常不存储有效数据,主要用于简化某些操作。不带头结点的单链表则直接从第一个有效节点开始。

单链表的特点是元素在内存中不是连续存储的,而是分散存储的。每个结点只存储指向下一个结点的指针,而不是存储整个列表的地址。因此,单链表中的元素在物理上是不连续的,它们通过指针连接起来形成一个逻辑上的线性序列。

单链表的操作

单链表的主要操作包括:

创建链表: 初始化一个空链表或带有特定数据的链表。
插入节点: 在链表的指定位置插入新节点。
删除节点: 根据节点的数据或位置删除节点。
遍历链表: 按照节点的顺序访问链表中的每个节点。
搜索节点: 根据节点的数据查找节点的位置。
释放链表: 删除链表中的所有节点,释放分配的内存。

单链表不带标准头结点示例

在单链表不带标准头结点的情况下,C语言、C#和C++的实现方式略有不同。下面分别给出每种语言的简单实现示例:

C语言实现

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

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

// 插入节点到链表尾部
void insertNode(struct Node** head, int data) {
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->data = data;
    newNode->next = NULL;

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

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

// 打印链表内容
void printList(struct Node* head) {
    struct Node* current = head;
    while (current != NULL) {
        printf("%d -> ", current->data);
        current = current->next;
    }
    printf("NULL\n");
}

// 测试主函数
int main() {
    struct Node* head = NULL;

    insertNode(&head, 1);
    insertNode(&head, 2);
    insertNode(&head, 3);

    printf("Linked List: ");
    printList(head);

    return 0;
}

C#实现

using System;

public class Node {
    public int data;
    public Node next;
    
    public Node(int data) {
        this.data = data;
        this.next = null;
    }
}

public class LinkedList {
    private Node head;

    // 插入节点到链表尾部
    public void InsertNode(int data) {
        Node newNode = new Node(data);
        
        if (head == null) {
            head = newNode;
            return;
        }

        Node current = head;
        while (current.next != null) {
            current = current.next;
        }
        current.next = newNode;
    }

    // 打印链表内容
    public void PrintList() {
        Node current = head;
        while (current != null) {
            Console.Write(current.data + " -> ");
            current = current.next;
        }
        Console.WriteLine("NULL");
    }

    // 测试主函数
    public static void Main() {
        LinkedList list = new LinkedList();

        list.InsertNode(1);
        list.InsertNode(2);
        list.InsertNode(3);

        Console.Write("Linked List: ");
        list.PrintList();
    }
}

C++实现

#include <iostream>
using namespace std;

struct Node {
    int data;
    Node* next;
    
    Node(int data) {
        this->data = data;
        this->next = nullptr;
    }
};

// 插入节点到链表尾部
void insertNode(Node*& head, int data) {
    Node* newNode = new Node(data);
    
    if (head == nullptr) {
        head = newNode;
        return;
    }

    Node* current = head;
    while (current->next != nullptr) {
        current = current->next;
    }
    current->next = newNode;
}

// 打印链表内容
void printList(Node* head) {
    Node* current = head;
    while (current != nullptr) {
        cout << current->data << " -> ";
        current = current->next;
    }
    cout << "NULL" << endl;
}

// 测试主函数
int main() {
    Node* head = nullptr;

    insertNode(head, 1);
    insertNode(head, 2);
    insertNode(head, 3);

    cout << "Linked List: ";
    printList(head);

    return 0;
}

这些示例展示了如何在不带标准头结点的情况下实现单链表的基本操作(插入节点和打印链表)。在这种情况下,头指针需要作为参数传递到函数中,以便在链表为空时可以正确地修改头结点。

总结来说,单链表作为基础的数据结构,在很多编程问题中都有着广泛的应用,掌握好单链表的操作能力对理解和解决复杂的算法问题有很大帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1922136.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

强化学习编程实践-4-基于蒙特卡洛的方法

第3章给出了学习算法的基本思路&#xff1a;策略评估和策略改善。其中策略评估用到了以下的公式&#xff08;4.1&#xff09;&#xff1a; 策略改善则用了最简单的贪婪策略&#xff08;4.2&#xff09;&#xff1a; 为什么要用蒙特卡洛算法&#xff1f;先看公式4.1和4.2&#x…

图鸟UI框架在uni-app多端应用开发中的实践与应用

摘要&#xff1a; 随着移动互联网的蓬勃发展&#xff0c;跨平台应用开发已成为行业趋势。本文将探讨图鸟UI框架如何在uni-app开发环境下助力开发者高效构建多端应用&#xff0c;并通过具体案例展示其在实际项目中的应用效果。 一、引言 在移动应用开发领域&#xff0c;跨平台…

【错题集-编程题】栈和排序(栈 + 贪心)

牛客对于题目连接&#xff1a;栈和排序_牛客题霸_牛客网 (nowcoder.com) 一、分析题目 每次尽可能的先让当前需要的最大值弹出去。 二、代码 // 修改后的代码 class Solution { public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方…

百度文心4.0 Turbo开放,领跑国内AI大模型赛道!

百度文心4.0 Turbo开放&#xff0c;领跑国内AI大模型赛道&#xff01; 前言 文心一言大模型 就在7月5日&#xff0c;在2024世界人工智能大会 (WAIC) 上&#xff0c;百度副总裁谢广军宣布文心大模型4.0 Turbo正式向企业客户全面开放&#xff01;这一举动直接引发了业界的关注。那…

uniapp微信小程序 TypeError: $refs[ref].push is not a function

我的写法 this.$refs.addPopup.open();报错 打印出来是这样的 解决 参考未整理 原因 在当前页面使用的v-for循环 并且循环体内也有组件使用了ref&#xff08;而我没有把每个ref做区别命名&#xff09; 这样就导致了我有很多同名的ref&#xff0c;然后就报错了 解决办法&a…

上海-三轮摩托车—D证科目四 错题记录

目录 1.安全驾驶题 2.道路图标题 3.天气类情景题 4.事故处理类题 上海-三轮摩托车—D证科目一 错题记录: 1.安全驾驶题

阐述 C 语言中的浮点数精度问题?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; &#x1f4d9;C 语言百万年薪修炼课程 【https://dwz.mosong.cc/cyyjc】通俗易懂&#xff0c;深入浅出&#xff0c;匠心打磨&#xff0c;死磕细节&#xff0c;6年迭代&…

tableau回归分析与时间序列分析 - 17

回归分析与时间序列分析 1. 回归分析1.1 线性回归绘制1.1.1 导入数据1.1.2 基本绘制1.1.3 趋势线显示-方法一1.1.4 趋势线显示-方法二1.1.5 趋势线显示-方法三1.1.6 添加区域注释 1.2 指数回归绘制1.2.1 创建字段1.2.2 异常区分1.2.3 创建参数1.2.4 异常区分字段修改1.2.5 显示…

MySQL学习笔记 下

MySQL学习笔记&#xff08;需接上篇&#xff09; 1. 通配符 用于替换字符串中的一个或多个字符&#xff1b;通配符常与LIKE关键字一起使用&#xff0c;用于搜索字段中的指定模式&#xff1b; 2. 别名 用于为表或表中的列提供临时名称&#xff1b; 别名用于为表或表中的字段…

【安卓学习】状态开关按钮

Switch 状态开关按钮&#xff08;Switch&#xff09;也是由 Button 派生出来的&#xff0c;所以在本质上它也算是一个比较高级的按钮&#xff0c;用户可以来回拖动“拇指”控制该按钮的开启与关闭或者只需轻按&#xff0c;就像选择复选框一样来开启该组件。 基本语法 <Sw…

外贸淡季如何应对?九大技巧告诉你!

许多外贸人都知道&#xff0c;7-9月是外贸的淡季&#xff0c;主要是因为西方国家很多公司会放假&#xff0c;或者轮流放。欧美人扎堆度假去了&#xff0c;欧洲城市街头的人数会减少很多。导致很多订单暂缓。所以这三个月经常被称为是外贸“淡季”。 大体上讲&#xff0c;外贸的…

警钟!电池储能安全事故频发!物联网技术如何加强储能安全排查?

在新能源时代背景下&#xff0c;储能系统作为能源转型的关键支撑技术&#xff0c;其安全问题日益凸显&#xff0c;尤其是近期海外电池项目连续发生的事故&#xff0c;为全球储能行业敲响了警钟。面对这一挑战&#xff0c;物联网技术以其强大的数据采集、智能分析与远程监控能力…

聊聊mysql

记录那些坑 本文会持续更新&#xff0c;陆续更新有关mysql技术内幕、实战优化、面试技巧。 文章目录 前言索引BTree之聚集索引BTree之辅助索引BTree之联合索引BTree之覆盖索引 使用到的工具1、py_innodb_page_info工具2、hexdump工具 总结 前言 重中之重的MySql数据库 mysql…

ARM功耗管理之睡眠锁

安全之安全(security)博客目录导读 思考&#xff1a;什么是睡眠锁&#xff1f;什么是唤醒源&#xff1f;什么是组合唤醒源&#xff1f; Kernel wakelocks的功能&#xff1a; 1&#xff09;允许driver创建wakelock以阻止睡眠、注销wakelock以允许睡眠。 2&#xff09;wake_lo…

SpringBoot新手快速入门系列教程7:基于Redis的一个简单存取数据的例子

我的教程都是亲自测试可行才发布的&#xff0c;如果有任何问题欢迎留言或者来群里我每天都会解答。 新手可能有这样的疑问&#xff0c;有了数据库的存取方式&#xff0c;我们为什么还要使用Redis这种缓存数据库读取方式呢&#xff1f; 原因主要有以下几点&#xff1a; 1. 性能…

本地部署,MODNet 背景去除大模型

目录 摘要 引言 MODNet 架构 关键组件 技术原理 本地部署 运行结果 结论 GitHub - ZHKKKe/MODNet: A Trimap-Free Portrait Matting Solution in Real Time [AAAI 2022]A Trimap-Free Portrait Matting Solution in Real Time [AAAI 2022] - ZHKKKe/MODNethttps://gith…

在Linux上导出NFS共享---网络文件系统

目录 一、NFS介绍 二、NFS 所需要的服务 三、搭建NFS服务器共享文件到客户端 在虚拟机129上配置&#xff1a; 在虚拟机135上配置 测试 四、autofs自动挂载 1、安装软件启动 2、编写 /etc/auto.master,在里面添加内容如下 3、编写 /etc/auto.nfs&#xff0c;其内容如下 …

怎么提高音频的播放速度?可以提高音频播放速度的四种方法推荐

怎么提高音频的播放速度&#xff1f;提高音频的播放速度是一种有效的策略&#xff0c;可以显著节省时间和提升信息获取的效率。随着信息量不断增加和学习需求的多样化&#xff0c;快速播放音频已成为许多人在日常生活和工作中的常见做法。这种方法不仅可以用于提高学习效率&…

基于 JSP 的网络招标系统设计与实现

点击下载源码 基于jsp的网上招标系统设计与实现 摘要 从本世纪初&#xff0c;互联网开始加速发展&#xff0c;各种创新型应用和互联网新概念不断出现&#xff0c;例如搜索引擎、电子商务、博客、维基百科、RSS、3G、web2.0、长尾理论等。这些应用和概念与知识管理都有着或多或少…

视频融合共享平台视频共享融合赋能平台数字化升级医疗体系

在当前&#xff0c;医疗健康直接关系到国计民生&#xff0c;然而&#xff0c;由于医疗水平和资源分布不均&#xff0c;以及信息系统老化等问题&#xff0c;整体医疗服务能力和水平的提升受到了限制。视频融合云平台作为数字医疗发展的关键推动力量&#xff0c;在医疗领域的广泛…