①链表前知识
我们知道数据变量从变量值存在的时间(即生存期)角度分:静态存储方式和动态存储方式
静态:在编译时确定了固定的内存地址与内存大小,如:函数里的局部变量、全局变量等
动态:由程序控制,运行时主动性的向系统申请所需大小的内存段,并且每次分配到的内存地址不固定
我们知道内存的储存区域分为
程序代码区:存放函数体的二进制代码
静态区/全局区(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.
单链表
循环链表
双向链表
双向循环链表
你以为链表就这么点?那你大错特错,链表真正的应用还在后面呢,我们一起期待下一期的分享,链表的深入,带你了解链表真正的应用。