咱们如何把现实中大量复杂的数据保存到主存储器(内存)中呢?为了解决这个问题,咱们出了数据结构的学科,专门研究----个体的存储+个体关系的存储。因此当咱们要解决问题时,首先要先解决的是如何把这些问题转换成数据,先保存到咱们的主存中。java
什么是线性结构呢? 就是把全部的结点用一根直线穿起来算法
线性结构主要分为2种数组
连续存储【数组】数据结构
元素类型相同,大小相等(数组传参,只有传进去首地址和长度就行)spa
数组的优缺点操作系统
存取速度快指针
事先必须知道数组的长度code
插入删除元素很慢blog
空间一般是有限制的排序
须要大块连续的存储块
插入删除元素的效率很低
离散存储【链表】
定义:
咱们来看个数组和链表排序的伪代码
//数组排序 void sort_arr(struct Arr * pArr) { int i, j, t; int len = length_list(pArr); for (i=0; i<len-1; ++i) { for (j=i+1; j<len; ++j) { if (pArr->pBase[i] > pArr->pBase[j]) { t = pArr->pBase[i]; pArr->pBase[i] = pArr->pBase[j]; pArr->pBase[j] = t; } } } }
//链表排序 void sort_list(struct Arr * pHead) { int i, j, t; int len = length_list(pHead); struct Arr * p, q; for (i=0,p=pHead->pNext; i<len-1; ++i,p=p->pNext) { for (j=i+1,q=p->pNext; j<len; ++j,q=q->pNext) { if (p->data > q->data) //等价于 a[i] > a[j] { t = p->data;//等价于: t = a[i]; p->data = q->data; //等价于: a[i] = a[j]; q->data = t; //等价于: a[j] = t; } } } return; }
在咱们看来数组和链表的存储方式是不一样的
数组能够有a[++i] 来指向下个元素
链表则是 p = p->next
来指向下个元素
但从广义上来讲 算法说与数据的存储方式无关的,咱们能够对链表进行一个封装也能够实现a[++i]指向下个元素的操做。不一样的存储方式,达到操做方式是相同的。
当咱们要建立一个节点的时候,就须要动态来分配内存
int main(void) { int p; int *m = (int*)malloc(100); }
在代码中静态变量p是在栈中分配,有操做系统自动分配和释放,而 (int*)malloc(100)
执行以后将在堆中分配100字节的内存。这个操做系统并不会释放,必需要手动使用 free()
来释放内存。java 中变成垃圾内存则会自动释放,可是C和C++则不会,因此要手动释放,不然会引发内存泄露。
感谢你看完这篇文章,有什么不对的地方欢迎指出,谢谢🙏