链表和数组的区别:
两者的区别:
1.数组静态分配内存,链表动态分配内存。
2.数组在内存中是连续的,链表是不连续的。
3. 数组利用下标定位,查找的时间复杂度是O(1),链表通过遍历定位元素,查找的时间复杂度是O(N)。
4.数组插入和删除需要移动其他元素,时间复杂度是O(N),链表的插入或删除不需要移动其他元素,时间复杂度是O(1)。
数组的优点
1.随机访问性比较强,可以通过下标进行快速定位。
2.查找速度快。
数组的缺点
1.插入和删除的效率低,需要移动其他元素。
2.会造成内存的浪费,因为内存是连续的,所以在申请数组的时候就必须规定七内存的大小,如果不合适,就会造成内存的浪费。
3.内存空间要求高,创建一个数组,必须要有足够的连续内存空间。
4.的大小是固定的,在创建数组的时候就已经规定好,不能动态拓展。
链表的优点
1.插入和删除的效率高,只需要改变指针的指向就可以进行插入和删除。
2.内存利用率高,不会浪费内存,可以使用内存中细小的不连续的空间,只有在需要的时候才去创建空间。随时动态分配空间,大小不固定,拓展灵活。
链表的缺点
1.查找的效率低,链表的查找是从第一个结点开始依次向后遍历。
链表中另外点:
1.malloc()函数
malloc函数是一种申请存储空间的函数,其函数原型为:
void *malloc(unsigned size);
函数功能:分配长度为size个字节的内存块。(在内存的动态存储区申请一个长度为size字节的连续存储空间)
返回值:返回指向新分配内存块首地址的指针;若没有足够的内存空间可分配,返回NULL。
说明:函数值为指针类型,由于基类型为void,如果要将这个指针赋给其它类型的指针变量,应当进行强制类型转换。
例如:
int *p = (int *)malloc(sizeof(int));
申请一个int型长度的存储空间,并将分配到的村存储空间地址转换为int类型地址,赋给所定义的指针变量p,基类型字节数为int型所占空间2或4(有不同的机器决定)。
例如:
struct stud p = (struct stud)malloc(sizeof(struct stud));
申请可存放struct stud结构体类型数据的空间,将其地址存入p指针中,当struct stud结构体类型的定义改变时,本语句申请空间的大小会随之改变,使程序便于适应不同的机器,程序适应性增强。
2.free()函数
free函数是一种释放存储空间的函数,其函数原型为:
void free(void *p);
函数功能:将指针变量p指向的存储空间释放,交还给系统。
无返回值。
3.链表
链表分为单链表,循环链表,双向链表。
单链表:
如果每个结点只含有一个指针,所有结点都是单线联系,除了末尾结点指针为空外,每个结点的指针都指向下一个结点,一环扣一环形成一条线性链,称此链表为单项线性链表或简称单链表。