通用数据类型链表C语言实现

news2024/11/28 0:50:24

通用链表是一种动态内存分配的数据结构,其中每个节点包含一个指向下一个节点的指针和一个指向任意类型数据的指针。因此,通用链表可以容纳任意类型的数据,这是其与其他数据结构不同的地方。

通用链表的实现可以分为以下几个步骤:

  1. 定义通用链表节点结构体
typedef struct node {
    void* data;
    struct node* next;
} node_t;

其中,data指向任意类型的数据,next指向下一个节点。

  1. 定义通用链表结构体
typedef struct {
    node_t* head;
    node_t* tail;
    int size;
} list_t;

其中,head指向链表头,tail指向链表尾,size为链表节点数。

  1. 定义通用链表操作函数
  • 初始化链表
void list_init(list_t* list) {
    list->head = NULL;
    list->tail = NULL;
    list->size = 0;
}
  • 向链表中添加新节点
void list_append(list_t* list, void* data) {
    node_t* new_node = (node_t*)malloc(sizeof(node_t));
    new_node->data = data;
    new_node->next = NULL;

    if (list->size == 0) {
        list->head = new_node;
        list->tail = new_node;
    } else {
        list->tail->next = new_node;
        list->tail = new_node;
    }
    list->size++;
}
  • 从链表中删除节点
void list_remove(list_t* list, node_t* node) {
    if (node == list->head) {
        list->head = node->next;
    } else {
        node_t* cur_node = list->head;
        while (cur_node->next != node) {
            cur_node = cur_node->next;
        }
        cur_node->next = node->next;
    }

    if (node == list->tail) {
        list->tail = node->next;
    }

    free(node);
    list->size--;
}
  • 遍历链表
void list_traverse(list_t* list, void (*callback) (void*)) {
    node_t* cur_node = list->head;
    while (cur_node != NULL) {
        callback(cur_node->data);
        cur_node = cur_node->next;
    }
}
  1. 使用通用链表
int main() {
    list_t list;
    list_init(&list);

    int a = 10;
    int* ptr_a = &a;
    list_append(&list, ptr_a);

    float b = 3.14;
    float* ptr_b = &b;
    list_append(&list, ptr_b);

    char c = 'c';
    char* ptr_c = &c;
    list_append(&list, ptr_c);

    list_traverse(&list, print_data);

    list_remove(&list, list.head);
    list_traverse(&list, print_data);

    return 0;
}

void print_data(void* data) {
    printf("%c\n", *((char*)data));
}

该代码首先初始化了一个空的链表,然后向其添加了一个整型、一个浮点型和一个字符型数据。随后遍历了链表并打印了每个节点的数据。之后,删除了头节点并重新遍历了链表,打印出了剩余节点的数据。

【最后一个bug】多平台都有更新和发布,大家可以一键三连,关注+星标,不错过精彩内容~
在这里插入图片描述

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

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

相关文章

《百万在线 大型游戏服务端开发》前两章概念笔记

第1章 从角色走路说起 游戏网络通信的流程则是服务端先开启监听,等待客户端的连接,然后交互操作,最后断开。 套接字 每个Socket都包含网络连接中一端的信息。每个客户端需要一个Socket结构,服务端则需要N1个Socket结构&#xff…

直击2023云南移动生态合作伙伴大会,聚焦云南移动的“价值裂变”

作者 | 曾响铃 文 | 响铃说 2023年3月2日下午,云南移动生态合作伙伴大会在昆明召开。云南移动党委书记,总经理葛松海在大会上提到“2023年,云南移动将重点在‘做大平台及生态级新产品,做优渠道转型新动能,做强合作新…

利用canvas给图片添加水印

前言前两天给个人网站添加了一个小功能,就是在文章编辑上传图片的时候自动给图片加上水印。给网页图片添加水印是个常见的功能,也是互联网内容作者保护自己版权的方法之一。本文简单记录一下借助canvas在前端实现图片添加水印的实现方法。canvas元素其实…

学python的第七天---基础进阶

一、数组翻转写法一:myselfa[:size]a[:size][::-1]写法二:函数写法三:二、复制数组写法一:写法二:写法三:三、最小公倍数写法一:写法二:写法三:gcd写法四:其他&#xff1…

visual studio 2019创建一个项目的详细步骤

引言:本着边学边记录的原则,把学习的过程给记录下来,自己回顾的同时也分享给大家,转载请注明出处哈。 1、首先在桌面上双击打开visual studio 2019,看到如下界面: 2、点击1红框中的创建新项目,…

[hive]执行计划

