单链表中为什么要有next指针?
2012-01-02 09:42
253 查看
【问题描述】 单链表结构中有一个指向该结构的next节点指针,为什么要有这个节点指针呢?
【分析】
两种情况:
(1) 调用1次malloc,要求保存300个相同的结构;
(2) 调用300次malloc,要求保存1个相同的结构;
这两种情况有什么区别呢?
第一种情况将分配一个连续的内存块,通过数组符号(记录了首地址),就可以访问每个结构。而第二种情况,分配的内存不是连续的,这意味着这些结构不一定会被连续存储,因此,不能通过数组符号实现对每个结构的访问。
包括单链表的链表结构就属于第二种情况,为了实现对整个结构的访问,单链表有个聪明的办法,那就是在每个结构中,利用一个名为next的指针,记录下一个结构的首地址。这样,只要知道了一个结构的首地址和结构的大小,就可以实现对全部结构的访问。
【使用场合】
单链表等链表结构,都需要建立类似的指针,记录链接结构的地址。因此每个结构会占用4字节的指针空间。当数据量比较小时,采用第一种情况的方法,由于不需要额外的指针记录结构的地址,更节省内存空间。当数据量比较大时,第一种情况,由于只malloc一次,在malloc时,必须分配足够的空间供数据域使用,而结构的数据域大小本身是未知的,有大有小,势必造成内存的浪费,第二种情况不存在该缺陷,数据量越大,优势越明显。
【分析】
两种情况:
(1) 调用1次malloc,要求保存300个相同的结构;
(2) 调用300次malloc,要求保存1个相同的结构;
这两种情况有什么区别呢?
第一种情况将分配一个连续的内存块,通过数组符号(记录了首地址),就可以访问每个结构。而第二种情况,分配的内存不是连续的,这意味着这些结构不一定会被连续存储,因此,不能通过数组符号实现对每个结构的访问。
包括单链表的链表结构就属于第二种情况,为了实现对整个结构的访问,单链表有个聪明的办法,那就是在每个结构中,利用一个名为next的指针,记录下一个结构的首地址。这样,只要知道了一个结构的首地址和结构的大小,就可以实现对全部结构的访问。
【使用场合】
单链表等链表结构,都需要建立类似的指针,记录链接结构的地址。因此每个结构会占用4字节的指针空间。当数据量比较小时,采用第一种情况的方法,由于不需要额外的指针记录结构的地址,更节省内存空间。当数据量比较大时,第一种情况,由于只malloc一次,在malloc时,必须分配足够的空间供数据域使用,而结构的数据域大小本身是未知的,有大有小,势必造成内存的浪费,第二种情况不存在该缺陷,数据量越大,优势越明显。
相关文章推荐
- 为什么链表的next指针也要用节点类型 不是存的是地址吗
- 单链表中为什么要有next指针?
- 链表排序交换节点为什么还得单独交换next指针?
- 有一个特殊的链表,其中每个节点不但有指向下一个节点的指针pNext,还有一个指向链表中任意节点的指针pRand,如何拷贝这个特殊链表?
- 链表添加函数中为什么要用指向链表指针的指针
- 为什么链表操作过程中对于结构体指针,都要用malloc来开辟内存空间
- 链表的next指针的疑惑释怀
- 链表初始化为什么要用双重指针
- 链表、二叉树为什么要给函数传入的头参数为指针的指针
- 为什么用快慢指针找链表的环,快指针和慢指针一定会相遇?
- C++链表插入,为什么头节点必须是二位指针
- 为什么无返回值的链表的插入操作头结点一定要用指向指针的指针
- 为什么链表P->next指向下一个节点
- 一个链表的每个节点,有一个指向next指针指向下一个节点,还有一个rand指针指向这个链表中的一个随机节点或NULL,现在要求复制一个单链表来实现这个链表,返回复制后的新链表。
- 为什么用快慢指针检测链表是否有环的时候,快指针的步长选择的是2,而不是3,4,5?
- 判断链表是否有环为什么快慢指针一定会相遇
- 为什么链表初始化时,要用双重指针?
- 为什么C初始化链表需要二级指针
- 链表分配指针 复制构造函数 node node->next=new
- 链表添加函数中为什么要用指向链表指针的指针