通过与 Jira 对比,让您更全面了解 PingCode

  • 首页
  • 需求与产品管理
  • 项目管理
  • 测试与缺陷管理
  • 知识管理
  • 效能度量
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案

25人以下免费

目录

为什么C链表节点要用malloc函数动态分配大小

C链表节点要用malloc函数动态分配大小的原因是在C语言中链表节点的大小是不确定的,因为它需要根据实际存储的数据类型和节点前后指针的大小进行调整。因此,链表节点通常使用malloc函数动态分配内存空间,malloc函数是C标准库中用于动态内存分配的函数。

一、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<E> {
10     /**
11      * 私有的 Node
12      */
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.h>

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语言编辑简洁明了,运算符丰富且功能强大还有编译预处理功能。此语言的移植性好不同的处理器用不同的编译器编译指令达到移植的效果。

相关文章