数据结构单链表之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


目录
相关文章
|
18天前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
45 4
|
19天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
19天前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
1月前
|
存储
[数据结构] -- 单链表
[数据结构] -- 单链表
25 1
|
18天前
|
C语言
【数据结构】双向带头循环链表(c语言)(附源码)
本文介绍了双向带头循环链表的概念和实现。双向带头循环链表具有三个关键点:双向、带头和循环。与单链表相比,它的头插、尾插、头删、尾删等操作的时间复杂度均为O(1),提高了运行效率。文章详细讲解了链表的结构定义、方法声明和实现,包括创建新节点、初始化、打印、判断是否为空、插入和删除节点等操作。最后提供了完整的代码示例。
38 0
|
1月前
|
存储
[数据结构] -- 双向循环链表
[数据结构] -- 双向循环链表
22 0
|
1月前
|
存储
数据结构(单链表)
数据结构(单链表)
10 0
|
1月前
|
存储
探索数据结构:便捷的双向链表
探索数据结构:便捷的双向链表
|
16天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
91 9
|
7天前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
15 1