链表的c语言实现(一)

链表的c语言实现(一),第1张

链表的c语言实现(一),第2张

准备:动态内存分配

首先,为什么要使用动态内存分配?

但是在我们还没有学过链表的时候,如果要存储大量相同类型或结构的数据,我们总是会使用数组。比如我们要存储某一科某一班学生的分数,我们总是定义一个float数组(0.5分):
float score[30];
但是,在使用数组的时候,总有一个问题困扰着我们:数组应该有多大?
在许多情况下,您不确定要使用多大的数组。例如,在上面的示例中,您可能不知道班上的学生人数,因此您应该将数组定义为足够大。这样,当你的程序运行时,它申请的是你认为足够大的固定大小的内存空。即使知道班级人数,如果因为某种特殊原因,学生人数增加或减少,就必须再次修改程序,扩大数组的存储范围。这种分配固定大小的内存分配方法称为静态内存分配。但这种内存分配方式存在严重缺陷,尤其是在处理一些问题时:多数情况下会浪费大量内存空,少数情况下当你定义的数组不够大时,可能会造成下标越界错误,甚至导致严重后果。【/br/】那么,这样的异物有没有其他的解决方法呢?没错,就是动态内存分配。
所谓动态内存分配,是指程序执行过程中,在存储空之间动态分配或回收内存的方法。与数组等静态内存分配方式不同,动态内存分配需要预先分配内存空,而是由系统根据程序的需要立即分配,分配的大小就是程序要求的大小。对比上面的动态和静态内存分配,可以知道动态内存分配相对于景泰内存分配的特点:
1。不需要预分配内存空;
2。分配的空房间可以根据节目需要扩大或缩小。

第二,如何实现动态内存分配及其管理。

要根据程序需要动态分配存储空,必须使用以下函数
1。malloc函数
Malloc函数的原型是:
void * Malloc(unsigned int size)
它的作用是在动态内存区分配一个大小。它的参数是一个无符号整数,它的返回值是一个指针,指向所分配的连续存储域的起始地址。另外需要注意的是,当函数分配存储空失败时(比如内存不足),会返回一个空指针。所以在调用这个函数时,要检查返回值是否为NULL,并执行相应的操作。
下面的例子是一个动态分配的程序:
# include
# include
main()
{
int count,* array/*count是计数器,array是整数指针,也可以理解为指向整数数组的第一个地址*/
if((array(int *)malloc(10 * sizeof(int)))= = null)
{
printf("不能");
退出(1);
}
for(count = 0;计数〈10;Count) /*给数组赋值*/
array[count]= count;
for(count = 0;计数〈10;Count) /*打印数组元素*/
printf ("-",array[count]);
}
在上面的例子中,10个整数存储区被动态分配,然后被赋值和打印。例中if((array(int *)malloc(10 * sizeof(int)))= = NULL)语句可分为以下步骤:
1)在连续存储间分配10个整数空,返回一个指向其起始地址的整数指针
2)将这个整数指针地址赋给数组
3)检查返回值是否为NULL
2 .free function
因为内存区域总是有限的,不能无限制的分配,一个程序要尽量节约资源,所以当分配的内存区域没有使用时,就要释放。这时候我们就要用free函数了。
其函数原型为:
void free(void *p)
用于释放指针p所指向的内存区域,
其参数p必须是之前调用malloc函数或calloc函数(另一个动态分配存储区域的函数)时返回的指针。将其他值传递给free函数可能会导致崩溃或其他灾难性的后果。
注意:这里重要的是指针的值,而不是用来申请动态内存的指针本身。例如:
int *p1,* p2
P1 = malloc(10 * sizeof(int));
p2 = P1;
...
free (p2)/*或free(p2)*/
malloc返回值赋给p1,p1的值赋给p2,所以p1和p2都可以作为free函数的参数。
malloc函数分配存储区域。
free函数释放未使用的内存区域。
所以这两个函数可以实现内存区域的动态分配和简单管理。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 链表的c语言实现(一)

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情