线性表就是具有相同数据类型的n(n>=0)个数据元素的有限序列。
关于线性表需要注意的有:数据元素同类型、有限个、有序、仅讨论元素间的逻辑关系。
typedef是计算机编程语言中用来为复杂的声明定义简单的别名。
线性表是逻辑结构,而线性表的存储实现包括顺序存储实现和链式存储实现。
顺序存储结构,就是用数组的方法实现。为什么说数组是顺序存储结构,因为数组是将元素在内存中连续存放,且每个元素占用内存相同。
关于数组操作的时间复杂度:查找:O(1);插入:O(n);删除:O(n)。
查找:由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素,所以与输入数据大小(n)无关,则其时间复杂度为O(1)。
插入:可以插入数组的位置有0(开头)、1、2、···、n、n+1(末尾),那么插入这些位置所需移动的次数为n、n-1、n-2、···、1、0,则平均移动次数为(0+1+···+n)/(n+1)=n*(n+1)/2(n+1)=n/2。时间复杂度O(n/2)即是O(n)。
删除:可以删除的数在数组中的位置有0(开头)、1、2、···、n-1、n(末尾),那么删除这些位置的数所需移动的次数为n-1、n-2、n-3、···、1、0,则平均移动次数为(0+1+···+n-1)/n=n*(n-1)/2n=(n-1)/2。时间复杂度O((n-1)/2)即是O(n)。
链式存储结构,就是用链表的方法实现。链表不要求逻辑上相邻的两个元素物理上也相邻,而是通过“链”的方法建立起元素之间的关系。链表的每一个节点包括数值和指针。
关于数组操作的时间复杂度:查找:O(n) 插入:O(1) 删除:O(1)。
查找:链表的“链”实际上就是一个指针,从上一个元素指到下一个元素,以此类推,直到最后一个元素。如果要访问链表中一个元素,需要从第一个元素开始,一直找到需要的元素位置。所以,平均查找次数为(1+2+···+n)/n=n*(n+1)/2n=(n+1)/2,时间复杂度为O(n)。
插入:将一个数插入到链表的某一个位置,只需要将该位置的前一个节点(设为P)的指针指向需插入的节点(设为S),需插入的节点的指针指向原来该位置的节点。用代码表示为:
S->Next=P->Next;P->Next=S;(顺序不能反哦)
删除:删除链表上某个位置的节点,只需要将该节点的前一个节点(设为P)的指针指向该节点(设为S)的下一个节点。用代码表示为:
S=P->Next;P->Next=S->Next;