为什么C链表节点要用malloc函数动态分配大小?
一、C链表节点要用malloc函数动态分配大小的原因
C链表节点要用malloc函数动态分配大小是因为在C语言中链表节点的大小是不确定的,因为它需要根据实际存储的数据类型和节点前后指针的大小进行调整。因此,链表节点通常使用malloc函数动态分配内存空间。
malloc函数是C标准库中用于动态内存分配的函数,可以根据需要动态地分配指定大小的内存。链表节点使用malloc函数动态分配内存空间,可以保证每个节点都具有正确的大小,而不会浪费内存。除此之外,通过动态分配内存,链表节点还可以在运行时进行动态的扩容或缩容,从而更加灵活地管理节点的内存空间。
二、链表简介
1、链表概念
链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用。链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节点。链表都有一个头指针,一般以head来表示,存放的是一个地址。链表中的节点分为两类,头结点和一般节点,头结点是没有数据域的。
2、链表的构成
链表中每个节点都分为两部分,一个数据域,一个是指针域。说到这里你应该就明白了,链表就如同车链子一样,head指向名列前茅个元素:名列前茅个元素又指向第二个元素,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束。作为有强大功能的链表,对他的操作当然有许多,比如:链表的创建,修改,删除,插入,输出,排序,反序,清空链表的元素,求链表的长度等等。
3、常见的链表
单链表循环链表双向链表4、链表的增删改查
我们在进行数组的插入、删除操作的时候,为了保持内存数据的连续性,需要进行大量的数据搬移工作,所以时间复杂度为 O(n);而在链表中插入或者删除一个数据我们并不需要为了保持内存的连续性而搬移节点,因为链表本身的存储空间也不是连续的,所以在链表中插入和删除一个数据是非常快的。
插入数据: 我们只需要将要插入位置的前一个数据单元的next指针指向插入数据的内存地址,插入数据的next指针指向下一个数据的内存地址;删除数据: 将要删除数据的前一个数据单元的next指针指向要删除数据的下一个数据单元的内存地址,然后再删除数据。5、实现代码
public class MyLinkedList {10 /**11 * 私有的 Node12 */13 private class Node{14 public E e;15 public Node next;16 17 public Node(E e, Node next){18 this.e = e;19 this.next = next;20 }21 public Node(E e){22 this(e, null);23 }24 public Node(){25 this(null, null);26 }27 }28 private Node head;29 private int size;30 31 public MyLinkedList(){32 head = null;33 size = 0;34 }35 public int getSize(){36 return this.size;37 }38 public boolean isEmpty(){39 return size == 0;40 }41 }
三、malloc函数
malloc时动态内存分配函数,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址。malloc函数原型:
extern void *malloc(unsigned int num_bytes)//意为分配长度为num_bytes字节的内存块
malloc函数头文件:
#include
malloc函数返回值:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
malloc函数的返回的是无类型指针,在使用时一定要强制转换为所需要的类型。在使用malloc开辟空间时,使用完成一定要释放空间,如果不释放会造内存泄漏。在使用malloc函数开辟的空间中,不要进行指针的移动,因为一旦移动之后可能出现申请的空间和释放空间大小的不匹配。mallo函数返回的实际是一个无类型指针,必须在其前面加上指针类型强制转换才可以使用。
指针自身 = (指针类型*)malloc(sizeof(指针类型)*数据数量)
int *p = NULL;int n = 10;p = (int *)malloc(sizeof(int)*n);
在使用malloc函数之前我们一定要计算字节数,malloc开辟的是用户所需求的字节数大小的空间。
延伸阅读1:C语言简介
C 语言是一种十分强大的语言,可以进行多种方式进行程序的设计,它是一种很有特色的高级语言通过若干个函数组成,它具备构成程序设计的 3 种基本结构顺序,选择和循环结构。C语言编辑简洁明了,运算符丰富且功能强大还有编译预处理功能。此语言的移植性好不同的处理器用不同的编译器编译指令达到移植的效果。

猜你喜欢LIKE
相关推荐HOT
更多>>
如何进行安卓应用上传?
一、注册开发者账号在进行安卓应用上传之前,首先需要注册一个开发者账号。目前,Google Play Store是最大的安卓应用市场,因此注册一个Google ...详情>>
2023-10-16 10:55:22
前端html5框架有哪些?
一、BootstrapBootstrap是目前较受欢迎的前端HTML5框架之一。它由Twitter开发并开源,提供了一套易于使用的CSS和JavaScript组件,可以用于创建...详情>>
2023-10-16 10:42:42
怎么利用UIBE的数据库计算GVC指数?
一、怎么利用UIBE的数据库计算GVC指数UIBEGVC数据库里的第二个关于增加值%的计算放在了一个三维表里,对数据指标的使用有一个word文件。名列前...详情>>
2023-10-16 10:18:21
MySQL数据库全量、增量备份与恢复怎么做?
一、MySQL数据库全量备份与恢复步骤1、创建专用备份文件夹mkdir -p /data/backup2、执行全量备份命令/usr/bin/mysqldump -uroot -padmin --loc详情>>
2023-10-16 09:45:00热门推荐
MySQL的主从切换在什么情况下使用?
沸如何进行安卓应用上传?
热前端html5框架有哪些?
热Oracle迁移MySQL需要考虑什么?
新怎么利用UIBE的数据库计算GVC指数?
积分制管理与传统管理方法有什么不同?
插入数据前必须使用USE选择操作的数据库吗?
MySQL数据库全量、增量备份与恢复怎么做?
MySQL怎么保证数据库表中的数据根据系统时间实时更新?
Oracle数据库中生产库、查询库、测试库有什么区别?
写好的java可执行程序在其他电脑上如何使用?
数据库中的索引条目(index entry)是什么?
mysql字符串内部是怎么比较大小的?
数据仓库中,什么是business key?
技术干货






