动态链表与静态链表

 动态链表与静态链表

一.  静态链表

在某些语言中指针是不被支持的,只能使用数组来模拟线性链表的结构.在数组中每个元素不但保存了当前元素的值,还保存了一个”伪指针域”,一般是int类型,用于指向下一个元素的内存地址.

  1. #define MAXSIZE 100;    
  2. typedef struct{    
  3.   ElemType data;    
  4.   int cur;    
  5. }component,SLinkList[MAXSIZE];   

[cpp]  view plain  copy
  1. #define MAXSIZE 100;   
  2. typedef struct{   
  3.   ElemType data;   
  4.   int cur;   
  5. }component,SLinkList[MAXSIZE];  


这种链表在初始时必须分配足够的空间, 也就是空间大小是静态的, 在进行插入和删除时则不需要移动元素, 修改指针域即可,所以仍然具有链表的主要优点(快速插入和删除).

二.动态链表
  
如果程序支持指针,则可按照我们的一般形式实现链表, 需要时分配,不需要时回收即可.

  1. typedef struct  node{   
  2.  EleType data;   
  3.  struct node * pNext;   
  4. }Node;   
  5.   

----------------------------------------------------------------------------------------------------------------------------------------------

有些高级语言中没有“指针”数据类型,只能用数组来模拟线性链表的结构,
数组元素中的指针“域”存放的不是元素在内存中的真实地址,而是在数组中的位置。这样的链表
称为静态链表。

静态链表:把线性表的元素存放在数组的单元中(不一定按逻辑顺序连续存放),每个单元不仅存放元素本身 ,而且还要存放其后继元素所在的数组单元的下标(游标)。

线性表的静态单链表存储结构 :

#define MAXSIZE 100;

typedef struct{

  ElemType data;

  int cur;

}component,SLinkList[MAXSIZE];

分析 :

这种描述方法便于在不设  指针  类型的高级程序设计语言中 , 使用的链表结构 . 数组的零分量可看成头节点 .这种结构仍然需要预先分配一个较大的空间 . 但在插入和删除的时候 , 不需要移动元素 . 仅需要修改指针 . 所以仍然具有链式存储结构的主要优点 .

链表结构可以是动态地分配存储的,即在需要时才开辟结点的存储空间,实现动态链接。怎样开辟存贮空间呢?C语言的库函数提供了以下几个函数。

1.malloc 函数

该函数如果成功调用,可以在内存中开辟size指定大小的连续空间。返回值类型为void,请注意这不是表示没有返回值,而是表示返回值可以指向任何类型。该函数是一个返回指针值的函数,如果成功调用,返回所开辟空间的首地址,如果失败返回NULL。该函数的参数可以用unsigned int size定义空间大小,也可以用变量类型名作参数来定义空间大小。

如:malloc(sizeof(int));开辟2个字节的存储空间,molloc(sizeof(struct student));开辟10个(4+4+2)字节。该函数返回值是void类型,因此调用时需要强制转换成需要的类型。

如:(int *)malloc(sizeof(int));

(struct people *)malloc(sizeof(struct student));

2. free 函数

其作用是释放由p指向的内存区,即将这部分内存还给系统。我们要注意动态开辟的内存在不用之后应及时还给系统,以免造成内存“遗漏”。free函数无返回值。

这里要说明的是,这种能动态开辟存贮空间的区域是内存的堆栈区。

实际上只有建立动态链表才是有意义的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值