【计算机】数据结构-严蔚敏/清华大学P4
第二章 线性表
顺序映像的C语言描述
#define LIST_INIT_SIZE 80
//线性表存储空间的初始分配量
#define LISTINCREMENT 10
//线性表存储空间的分配增量
typedef struct {
ElemType *elem;//存储空间基址
int length;//当前长度
int listsize;//当前分配的存储容量
//(以sizeof(ElemType)为单位)
} SqList;//俗称顺序表
线性表的初始化操作
Status InitList_Sq( SqList& L ){
//构造一个空的线性表
L.elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem) exit(OVERFLOW);
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return OK;
} //InitList_Sq
线性表操作
LocateElem(L,e,compare())的实现:
int LocateElem_Sq(SqList L,ElemType e){
Status(*compare)(ElemType,ElemType)){
i = 1; //i的初值为第1元素的位序
p = L.elem;//p的初值为第1元素的存储位置
while(i<=L.length && !(*compare)(*p++,e)){
++i;
if(i<=L.length) return i;
else return 0;
}
}
}//LocateElem_Sq
线性表操作
ListInsert(&L,i,e)的实现:
问:插入元素时,线性表的逻辑结构发生什么变化?
(a₁,...,aᵢ₋₁,aᵢ,...,aₙ)改变为
(a₁,...,aᵢ₋₁,e,aᵢ,...,aₙ)
a₁ | a₂ | ... | aᵢ₋₁ | aᵢ | ... | aₙ | |
a₁ | a₂ | ... | aᵢ₋₁ | e | aᵢ | ... | aₙ |
求算法的时间复杂度为:O(ListLength(L)),和表长一样。
考虑平均的情况:
线性表操作
Listelete(&L,i,&e)的实现:
问:删除元素时,
线性表的逻辑结构发生什么变化?
(a₁,...,aᵢ₋₁,aᵢ,aᵢ₊₁,...,aₙ)改变为
(a₁,...,aᵢ₋₁,aᵢ₊₁,...,aₙ)
a₁ | a₂ | ... | aᵢ₋₁ | aᵢ | aᵢ₊₁ | ... | aₙ |
a₁ | a₂ | ... | aᵢ₋₁ | aᵢ₊₁ | ... | aₙ |
此算法的时间复杂度为:O(ListLength(L)),和表长一样。
考虑平均的情况:
2.3线性表类型的实现
--链式映象
一、单链表
用一组地址任意的存储单元存放线性表中的数据元素
以元素(数据元素的映像)
+指针(指示后继元素存储位置的)
=结点(表示数据元素)
以"结点的序列"表示线性表-----称作链表
以线性表中第一个数据元素 a₁ 的存储地址作为线性表的地址,称作线性表的头指针
二、结点和单链表的C语言描述
Typedef struct LNode {
ElemType data;//数据域
struct Lnode *next;//指针域
} LNode,*LinkList;
线性表的操作GetElem(L,i,&e)
在链表中的实现:
基本操作为:使指针p始终指向线性表中第j个数据元素
算法的时间复杂度为:O(ListLength(L))
线性表的操作ListInsert(L,i,&e)
在链表中的实现:
基本操作为:找到线性表中第i-1个结点,修改其指向后继的指针
有序对<aᵢ₋₁,aᵢ>改变为<aᵢ₋₁,e>和<e,aᵢ>
算法的时间复杂度为:O(ListLength(L))
线性表的操作ListDelete(L,i,&e)
在链表中的实现:
基本操作为:找到线性表中第i-1个结点,修改其指向后继的指针
有序对<aᵢ₋₁,aᵢ>和<aᵢ,aᵢ₊₁>改变为<aᵢ₋₁,aᵢ₊₁>
-----------------END-----------------