数据结构与算法_ 线性结构_

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
wenku.baidu.com
L->elem[k-1]=L->elem[k];
L->length--;
/*顺序表长度减1*/
return 1;
}
删除元素算法时间复杂度分析
for(k=i;k<L->length;k++) /*元素前移*/
L->elem[k-1]=L->elem[k]; v 分析:移动元素操作次数和删除元素位置i的关系
LISTINCREMENT)*sizeof(ElemType));
if(!newbase) return 0; /*存储分配失败*/
L->elem=newbase;
L->listsize+=LISTINCREMENT; /*修改存储空间大小*/
}
for(k=L->length-1;k>=i-1;k--) /*元素后移*/
/*置初始空间容量*/
return 1;
/*初始化成功,返回1*/
}
顺序表常用算法
要求:在第i个元素之前插入一个新元素e
a1 a2 ... ai-1 ai ... an
插入后 a1 a2 ... ai-1 e
ai
... an
思考:如何实现?
a1 a2 ... ai-1 aei
... an
注意:C语言中数组的下标由0开①始,而线性表中②数据元素的位 序由1开始,因此an对应的数组元素下标为length-1,而ai对应 的数组元素下标为i-1。
}SqList;
/*存储空间的基地址*/ /*顺序表的当前长度*/ /*当前分配的存储空间*/
顺序表常用算法
顺序表常用算法
LIST_INIT_SIZE
length
listsize
顺序表常用算法
int InitList_sq(SqList *L) {
L①->e为lem顺=序(E表lemLT分yp配e 一*)m个a预llo定c(义大小的一段连续单元
线性表的顺序表示与实现
线性表的顺序存储实现
特点:动态分配顺序表的大小。
a1 a2 ... ai ... an
L.length
#define LIST_INIT_SIZE 50 #define LISTINCREMEMT 10
L.listsize
typedef struct { ElemType *elem; int length; int listsize;
v 分析:移动元素操作次数和插入元素位置i的关系 i=L.length+1时,执行次数= 0 i=1时,执行次数= n 执行次数=(n-i+1)
v 在长度为n的顺序表表中插入一个元素的平均移动次数
n1
Eis pi (n i 1) i 1
假定在线性表任何位置上插入元素是等概率的
pi = 1/(n + 1)
顺序表常用算法
int LocateElem_Sq(SqList L,ElemType e, int (*compare)(ElemType,ElemType) )
{
for(i=0;i<L.length;i++)
{
if( (*compare)(L.elem[i],e) )
break;
}
if(i>=L.length) return 0; //未找到满足指定关系的元素
Eis
1 n1
n1
(n i
i 1
1)
n 2
插入算法的时间复杂度为 O(n)
顺序表常用算法
删除后
要求:删除顺序表中第i个位置的元素。
a1 a2 ... ai ai+1 ... an
a1 a2 ... ai+1 ... an
思考:如何实现?
a1
a2
...
ai ai+1
... an
e=ai
顺序表常用算法
i=L.length时,执行次数= 0 i=1时,执行次数= n-1 执行次数=(n-i)
v 在长度为n的顺序表表中删除一个元素的平均移动次数
n
Edl qi (n i) i 1
假定在线性表任何位置上删除元素是等概率的
qi = 1/n
Edl
1 n
n i 1
(n
i)
n1 2
删除算法的时间复杂度为 O(n)
顺序表常用算法
int ListInsert_sq(SqList *L,int i,ElemType e){
if(i<1 || i>L.length+1) return 0;
/*位置合法性判断*/
if(L->length>=L->listsize){
/*空间满,重新分配*/
ElemType *newbase=(ElemType*)realloc(L->elem,(L->Listsize+
L->elem[k+1]= L->elem[k];
L->elem[i-1]= e;
/*插入元素*/
L->length++;
/*顺序表长度加1*/
return 1;
}
插入元素算法时间复杂度分析
for(k=L->length-1;k>=i-1;k--) /*元素后移*/ L->elem[k+1]= L->elem[k];
LIST_INIT_SIZE*sizeof(ElemType));
if②(!L如->e果lem分)配re空tu间rn失0;败,退出/*初函始数化失败*/
L③->le空ng间th分=0配; 成功,设置顺序/*置表空L的表l长i度st为si0*z/e数据域和
L->lilsetsnizget=Lh数IST据_域IN的IT值_SIZE;
int ListDelete_sq(SqList *L,int i,ElemType *e){
int k;
/*删除位置不合法*/
if(i<1||i>L->length) return 0;
*e=L->elem[i-1]; /*取出欲删除元素*/
for(k=i;k<L->length;k++) /*元素前移*/
else return i+1;
//找到满足指定关系的元素,返回其位序
}
复习回顾——线性链表的存储表示
typedef struct LNode{ ElemType data; //结点的数据域 struct LNode *next; //结点的指针域
}LNode, *LinkList;
线性链表基本运算的实现
访问线性链表 void ListTraverse_L(LinkList L, void (*visit)(ElemType))
线性链表的读取 int GetElem_L(LinkList L, int i, ElemType *e)
线性链表元素的插入 int ListInsert_L(LinkList L, int i, ElemType e)
相关文档
最新文档