数据结构1 7 2 2线性表顺序映像_第1页
数据结构1 7 2 2线性表顺序映像_第2页
数据结构1 7 2 2线性表顺序映像_第3页
数据结构1 7 2 2线性表顺序映像_第4页
数据结构1 7 2 2线性表顺序映像_第5页
已阅读5页,还剩16页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2.2最简单的一种顺序映象方法是:令y

的存储位置和x

的存储位置相邻。顺序映象——以x

的存储位置和y

的存储位置之间某种关系表示逻辑关系<x,y>用一组地址连续的存储单元依次存放线性表中的数据元素a1a2…ai-1ai…an线性表的起始地址,称作线性表的基地址以“存储位置相邻”表示有序对<ai-1,a即:LOC(ai)=LOC(ai-1)+C一个数据元素所占存储量所有数据元素的存储位置均取决于第一个数据元素的存储位置LOC(ai)

=LOC(a1)

+

(i-1)×C↑基地址顺序映象的C

语言描述也称为顺序表intint}

SqList;#define

LIST_INIT_SIZE

80//线性表存储空间的初始分配量#define

LISTINCREMENT

10//线性表存储空间的分配增量typedef struct

{ElemType

*elem;

//存储空间基址length; //当前长度listsize; //当前分配的存储容量//(以sizeof(ElemType)为单位)线性表的基本操作在顺序表中的实现InitList(&L)

//结构初始化LocateElem(L,

e,

compare()) //

查找ListInsert(&L,

i,

e) //

插入元素ListDelete(&L,

i) //

删除元素Status

InitList_Sq(

SqList&

L,

int

maxsize

)

{//构造一个最大容量为maxsize的顺序表L.elem

=

new

ElemType[maxsize];//为顺序表分配大小为maxsize的数组空间if

(!L.elem)

exit(OVERFLOW);L.length

=

0;L.listsize

=

maxsize;return

OK;}

//

InitList_Sq算法时间复杂度:O(1)顺序表的查找例如:23754138546217L.elemL.length

=

7L.listsizee

=

38pppppi12341850

查找不成功,返回0!

值e相比较。p查找的基本操作是:将顺序表中的查找成功,返回i值!元素逐个和给定pint

LocateElem_Sq(SqList

L,

ElemType

e,Status

(*compare)(ElemType,

ElemType))

{//在顺序表中查询第一个满足判定条件的数据元素,//若存在,则返回它的位序,否则返回0i=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算法的时间复杂度为:O(

ListLength(L)

)线性表操作ListInsert(&L,

i,

e)的实现:首先分析:插入元素时,线性表的逻辑结构发生什么变化?(a1,…,ai-1,ai,…,an)改变为a2…ai-1a1

ai

ana1a2…ai-1eai…a(a1,

…,

ai-1,

e,

ai,

…,

an)<ai-1,

ai> <ai-1,

e>, <e,

ai>表的长度增加nStatus

ListInsert_Sq(SqList

&L,

int

i,

ElemType

e)

{//

在顺序表L的第i

个元素之前插入新的元素e,//i

的合法范围为1≤i≤L.length+1}//

ListInsert_SqO(

ListLength(L)

)//表长增1算法时间复杂度为:++L.length;return

OK;q=&(L.elem[i-1]); //q

指示插入位置for(p

=

&(L.elem[L.length-1]);p

>=

q;

--p)*(p+1)=*p; //插入位置及之后的元素右移*q=e;

//插入e……(合法性检查、分配空间满需追加空间等)if

(i

<

1

||

i

>

L.length+1)

return

ERROR;//插入位置不合法if

(L.length

>=

L.listsize)

{//当前存储空间已满,增加分配newbase

=

(ElemType

*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof

(ElemType));if

(!newbase)exit(OVERFLOW);//存储分配失败L.elem=newbase;

//新基址L.listsize+=LISTINCREMENT;//增加存储容量}211830754256872118307566425687例如:ListInsert_Sq(L,

5,66)L.length-10pppq=&(L.elem[i-1]); //q

指示插入位置for(p=

&(L.elem[L.length-1]);p>=

q;

--p)*(p+1)

=*p;p

q考虑移动元素的平均情况:假设在第

i

个元素之前插入的概率为

pi

,n+1则在长度为n的线性表中插入一个元素所需移动元素次数的期望值为:Eis

=

pi

(n

-

i

+1)i=1若假定在线性表中任何一个位置上进行插入的概率都是相等的,则移动元素的期望值为:n+1(n

-

i

+1)n

+1

i=11isE

=2=

n线性表操作ListDelete(&L,

i,

&e)的实现:首先分析:删除元素时,线性表的逻辑结构发生什么变化?(a1,…,ai-1,ai,ai+1,…,an)改变为<ai-1,

ai>,<ai,

ai+1><ai-1,

ai+1>表的长度减少a1a2…ai-1aiai+1…ana1a2…ai-1ai+1…an(a1,

…,

ai-1,

ai+1,

…,

an)Status

ListDelete_Sq(SqList

&L,

int

i,

ElemType

&e)

{--L.length;

//表长减1return

OK;}//

ListDelete_Sqfor

(++p;

p<=

q;

++p)

*(p-1)

=*p;//被删除元素之后的元素左移算法时间复杂度为:O(

ListLength(L))//p

为被删除元素的位置//被删除元素的值赋给ep

=

&(L.elem[i-1]);e=*p;q

=

L.elem+L.length-1;//表尾元素的位置if

((i

<

1)

||

(i

>

L.length))

return

ERROR;//删除位置不合法考虑移动元素的平均情况:假设删除第

i个元素的概率为

qi

,n则在长度为n

的线性表中删除一个元素所需移动元素次数的期望值为:Edl

=

qi

(n

-

i)i=1若假定在线性表中任何一个位置上进行删除

的概率都是相等的,则移动元素的期望值为:nn

i=1(n

-

i)

=dlE

=1

n

-1221183075425687211830755687L.length-

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论