数据结构单链表之C 中的通用链表 | 第十六套

简介: 数据结构单链表之C 中的通用链表 | 第十六套

与 C++ 和 Java 不同,C 不支持泛型。 如何在 C 中创建可用于任何数据类型的链表? 在 C 中,我们可以使用 void 指针和函数指针来实现相同的功能。 void 指针的伟大之处在于它可以用来指向任何数据类型。 而且,所有类型的指针的大小总是相同的,所以我们总是可以分配一个链表节点。 需要函数指针来处理存储在 void 指针指向的地址的实际内容。

以下是一个示例 C 代码,用于演示通用链表的工作。

// 通用链表的C程序
#include<stdio.h>
#include<stdlib.h>
/* 一个链表节点 */
struct Node
{
  // 任何数据类型都可以存储在此节点中
  void *data;
  struct Node *next;
};
/* 在链表开头添加节点的函数。
此函数需要一个指向要添加的数据的指针
和数据类型的大小 */
void push(struct Node** head_ref, void *new_data, size_t data_size)
{
  // 为节点分配内存
  struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));
  new_node->data = malloc(data_size);
  new_node->next = (*head_ref);
  // 将 new_data 的内容复制到新分配的内存中。 假设:char 占用 1 个字节。
  int i;
  for (i=0; i<data_size; i++)
    *(char *)(new_node->data + i) = *(char *)(new_data + i);
  // 在开始添加新节点时更改头指针
  (*head_ref) = new_node;
}
/* 在给定链表中打印节点的函数。 fpitr 用于访问用于打印当前节点数据的函数。注意不同的数据类型在 printf() 中需要不同的说明符*/
void printList(struct Node *node, void (*fptr)(void *))
{
  while (node != NULL)
  {
    (*fptr)(node->data);
    node = node->next;
  }
}
// 打印整数的函数
void printInt(void *n)
{
printf(" %d", *(int *)n);
}
// 打印浮点数的函数
void printFloat(void *f)
{
printf(" %f", *(float *)f);
}
/* 测试上述功能的驱动程序 */
int main()
{
  struct Node *start = NULL;
  // 创建并打印一个 int 链表
  unsigned int_size = sizeof(int);
  int arr[] = {10, 20, 30, 40, 50}, i;
  for (i=4; i>=0; i--)
  push(&start, &arr[i], int_size);
  printf("Created integer linked list is \n");
  printList(start, printInt);
  // 创建并打印浮动链表
  unsigned float_size = sizeof(float);
  start = NULL;
  float arr2[] = {10.1, 20.2, 30.3, 40.4, 50.5};
  for (i=4; i>=0; i--)
  push(&start, &arr2[i], float_size);
  printf("\n\nCreated float linked list is \n");
  printList(start, printFloat);
  return 0;
}

输出:

Created integer linked list is
 10 20 30 40 50
Created float linked list is
 10.100000 20.200001 30.299999 40.400002 50.500000


目录
相关文章
|
4月前
|
存储 算法 Perl
数据结构实验之链表
本实验旨在掌握线性表中元素的前驱、后续概念及链表的建立、插入、删除等算法,并分析时间复杂度,理解链表特点。实验内容包括循环链表应用(约瑟夫回环问题)、删除单链表中重复节点及双向循环链表的设计与实现。通过编程实践,加深对链表数据结构的理解和应用能力。
92 4
|
1月前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
94 29
|
1月前
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
107 25
|
2月前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
97 5
|
3月前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
4月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
108 5
|
4月前
|
算法
数据结构之购物车系统(链表和栈)
本文介绍了基于链表和栈的购物车系统的设计与实现。该系统通过命令行界面提供商品管理、购物车查看、结算等功能,支持用户便捷地管理购物清单。核心代码定义了商品、购物车商品节点和购物车的数据结构,并实现了添加、删除商品、查看购物车内容及结算等操作。算法分析显示,系统在处理小规模购物车时表现良好,但在大规模购物车操作下可能存在性能瓶颈。
77 0
|
9月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
9月前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表
|
9月前
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
79 2