CH2数据结构课件PPT推荐.ppt
《CH2数据结构课件PPT推荐.ppt》由会员分享,可在线阅读,更多相关《CH2数据结构课件PPT推荐.ppt(64页珍藏版)》请在冰豆网上搜索。
特征:
元素个数元素个数nn表长度,表长度,n=0n=0空表空表11ini=0数据关系:
数据关系:
Rl=ai-1,ai|ai-1,aiD,i=1,2,n基本操作:
基本操作:
InitList(&
L)DestroyList(&
L)ClearList(&
L)ListEmpty(L)ListLength(L)GetElem(L,I,&
e)LocateElem(L,e,compare()PriorElem(L,cur_e,&
pre_e)NextElem(L,cur_e,&
next_e)ListInsert(&
L,i,e)ListDelete(&
L,i,&
e)ListTraverse(L,visit()ADTList算法算法算法算法2.12.12.12.1利用两个线性表利用两个线性表LALA和和LBLB分别表示两个集合分别表示两个集合AA和和BB,现要求一个新的集合现要求一个新的集合A=ABA=AB。
voidunion(List&
La,ListLb)La-len=listlength(La);
Lb-len=listlength(Lb);
for(I=1;
I=lb-len;
I+)getelem(lb,I,e);
if(!
locateelem(la,e,equal)listinsert(la,+la-en,e)算法的时间复杂度:
算法的时间复杂度:
O(ListLength(LA)ListLength(LB))算法算法算法算法2.22.22.22.2巳知线性表巳知线性表LALA和线性表和线性表LBLB中的数据元素中的数据元素按值非递减有序排列,现要求将按值非递减有序排列,现要求将LALA和和LBLB归并为归并为一个新的线性表一个新的线性表LCLC,且,且LCLC中的元素仍按值非递中的元素仍按值非递减有序排列。
减有序排列。
voidmergelist(listla,listlb,list&
lc)initlist(lc);
I=j=1;
k=0;
la-len=listlength(la);
lb-len=listlength(lb);
while(I=la-len)&
(j=lb-len)getelem(la,I,ai);
getelem(lb,j,bj);
if(ai=bj)listinsert(lc,+k,ai);
+I;
elselistinsert(lc,+k,bj);
+j;
while(I=la-len)getelem(la,I+,ai);
listinsert(lc,+k,ai);
while(j=lb-len)getelem(lb,j+,bj);
listinsert(lc,+k,bj);
O(ListLength(LA)+ListLength(LB))2.22.2线性表的顺序存储结构线性表的顺序存储结构顺序表:
顺序表:
定义:
用一组地址连续的存储单元存放一个线性表叫定义:
用一组地址连续的存储单元存放一个线性表叫元素地址计算方法:
元素地址计算方法:
LOC(aiLOC(ai)=LOC(a1)+(i-1)*L)=LOC(a1)+(i-1)*LLOC(ai+1)=LOC(ai+1)=LOC(aiLOC(ai)+L)+L其中:
其中:
LL一个元素占用的存储单元个数一个元素占用的存储单元个数LOC(aiLOC(ai)线性表第线性表第ii个元素的地址个元素的地址特点:
特点:
实现实现逻辑上相邻逻辑上相邻物理地址相邻物理地址相邻实现实现随机存取随机存取实现:
实现:
可用可用CC语言的一维数组实现语言的一维数组实现a1a2an01n-112n内存内存V数组下标数组下标元素序号元素序号M-1typedefintDATATYPE;
#defineM1000DATATYPEdataM;
例例typedefstructcardintnum;
charname20;
charauthor10;
charpublisher30;
floatprice;
DATATYPE;
DATATYPElibraryM;
备备用用空空间间数据元素不是简单类型时数据元素不是简单类型时,可定义可定义结构体数组结构体数组或动态申请和释放内存或动态申请和释放内存DATATYPE*pData=(DATATYPE*)malloc(M*sizeof(DATATYPE);
free(pData);
由于由于C语言中的一维数组也是采用顺序存储表示,故可语言中的一维数组也是采用顺序存储表示,故可以用数组类型来描述顺序表。
又因为除了用数组来存以用数组类型来描述顺序表。
又因为除了用数组来存储线性表的元素之外,顺序表还应该用一个变量来表储线性表的元素之外,顺序表还应该用一个变量来表示线性表的长度属性,所以我们用结构类型来定义顺示线性表的长度属性,所以我们用结构类型来定义顺序表类型。
序表类型。
#defineListSize100typedefintDataType;
typedefstructDataTypedataListSize;
intlength;
Sqlist;
插入插入定义:
线性表的插入是指在第定义:
线性表的插入是指在第ii(11iin+1n+1)个元素个元素之前插入一个新的数据元素之前插入一个新的数据元素xx,使长度为使长度为nn的线性表的线性表变变为为n+1n+1变成变成长度为长度为n+1n+1的线性表的线性表需将第需将第ii至第至第nn共共(n-i+1)n-i+1)个元素后移个元素后移算法算法VoidInsertList(Sqlist*L,DataTypex,intI)intj;
if(Il.length+1)printf(“Positionerror”);
returnERROR;
if(l.length=ListSize)printf(“overflow”);
exit(overflow);
for(j=l.length-1;
j=I-1;
j-)l.dataj+1=l.dataj;
l.dataI-1=x;
l.length+;
内存内存aa11aa22aaiiaai+1i+1aann0011i-1i-1VV数组下标数组下标n-1n-1iinn1122ii元素序号元素序号i+1i+1nnn+1n+1内存内存aa11aa22aaiiaai+1i+1aann0011i-1i-1VV数组下标数组下标n-1n-1iinn1122ii元素序号元素序号i+1i+1nnn+1n+1aan-1n-1xx分析算法的复杂度分析算法的复杂度分析算法的复杂度分析算法的复杂度这里的问题规模是表的长度,设它的值为。
该算法的这里的问题规模是表的长度,设它的值为。
该算法的时间主要化费在循环的结点后移语句上,该语句的执行次时间主要化费在循环的结点后移语句上,该语句的执行次数(即移动结点的次数)是。
由此可看出,所需移动结点数(即移动结点的次数)是。
由此可看出,所需移动结点的次数不仅依赖于表的长度,而且还与插入位置有关。
的次数不仅依赖于表的长度,而且还与插入位置有关。
当当i=n+1时,由于循环变量的终值大于初值,结点后移时,由于循环变量的终值大于初值,结点后移语句将不进行;
这是语句将不进行;
这是最好最好情况,其时间复杂度情况,其时间复杂度O
(1);
);
当当i=1时,结点后移语句将循环执行时,结点后移语句将循环执行n次,需移动表中次,需移动表中所有结点,这是所有结点,这是最坏最坏情况,其时间复杂度为情况,其时间复杂度为O(n)。
)。
算法时间复杂度算法时间复杂度T(n)T(n)设设PiPi是在第是在第ii个元素之前插入一个元素的概率,个元素之前插入一个元素的概率,则在长度为则在长度为nn的线性表中插入一个元素时,所需的线性表中插入一个元素时,所需移动的元素次数的平均次数为:
移动的元素次数的平均次数为:
也就是说,在顺序表上做插入运算,平均要移动表上一半也就是说,在顺序表上做插入运算,平均要移动表上一半结点。
当表长结点。
当表长n较大时,算法的效率相当低。
虽然较大时,算法的效率相当低。
虽然Eis(n)中中n的的系数较小,但就数量级而言,它仍然是线性阶的。
因的的系数较小,但就数量级而言,它仍然是线性阶的。
因此算法的平均时间复杂度为此算法的平均时间复杂度为O(n)。
动态删除删除定义:
线性表的删除是指将第定义:
线性表的删除是指将第ii(11iinn)个元素删个元素删除,使长度为除,使长度为nn的线性表的线性表变成变成长度为长度为n-1n-1的线性表的线性表需将第需将第i+1i+1至第至第nn共共(n-i)n-i)个元素前移个元素前移算法VoiddeleteList(Sqlist*L,inti)intj;
if(il.length)printf(“Positionerror”);
returnERRORfor(j=i;
jdatap-data表示表示pp指向结点的数据域指向结点的数据域(*p).link(*p).linkp-linkp-link表示表示pp指向结点的指针域指向结点的指针域线性链表线性链表定义:
结点中只含一个指针域的链表叫定义:
结点中只含一个指针域的链表叫,也叫单链表,也叫单链表typedeflistnode*linklist;
listnode*p;
linklisthead;
注意区分注意区分指针变量指针变量和和结点变量结点变量这两个不同的概念。
这两个不同的概念。
P为动态变量,它是通过标准函数生成的,即为动态变量,它是通过标准函数生成的,即p=(listnode*)malloc(sizeof(listnode);
函数函数malloc分配了一个类型为分配了一个类型为listnode的结点变量的空间,的结点变量的空间,并将其首地址放入指针变量并将其首地址放入指针变量p中。
一旦中。
一旦p所指的结点变量不所指的结点变量不再需要了,又可通过标准函数再需要了,又可通过标准函数free(p)释放所指的结点变量空间。
释放所指的结点变量空间。
指针变量指针变量P(其值为结点地址)和结点变量(其值为结点地址)和结点变量*P之间的关系。
之