插入和删除时需要修改两个方向的指针。
(22) 插入和删除
需要修改两个方向的指针。例如: (见下表 )
表 错误!文档中没有指定样式的文字。 .2 双向循环链表的插入和删除
p 之后插入 s p 之前插入 s 删除 p 之后继 s 删除 p
s->next = p->next;
p->next = s;
s->prior = p;
s->next->prior = s;
s->prior = p->prior;
p->prior = s;
s->next = p;
s->prior->next = s;
s = p->next;
p->next = s->next;
p->next->prior = p;
p->prior->next = p->next;
p->next->prior = p->prior;
顺序表与单链表的比较
表 错误!文档中没有指定样式的文字。 .3 顺序表和单链表的比较
顺序表 单链表
以地址相邻表示关系 用指针表示关系
随机访问,取元素 O(1) 顺序访问,取元素 O(n)
插入、删除需要移动元素 O(n) 插入、删除不用移动元素 O(n)( 用于查找位置 )
总结:需要反复插入、删除,宜采用链表;反复提取,很少插入、删除,宜采用顺序表。
第三章、栈和队列
栈
栈, 栈顶 , 栈底 ,空栈 ,后进先出 (LIFO) ,入栈 (Push), 出栈 (Pop) 。
顺序栈 :栈的顺序存储结构; 链栈 :栈的链式存储结构。
链栈
存储结构
用不带头结点的单链表实现。
类型定义
同单链表。
基本形态
1°.
栈空
条件 : S == NULL
2°.
栈非空
3°.
栈满(一般不出现)
基本算法
4°.
入栈 Push (&s, x)
bool Push 错误!未找到引用源。 ( LinkList &s, DataType x )
{
// 新建结点
p = (LinkList) malloc (sizeof(LNode));
if ( !p ) return false; // 失败
p->data = x;
// 插入栈顶
p->next = s;
s = p;
return true ;
}
5°.
出栈 Pop (&s, &x)
前提:栈非空。
bool Pop 错误!未找到引用源。 ( LinkList &s, DataType &x )
{
if ( s==NULL ) return false; // 栈空
// 删除栈顶元素
p = s;
s = s->next;
x = p->data;
free ( p );
return true ;
}
6°.
栈顶元素
前提:栈非空。
bool Top 错误!未找到引用源。 ( LinkList &s, DataType &x )
{
if ( s==NULL ) return false; // 栈空
a1 /\ an
S ...
an-1
S /\
a
1
/\ a
n
S ...
a
n-1