动态链表与静态链表



一.  静态链表

在某些语言中指针是不被支持的,只能使用数组来模拟线性链表的结构.在数组中每个元素不但保存了当前元素的值,还保存了一个”伪指针域”,一般是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函数无返回值。

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463459.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql索引机制B+Tree

1、问题引入    有一个用户表,为了查询的效率,需要基于id去构建索引。构建索引我们需要考虑两个方面的问题,1个是查询的效率,1个是索引数据的存储问题。该表的记录需要支持百万、千万、甚至上亿的数据量,如果将索引…

GLSL学习笔记

GLSL语言内置的变量,包括内置的顶点属性(attribute)、一致变量(uniform)、易变变量(varying)以及常量(const),一方面加深印象,另一方面今天的文章…

redis源码之main()函数剖析

今天看了redis的源码之中的main()函数,将大概的流程进行梳理。 在代码中进行了相应的注释,便于阅读者理解: int main(int argc, char **argv) {struct timeval tv;int j;#ifdef REDIS_TESTif (argc 3 && !strcasecmp(argv[1], &qu…

SQL Server 文件规划 -位置规划

数据库设计中,文件规划是相当重要的一个环节。 这部分内容包括文件数目的规划,大小的规划,位置的规划。 本篇介绍的是文件位置的规划,如下图所示 1. 数据文件 有可能的情况下,应该区分经常更新的表与不经常更新的表。分…

const关键字

const关键字const是constant的简写,只要一个变量前面用const来修饰,就意味着该变量里的数据可以被访问,不能被修改。也就是说const意味着“只读”readonly规则:const离谁近,谁就不能被修改;const修饰一个变…

深入理解计算机系统 第十二章 并发编程

如果逻辑控制流在时间上重叠,那么它们就是并发的(concurrent) 这种常见的现象称为并发(concurrency),出现在计算机系统的许多不同层面上。 并发不仅仅局限于内核,它也可以在应用程序中扮演重要角…

Redis源码分析之小型测试框架testhelp.h和redis-check-aof.c日志检测

使用的是redis 3.2版本 test中的文件主要分为以下几个: 1.memtest.c 内存检测 2.redis_benchmark.c 用于redis性能测试的实现,后续会当做单独的一个章节进行分析 3.redis_check_aof.c 用于更新日志检查的实现。 4.redis_check_dump.c 用于本地数据库检查…

VSTS学习和迁移(1) 安装部署

要将开发环境从SVN到VFS中,下个月开始迁移。 先从WebCast中下载文件,看了安装部署部分。以下为部分截图: 一:课程内容 Team Foundation 的逻辑结构与物理结构 Team Foundation 系统要求 Team Foundation 安装实战 Team Founda…

【HNOI2013】数列

题面 题解 设\(\{a_n\}\)为差分数组,可以得到柿子:\[ \begin{aligned} ans & \sum_{a_1 1} ^ m \sum_{a_2 1} ^ m \cdots \sum_{a_{k-1} 1} ^ m (n - \sum_{i 1} ^ {k - 1} a_i) \\ & nm^{k - 1} - \sum_{a_1 1} ^ m \sum_{a_2 1} ^ m \cd…

程序员的艺术:排序算法舞蹈

1、冒泡排序: 2、希尔排序: 3、选择排序: 4:插入排序: 5、快速排序: 6、归并排序: 转载于:https://www.cnblogs.com/jxgxy/archive/2012/08/20/2648210.html

Redis源码分析之内存检测memtest

redis的内存检测会和机器的CPU位数有关,32位或64位会影响后面的一些宏定义参数。首先给出memtest中的API: void memtest_progress_start(char *title, int pass) /* 内存检测加载开始,输出开始的一些图线显示 */ void memtest_progress_end(…

Java Collections Framework - Java集合框架List,Map,Set等全面介绍之概要篇

deng 转载于:https://www.cnblogs.com/jacktu/archive/2009/05/15/1457316.html

C语言 数据结构 树和二叉树

树 1、树:是n节点的有限集。树是n(n>0)个节点的有限集。 n0时成为空树。 在任意一颗非空树中:(1)有且仅有一个称为根的节点;(2)当n>0时,其余节点可分为m(m>0)个互不相交的…

Oracle开启关闭归档日志

开启归档日志 shutdown immediate; --关闭数据库 startup mount; --打开数据库 alter database archivelog; --开启归档日志 alter database open; --开启数据库 archive log list; --查看归档日志是否开启 关闭归档日志 shutdown immediate; --关闭数据库 startup mount; …

Redis源码分析之anet网络通信的封装

anet是redis对tcp/ip网络中socket api接口的一个全面的封装,针对server/client端。封装的api的接口如下,注释了主要的接口: // tcp连接 int anetTcpConnect(char *err, char *addr, int port); // 非阻塞连接 int anetTcpNonBlockConnect(ch…

使用AJAX Toolkit创建新闻列表

我们很多站点上面都需要显示新闻列表,由标题和正文组成的。一般客户都希望实现这样的效果: 开始的时候只是显示标题,当点击标题的时候,再展开正文。再点击,又可缩回去。 这是典型的AJAX效果,或者说以前你也…

C语言 嵌入式 面试小知识点(一)

sizeof是C/C中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。 与strlen的区别: 一、sizeof 是运算符,确切的说是一个编译时运算符,参数可以是数组、指针、类型、对象…

将数据渲染到页面的几种方式

将数据渲染到页面的几种方式: 1.字符串拼接; 2.dom回流 3.文档碎片(文档碎片节点:documentFragment) 4.模板 (下章会详细介绍模板)转载于:https://www.cnblogs.com/shangjun6/p/1039740…

论证是一门学问

本文的标题借用了安东尼.韦斯顿(Anthony Weston)的《论证是一门学问》一书的标题,向安东尼老爷子致敬的同时,也希望更多人能够真正了解“什么是论证”。 争论与论证从来都不是新鲜事物,作为软件行业的科技工作者&…

[翻译]SQL Server 工作集消息

Q:我发现有指向工作集(SQL Server保留内存区域)被分页出来相关的消息: 重要部分的 SQL 服务器进程内存已被分页。这可能导致性能下降。持续时间: 0 秒。 工作集 (KB): 2484,已提交 (KB): 48036&…