链表概述:链表是一种常见的数据结构。数组可以存放数据,但是使用数组时要先指定数组中包含元素的个数,即数组长度。但是如果向这个数组中加入的元素个数超过了数组的大小时,便不能将内容完全保存。例如在定义一个班级的人数时,如果小班是30人,普通班是50人,且定义班级人数时使用数组,那么要定义数组的个数为最大,也就是最少为50个元素,否则不满足最大时的情况。这种方式非常浪费空间。而链表,其存储元素的个数不受限定的,当进行添加元素的时候存储的个数就会随之改变。
如图1所示为链表结构的示意图
在链表中有一个头指针变量,图中head表示的就是头指针,这个指针变量保存一个地址。从图中的箭头可以看到该地址为一个变量的地址,也就是说头指针指向一个变量。这个变量称为元素,在链表中每一个元素包括两个部分:数据部分和指针部分。数据部分用来存放元素所包含的数据,而指针部分用来指向下一个元素。最后一个元素指针指向NULL,表示指向的地址为空。从图1可以看到,head头结点指向第一个元素,第一个元素中的指针又指向第二个元素,第二个元素的指针又指向第三个元素的地址,第三个元素的指针就指向为空。
根据对链表的描述,可以想象到链表就像一个铁链,一环扣一环。然后通过头指针寻找链表中的元素,这就好比在一个幼儿园中,老师拉着第一个小朋友的手,第一个小朋友又拉着第二个小朋友的手,这样下去在幼儿园中的小朋友就连成了一条线。最后一个小朋友没有拉着任何人,他的手是空着的,他就好像是链表中链尾,而老师就是头指针,通过老师就可以找到这个队伍中的任何一个小朋友。
注意:在链表这种结构中,必须利用指针才能实现。因此链表中的结点应该包含一个指针变量来保存下一个结点的地址。
三个函数:
void *malloc(unsigned int size);
该函数的功能是在内存中动态地分配一块size大小的内存空间。malloc函数会返回一个指针,该指针指向分配的内存空间,如果出现错误则返回NULL。
void *calloc(unsigned int n,unsigned int size);
该函数的功能是在内存中动态分配n个长度为size的连续内存空间数组。calloc函数会返回一个指针,该指针指向动态分配的连续内存空间地址。当分配空间错误时,返回NULL。
void free(void *ptr);
该函数的功能是使用由指针ptr指向的内存区,使部分内存区能被其他变量使用(简单来说就是释放不需要的内存空间)。ptr是最近一次调用calloc或malloc函数时返回的值,free函数无返回值。