这一部分可能有问题,先做个标记;
离扣,206 21
裸机编程(下面的两个符合这个(就是手搓操作系统))
顺序表:
- 1 物理空间连续,用下标访问,按位置查找效率高;
- 2 连续空间,按值查找,从头到尾查一遍
- 3 尾部插入/删除,效率高,任意位置插入/删除,需要把所有的后面的数据后移/前移,效率低,
- 4 物理空间是连续(这个物理空间实际的内存,我们写的各种是在操作系统上的它们是虚拟地址连续),条件是苛刻的,内存碎片,申请空间失败;
链表:
- 1 物理空间不连续,但是逻辑上面连续;
- 2 节点结构 : 数据 + 指针域
- 3 按值按位置查找,需要一个个查找效率低
- 4 进行头部插入/删除,效率高;按位置/按值插入删除效率低;
对链表进行操作核心:
- 1 节点;
- 2 开弓没有回头箭(这是一个单向链表);
- 3 被备份思想(把要用到的节点放到=的右边);
- 4 必须知道首节点的地址;
链表的操作
节点插入
对于要用到的一个节点不能直接更新,我们要记录这个节点后在进行更新;比如这个操作中的p->next 这个节点先放在了+号的左边,这时这个节点已经被记录了;
- 1 创建辅助节点p,使辅助节点p指向待插入的前一个位置;
- 2 创建一个新节点;
- 3 更新新节点;
- 4 更新旧节点;
- 任意位置插入:效率低
- 头插入:效率高;
删除节点
- 1 创建辅助节点p,使辅助节点p指向待删除的前一个位置;
- 2 创建一个新的辅助节点 tmp 来记录要删除的节点(为接下来的free打基础);
- 任意位置删除:效率低
- 头删除:效率高;
链表的两种格式
- 1 带头结点的单向链表;
- 2 带头指针的单向链表;
他连其实很像的:一个是用一个节点,用它的next来记录真正的首节点,一个是用一个节点类型的指针来记录首节点;这个next和节点类型的指针非常相似;
我们可以引入头节点当中辅助节点来用;
写单向链表需要的英文;
note_t; val;next; LinkList_t; hearder;count;
creatLinkList; insertLinkListHearder; insertLinkListPos; deleteLinkListElement; showLinkList;
优化;