3
13
e
n-1
Locate(e
0
)+
(n-1)*c
e
n-1
n-1
……
e
i
Locate(e
0
)+i*ce
i
i
…………
e
1
Locate(e
0
)+ce
1
1
e
0
Locate(e
0
)e
0
0
数据元素存储地址数据元素逻辑地址
线性表的顺序存储结构示意图
14
顺序表,可看作以数组作为基础实现的线性表
数组的元素个数固定,线性表的元素个数可以随操作
改变,需要设法弥合两者之间的差异
方式:创建一个大数组,表元素存
在数组前面一段
• 表元素应密集地连续存放,以便能用数
组下标作为表元素索引(效率)
• 需要记录表中元素个数。必须维持元素
个数记录和表中实际元素个数一致
255
108
44
4
1024
表中
当前
存在
的
元素
n
数组大小确定了顺序表的最大容量(需根
据实际确定),也使插入操作有可能失败
连续存放给删除操作的实现带来问题
15
定义1:
DataType elements[NMAX];
int n; /* 元素个数n < NMAX */
/*没反映 elements 和n的内在联系;应专门引进一个类型*/
顺序表的C实现:类型定义
定义2:(用结构将相关数据成分包装起来)
struct SeqList {
int n; /* 元素个数n < NMAX */
DataType elements[NMAX];
};
最好是定义为类型:
typedef struct SeqList { ... ... } SeqList;
16
后一定义更清晰,更符合数据抽象原则(一个对象应
是一个整体,一种对象应定义为类型),应该采用
为了使用方便,常定义指向顺序表类型的指针类型:
typedef SeqList *PSeqList;
如果函数 f 的原型是:
...... f (PSeqList pl)
实际调用函数 f 应该采用的形式:
SeqList L1; /* 定义顺序表 L1 */
...... f(&L1);
在 f 里可以完成对 L1 的任何操作(思考题:如果 f 的
参数用 SeqList类型,情况有什么不同?)
17
顺序表基本运算的实现
z 算法2.1 创建空表
PSeqList createNullList_seq( void )
z 算法2.2 插入
int insert_seq( PSeqList palist, int p, DataType x )
z 算法2.3 删除
int delete_seq( PSeqList palist, int p )
z 算法2.4 求表中某元素的下标
int locate_seq( PSeqList palist, DataType x )
z 算法2.5 求 palist 所指表中下标为p的元素值
DataType retrieve_seq( PSeqList palist, int p )
z 算法2.6 判断表是否为空
int isNullList_seq( PSeqList palist)
18
0
palist
算法
算法
2.1
2.1
创建空顺序表
创建空顺序表
PSeqList createNullList_seq( void )
elements
n
需要:
• 分配存储
• 把 n 设置为 0,保证表
处于合法的初始状态
评论0
最新资源