https://www.bilibili.com/video/BV1g84y147sX/?p126&spm_id_from333.1007.top_right_bar_window_history.content.click&vd_source51f694f71c083955be7443b1d75165e0一、概述Explain呈现的执行计划,由一系列Stage组成,这一系列Stage具有依赖关…

Easy Deep Learning——全连接层

什么是全连接层?它的作用是什么? 我们还是回到之前的草地场景中,假设现在的问题变成让机器判断该草地上是不是有一只猫存在,由于之前做的卷积操作,将草地分成了许多网格,如果场地上只有一只猫,那么只有一个网格是有猫的,而其他的网格都不存在猫,一个卷积核运算可以得到…

java-泛型介绍

介绍 泛型是jdk5的时候出现的一种特性,可以在编译阶段约束操作的数据结构,并进行检查。 泛型只能用引用数据类型,如果是基本数据类型得使用包装类。 如ArrayList中的toArray(T[] a),是不可用转换为int[]的只能转换为Integer[] 好处 统一了…

Mysql的数据存储

Mysql的数据存储 对于mysql而言,数据是存储在文件系统中的,不同的存储存储引擎会有不同的文件格式和组织形式 1、InnoDB数据存储 InnoDB存储格式由大到小:表空间 → 段 → 区 → 页 → 行 对于innodb而言,数据是存储在表空间&…

linux系统整理一些工作中常用关于用户,用户组以及文件权限操作的相关命令

文章目录问题:前言:用户和用户组概念前言一、用户前言二、用户组一、添加用户和用户组二、查看用户所属组命令、三、管理用户组方法一、gpasswd命令方式二、newgrp命令方式三、usermod命令用户组实战:赋予用户root权限四、文件修改权限命令ch…

数字孪生与 UWB 技术创新融合:从单点测量到全局智能化

人员定位是指利用各种定位技术对人员在特定场所的位置进行准确定位的技术。人员定位技术主要应用于需要实时监控、管理和保障人员安全的场所,如大型厂区、仓库、医院、学校、商场等。人员定位技术的应用范围非常广泛,例如:-在工厂生产线上&am…

服务器Nginx安装实战

因为Vue项目发布在Tomcat中出现跨域为,所以需要Nginx进行反向代理,所以特此在云服务器中安装Nginx,本文章记录安装过程及解决安装过程中的错误处理。 一、Nginx 安装 登录服务器后,执行命令 yum info gcc-c pcre pcre-devel zl…

keras lstm

keras lstm的参数(1)units:LSTM层的单元个数,即LSTM网络中隐藏节点的数量。(2)activation:激活函数,用于更新内部状态的函数(即门的决策函数)。(3…

dotConnect Universal 4.0.134 Crack

dotConnect Universal 能够呈现和访问不同于Microsoft 和框架的数据库的信息。网。它能够支持大多数数据库服务器以及 Microsoft Access、Oracle、MySQL、DB2、PostgreSQL、SQLite、InterBase、FireBird,最后是 Microsoft SQL Server。它可以通过 ODBC、OLE DB、ADO…

我来跟你讲vue进阶

一、组件(重点) 组件(Component)是 Vue.js 最强大的功能之一。 组件可以扩展 HTML 元素,封装可重用的代码。 组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界面都可以抽象…

ThreadLocal 的简单使用并深扒其实现原理

在多线程环境下, 如果想要保证每个线程都能独立于其它线程独自运行, 可以使用 ThreadLocal 来解决; ThreadLocal 就是用于提供线程局部变量的一个工具, 也就是说 ThreadLocal 可以为每个线程创建一个单独的变量副本; 其概念与同步机制正好相反, 同步机制是保证多线程环境下数据…

elasticSearch写入原理

elasticSearch写入原理 最近学习完了es相关的课程整理除了es的核心内容,学习这东西知其然知其所以然,自己按照自己的理解整理了es相关的面试题。先热个身,整理一下es的写入原理,有不对的地方请大家指正。 这些原理的东西我觉得还是…

MySql数据库(进阶篇)

👌 棒棒有言:人生总是在前行,不论走到哪里,只要带着信念往前走,比别人多一点努力,你就会多一份成绩;比别人多一点志气,你就会多一份出息;比别人多一点坚持,你…

js学习3(数组)

目录 结构图 数组操作 每日一练 结构图 数组操作 ## 数组中可以存储任何类型元素 ## 创建: 字面量([...])、创建对象(new Array(arr_len)) ## 遍历: 循环遍历、forEach(callback)、map(callback)、filter(callback)、every(callback)、some(callback)、…

1637_fgets函数的功能

全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 没想到分析一个函数的实现会这么麻烦,中间利用的一系列的库函数以及内核接口我全都不熟悉。但是,这次的这个函数应该是之前C语言的基本教程…