C语言链表剖析——带你了解链表的一切(一)

链表的初识

①链表前知识

我们知道数据变量从变量值存在的时间(即生存期)角度分:静态存储方式和动态存储方式
静态:在编译时确定了固定的内存地址与内存大小,如:函数里的局部变量、全局变量等
动态:由程序控制,运行时主动性的向系统申请所需大小的内存段,并且每次分配到的内存地址不固定
我们知道内存的储存区域分为
程序代码区:存放函数体的二进制代码
静态区/全局区(static):全局变量和静态变量的存储区域
堆区(heap):程序员分配释放
栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值
在了解了这些后,我们来介绍几个函数
malloc函数
函数功能:这个函数是用来申请内存空间的,但是并不会初始化数据
函数原型:void *malloc(size_t bytes)
函数参数:bytes-是要开辟的空间大小
返回值:成功时返回内存段首地址,否则返回NULL
例如:

int *p=NULL;
p = (int *)malloc(sizeof(int));
//一般我们在使用这个开辟空间的函数后,都会加一个强制转化。
//要记得我们用malloc函数开辟的空间,如果没有自己释放那么就会一直存在

memset函数
函数功能 :在一段内存中填充某个给定的值(注意填充时是按照字节顺序填充的,而不是按照元素填充。)
函数原型:void *memset( void *buffer, char ch, size_t n);
函数参数:buffer是需要设置的内存的开始地址;
ch是期望填充的值;
n是需要填充的字节数。
返回值:成功时返回buffer的首地址,否则返回NULL
例如:

memset(p, ‘\0, sizeof(int));

free函数
函数功能 :释放由p指向的内存,被释放的内存还回给系统,并成为自由内存。
函数原型:void free(void *p)
函数参数:p必需是通过malloc、calloc或realloc分配的指针(首地址)
返回值:无
注意:动态分配的内存一定要通过free()函数来释放,否则会造成内存泄露
例如:

free(p);

calloc函数
函数功能:calloc()与malloc()类似,主要的区别是存储在已分配的内存空间中的值默认为零。
函数原型:void *calloc(size_t num,size_t bytes )
函数参数:num-要分配内存单元的个数;bytes-每个内存单元的字节大小
返回值:成功时返回内存段首地址,否则返回NULL
例如:

int *p=NULL;
int i=0;
p = (int*) calloc(3, sizeof(int));
for(i=0, i<3; i++)
{
printf(%d\n”, *(p+i));
}

realloc函数
函数功能:为已经分配的内存空间重新分配并复制内容;新的空间大小为0时,等价于free函数功能。
函数原型:void *realloc(void *ptr,size_t bytes )
函数参数:ptr-已分配的内存段首地址 bytes-新申请的内存字节大小
返回值:成功时返回内存段首地址,否则返回NULL
例如:

int *ptr=NULL;
ptr = (int *)realloc(p,5*sizeof(int));
ptr[3] = 34;
*(ptr+4) = 23;
for(i=0, i<5; i++)
{
printf(%d\n”, *(ptr+i));
}

这里的malloc、calloc、realloc这三个函数都是一样用来开空间的,一般最常用的就是malloc函数。
线性表
在计算机科学中,线性结构被称为线性表
有以下的特点:
1.存在唯一的一个首元素;
2.存在唯一的一个尾元素;
3.除首元素外每个元素有且只有一个直接前驱;
4.除尾元素外每个元素有且只有一个直接后续;
(这个就像是数组一样,有首元素——数组名,尾元素——‘\0’,前驱——每个元素的前面都有元素,后驱——每个元素的后面都有元素)
存储方式分为顺序存储与链式存储
顺序存储结构:用一组地址连续的存储单元 依次存放线性表的所有数据元素
特点1:逻辑关系上相邻的两个元素在物理位置上也相邻,因此,可以直接存取表中任意一个元素
特点2(缺点):
存储空间闲置、存储容量难以扩充
当进行插入和删除操作时,存在大量数据元素移动
(我们的数组的储存就是这种方式。)
链式存储结构:数据元素的存储单元是不链续的。每个元素除自身信息外,还需要存储其后续元素的信息。
每个元素的存储映像称为结点,存放数据元素信息的域称为数据域,存放后续结点存储位置的域称为指针域,每个结点由数据域和指针域构成
用指针相连的结点序列称为链表

②链表

链表还分为:单链表、循环链表;还可以按照指针域分为双向链表、单向链表。
链表一般有个头指针,头指针的数据域为0.
单链表
单链表
循环链表
循环链表
双向链表
双向链表
双向循环链表
双向循环链表
你以为链表就这么点?那你大错特错,链表真正的应用还在后面呢,我们一起期待下一期的分享,链表的深入,带你了解链表真正的应用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值