线性表:
线性结构特点:
1、除第一个外,其他每个元素都只有一个前驱
2、除最后一个外,其他每个元素都只有一个后继
顺序存储:一组地址连续的存储单元,随机存取
exit(OVERFLOW);
exit()函数:即使是在除main()之外的函数调用exit();也会终止程序
return()只是将该层控制器移交给上一级
stdlib.h:void exit(int status); status不为0,都表示异常退出
链表存储:
结点:数据域、指针域
引入头结点优点:
1、链表的第一个位置上的操作和表的其他位置操作一致,无须进行特殊处理
2、空表和非空表的处理也统一了
单链表实现线性表的问题:
1、单链表表长是一个隐含值
2、在最后一个元素最后插入元素,需遍历整个链表
3、元素“位序”的概念被淡化,结点“位置”概念强化
改进链表:
1、增加“表长”、“表尾指针”、“当前位置指针”三个数据域
2、将基本操作由“位序”改为“指针”
静态单链表:用一维数组描述线性链表
特点:i=s[i].cur相当于单链表中的p=p->next;
链表结尾的s[i].cur=0;
缺陷:不能辨明数组中哪些分量未被使用
解决办法:将所有未被使用的以及删除了的分量用游标链成一个备用的链表。
使用:进行插入时,从备用链表中取得第一个结点插入;反之,在删除时,将删除的结点链接到备用链表上。
循环链表:表中最后一个结点的指针域指向头结点,整个链表形成一个环。
判断结尾指针不是判断指针域是否指向空(p->next==NULL)
而是判断指针是否指向头指针(p->next==head)
双向链表:克服单链表的单向性
特点:d->next->prior=d->prior->next=d;
缺陷:求链表长度不如顺序存储;位序概念淡化
练习:
1、线性表特点:
表中元素个数有限;
元素有先后次序;
数据类型都相同。
2、线性表是一种逻辑结构,一对一的相邻关系。
顺序表和链表是指存储结构
顺序表的特点是表中元素的逻辑顺序与其物理顺序相同
3、有序顺序表删除重复值:
void delete(List &l) { for(i=1,j=0;i<l.length;i++) { if(l.data[i]!=l.data[j]) l.data[++j]=l.data[i]; } l.length=j+1; }
4、顺序表和链表的比较:
存取方式:顺序表是随机存取;链表是顺序存取
逻辑结构和物理结构:顺序存储,逻辑相邻,物理存储位置也相邻;链表,逻辑相邻,物理存储位置不一定相邻,对应的逻辑关系通过
指针链接
查找、插入和删除
空间分配:顺序表需预先分配足够大的存储空间,虽然可动态分配,但需移动大量元素,且如果内存没有大块的连续存储空间将导致分配
失败;链式存储分配空间时操作灵活、高效
5、数组排序的最少时间复杂度为O(nlog2n)