数据结构与算法学习 第1季01 顺序表 链表
2015年学习计划安排:
http://www.cnblogs.com/cyrus-ho/p/4182275.html
顺序表:顺序存储结构的线性表。所谓顺序存储结构,就是指用一组连续地址的内存单元来存储整张线性表的存储结构。(因此按序遍历数据很方便,直接做指针偏移就可以了。)
常用操作
A)向顺序表中第i个位置插入元素item
1. 判断插入位置是否合法
2. 将i-1以后的元素后移一个元素的位置(注意静态顺序表和动态顺序表的差异)--- 从原来最后一个元素开始操作到原来的第i个元素,依次后移
3. 在第i个位置上放入元素item
4. 顺序表长度+1
B) 删除顺序表中第i个位置的元素
1. 判断删除位置是否合法
2. 从原来第i+1个元素开始操作到原来的最后一个元素,依次前移 --- 这样也顺道删除掉了原来的第i个元素
3. 顺序表长度-1
链表:用一组地址任意的存储单元存储数据的线性表。每个存储单元(结点)除了当前数据元素(存放在结点的数据域)外,还包含指向前(和/或)后一个结点的指针(存储在结点的指针域)。通常有一个表头(head node),其数据域为空,指针域指向第一个结点地址,链表最后一个指针域置NULL。(当然也可以多设置一个表尾结点,数据域为空。)存放指向下一个结点的指针域通常称为next域,存放指向前一个结点的指针域通常称为front域。
常用操作
A) 向链表中next指针q指向的结点后插入结点
1. 创建一个新结点,并用指针p指向该结点
2. 将q指向的结点的next域指针赋值给新结点的next域
3. 将p的值赋值给q指向的结点的next域
B)从链表中扇车q指向的结点
1. 如果q指向的结点是第一个结点(也就是说q是head node的next域),将q所指结点的next域赋值给head node的next域,释放q所指结点
2. 如果q指向的结点的前驱结点A(也就是q所在的结点)已知时(所谓已知就是说指向结点A的指针r已知),将q所指结点的next域赋值给r,释放q所指结点
3. 如果q指向的结点的前驱结点A未知时,需要从链表表头开始遍历链表(当然如果是双向链表则可以用front域来获得A),找到A(判断结点的next域是否为q),再按2操作
插入结点和删除结点可以实现创建链表和销毁链表
顺序表的优势在于构造简单,便于遍历,随机存取快,但是插入和删除的效率低(需要移动一系列元素);链表的优势在于插入和删除的效率通常较高(仅仅是局部的指针变换),特别是表长很大的情况下,但是由于其指向元素的地址不是连续的,所以执行“读取第i个元素”之类的操作时,就必须从表头开始遍历i次(而顺序表可以直接做指针偏移来获得第i个元素)。