第二章、线性表

2.1线性表的定义和特点

  • 定义:数据特性相同的元素构成的有限序列
  • 特性:第一个元素无直接前驱、最后一个元素无直接后继、中间的每个元素都有一个前驱和后继。

2.4线性表的顺序表示与实现

  • 线性表的顺序表示:用一组地址连续的储存单元依次存储线性表的数据元素。
  • 特点:逻辑上相邻的元素,物理上次序(内存上)也相邻。
  • 随机存取的存储结构:任一数据元素都可以随机存取(此随机是指想找第几项就可以直接找出来使用,例如数组在合理范围内通过下标找对应数据)。
#define MAXSIZE 100 //顺序表所能达到的最大长度,通过宏定义便于修改
typedef struct
{
    ElemType *elem  //ElemType元素类型的统称,使用时替换为具体的问题类型
    int length;     //当前长度
}SqList;            //将顺序表的结构类型设为SqList
  • 可以将*elem定义为elem[MAXSIZE],便不用动态分配内存,但是动态malloc的存储区域可以更有效地利用系统的资源,当不需要该线性表时,可以使用销毁操作及时释放占用的存储空间,而使用数组便不能直接free。
  • 动态分配内存时需要注意是否分配成功
    #defeine OVERFLOW -2
    (一)
    L.elem = new ElemType[MAXSIZE];
    if(!L.elem) exit(OVERFLOW);
    (二)
    L.elem = (ElemType *)malloc(sizeof(ElemType)*MAXSIZE);
    if(!L.elem) exit(OVERFLOW);

  •  顺序表的取值需要注意判断取值位置是否合理。插入需要判断插入位置是否合理、顺序表是否元素满。删除需要判断删除位置是否合理(表空蕴含在其中)。
  • 平均查找长度:在查找时,为确定元素在顺序表中的位置,需要和给定值进行比较的数据元素个数的期望值称为查找算法在查找成功时的平均查找长度(ASL)。
  • 顺序表查找ASL=(n+1)/ 2;插入ASL=n / 2; 删除ASL=(n-1)/ 2。

2.5线性表的链式表示与实现

  • 线性表的链式表示:用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。
  • 顺序存储:要取得第i个元素必须从头指针出发顺链进行查找。
  • 结点(数据元素的存储映像)=数据域+指针域,n(>=1)个节点构成一个链表。
  • 链表:单链表、循环链表、双向链表、二叉链表、十字链表、邻接表、邻接多重表等。
  • 首元节点:链表中的第一个节点。
  • 单链表是由表头指针唯一确定的,因此单链表可以用头指针的名字来命名。若头指针为L,则简称该链表为表L。
  • 头节点:附设在链表的第一个节点之前的节点。头节点在首元节点之前。
  • 头节点的作用:
    • 便于首元节点的处理,头节点作为首元节点的前驱,则对链表的第一个数据元素的操作与其他的数据元素相同,无需进行特殊处理。
    • 便于空表与非空表的统一处理 L->next=NULL(带头节点的链表判定为空表)。
  • 单链表取值ASL=(n-1)/ 2。
  • 头插法(适用于链栈的创建)与尾插法(适用于链队的创建)。
  • 循环链表,双向链表,双向循环链表、循环双链表注意区分。

2.6顺序表与链表的比较

  • 储存密度:数据元素本身所占用的存储量和整个节点所占用的存储量之比。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值