线性表
存储结构
链式存储:
(1)线性表采用链式方式将结点链接起来的存储结构称为链表。
链表:从链接方式看,分为单链表,循环链表和双向链表
从实现角度看,动态链表和静态链表
单链表:
单链表的结构:分数据域和指针域,数据域用来存储结点的值,指针域用来存储数据元素后继的位置。(用一组任意的地址上可以不连续的存储单元存放线性表的结点,每个结点的唯一后继依靠一个结点指针维持,每个结点的地址存放在前一个结点的指针域,头指针指向第一个结点,最后一个结点的指针域为空“NULL”)(只有一个向后指的单向的next域)
为方便运算,可用带头结点的单链表,在第一个元素结点之前,多设了一个头结点,头指针指向头结点,头结点指向第一个元素结点,从而构成了带头结点的一般的结构。若是空链表,则头指针指向头结点,头结点的指针域为空。
加头结点的目的:为方便统一空表或非空表的运算处理(头结点:数据域无要求,其指针域指向第一个结点。首结点:链表中第一个元素结点)
注:1.链表头指针指向链表开始;2.带头结点的链表中,头指针指向头结点,头结点指向首结点;3.无头结点的链表中,头指针指向首结点。
单链表的运算:求单链表长度,建立单链表,单链表查找,单链表插入,单链表删除
建立单链表:建立空表,头插法建表,尾插法建表
单链表查找:按序号查找,按值查找
按序号查找:从头查找,顺链计数,结果判断
单链表插入:1.确定第i-1个结点的位置;2.申请新结点s;3.插入挂链:新结点s插至第i-1个结点之后,s结点的后继指向第i个结点(s->next=pre->next),第i-1个结点的指针指向s(pre->next=s)
单链表删除:1.确定第i-1个结点的位置p;2.删除并释放第i个结点,指针r指向被删结点(r=p->next),删除第i个结点r(p->next=r->next),释放r结点(free(r))
单链表的使用方式:头指针指向单链表,单链表的操作必须从头指针开始依次访问表中结点,访问带头结点单链表L的首结点p,其语句为:p=L->next。
(2) 修改结点链接适合动态变化。
循环链表:
定义:首尾相接的链表。
结构:尾结点的指针域指向头结点或表的首元结点。
特点:表中所有结点都链接在一个环上。(首尾相接)
判空条件:头结点的指针域指向自己,即“head->next==head”。
双向链表:
定义:链表中每个结点增加一个指向其前驱的指针,叫前驱指针域,每个结点包含两个指针域。
特点:任一结点均可沿前驱和后继两个方向操作。
前插操作:1.s->prior=p->prior;2.p->prior->next=s;3.s->next=p;4.p->prior=s;
删除操作:1.p->prior->next=p->next;2.p->next->prior=p->prior;
双向链表可以从两个方向访问任一结点,快速,方便。
静态链表基本操作:初始化,分配结点,结点回收
静态链表:数组模拟链表功能,静态模拟动态功能。
类型与变量的区别:类型定义了一种规格,变量是规格类型的具体空间。即“类型是一种规格的定义,变量是一种空间的定义”