美文网首页
链表的c语言实现

链表的c语言实现

作者: 一直飞不快的鸟 | 来源:发表于2016-08-24 19:22 被阅读0次

一、链表

链表是一种重要的且常见的数据结构,它是动态地进行存储分配的一种结构。如果要使用数组的话,我们需要提前进行定义数组的大小,这样的话就需要提前在内存空间上进行申请,如果申请的空间过大,那么内存得到浪费,如果申请的空间不够,会导致数据丢失等多种情况出现。链表中的每一个元素称为节点,节点包括两个部分,第一是数据域,第二是下一个节点的位置(即指针域)。链表中的元素不是连续存放,这样可以合理的使用内存的空间,也没必要需要完整的内存存储空间。优点在于:可以合理的利用和分配内存空间。缺点是:查找时的时间复杂度增加,必须要从头节点进行查找。

正式由于链表这种数据结构,所以只能用指针实现。节点中包含指针变量,用来指向地址。结构体变量中可以包含不同的变量,用来作为链表里的节点,再也合适不过了。

二、动态内存分配

动态内存分配就是指程序执行的过程中动态的分配活着回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。

三、c中实现内存管理的函数

1.malloc函数

原型

extern void *malloc(unsigned int num_bytes);

函数声明

void *malloc(size_t size);

备注:void*表示未确定类型的指针,void *可以指向任何类型的数据,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(比如是char还是int或者其他数据类型)。

工作机制

malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。如果无法获得符合要求的内存块,malloc函数会返回NULL指针,因此在调用malloc动态申请内存块时,一定要进行返回值的判断。

例子:

#include "stdio.h"

#include "malloc.h"//malloc()函数被包含在malloc.h里面

intmain(void)

{

char*a = NULL;//声明一个指向a的char*类型的指针

a = (char*)malloc(100*sizeof(char));//使用malloc分配内存的首地址,然后赋值给a

if(!a)//如果malloc失败,可以得到一些log

{

perror("malloc");

return-1;

}

sprintf(a,"%s","HelloWorld\n");//"HelloWorld\n"写入a指向的地址

printf("%s\n",a);//输出用户输入的数据

free(a);//释放掉使用的内存地址

return0;//例2有无内存泄露?

}

注:例1:对malloc申请之后没有检测返回值;例2:检测malloc返回值条件有误。

2.free函数

函数名:free

功能:与malloc()函数配对使用,释放malloc函数申请的动态内存。(另:对于free(p)这句语句,如果p是NULL指针,那么free对p无论操作多少次都不会出问题。如果p不是NULL指针,那么free对p连续操作两次就会导致程序运行错误。)

用法: voidfree(void *ptr);

释放哪些不使用的内存空间。

四、链表的使用

由于链表这种动态分配内存空间的优势,所以出现单链表,双链表,循环链表的应用等。利于进行数据的操作。

相关文章

  • Java实现简单的链表-面向初学者

    很久之前用C语言实现过链表,现在已经太久没用C语言。就先用JAVA实现一个简单链表好了,还是使用最原始的C语言实现...

  • Redis 源码--链表。

    因为C语言是一个比较底层的语言,库内没有实现链表,于是Redis自己实现了链表。Redis的链表是一个双向链表。 ...

  • 单链表的C语言算法实现

    单链表的C语言算法实现 自己用C语言实现的单链表算法,有什么不正确的地方,请各位共同讨论与指正。

  • C++实现双向循环链表

    本次博文是关于利用C++模板的方式实现的双向循环链表以及双向循环链表的基本操作,在之前的博文C++语言实现双向链表...

  • C++语言实现双向链表

    这篇文章是关于利用C++模板的方式实现的双向链表以及双向链表的基本操作,在之前的博文C语言实现双向链表中,已经给大...

  • 链表

    单链表 C实现 Java实现 双链表 C实现 Java实现

  • Redis的数据结构(二):链表

    链表在redis的应用 由于redis的c语言没有内置链表结构类型,因此redis自身实现了一套链表结构。链表主要...

  • 表、栈和队列

    数据结构与算法分析-c语言描述抽象数据类型(ADT)1、表ADT可以用由数组实现。链表实现。双链表。循环链表。 -...

  • C语言结构体实现线性链表

    利用C语言的结构体和指针链表的相关知识,自己动手敲了下实现类似链表的功能。 创建方法 实现功能是接受用户输入链表长...

  • Redis之链表

    链表的定义 C语言也没支持list,redis只能自己去实现,实现代码如下: 注意:链表的head的prev和ta...

网友评论

      本文标题:链表的c语言实现

      本文链接:https://www.haomeiwen.com/subject/vteosttx.html