#线性表基本操作的实现.docx
- 文档编号:10610361
- 上传时间:2023-02-21
- 格式:DOCX
- 页数:20
- 大小:39.82KB
#线性表基本操作的实现.docx
《#线性表基本操作的实现.docx》由会员分享,可在线阅读,更多相关《#线性表基本操作的实现.docx(20页珍藏版)》请在冰豆网上搜索。
#线性表基本操作的实现
实验一线性表基本操作的实现
姓名:
李荣宏座号4209_级本科__计算机科学与技专业1__班
日期:
2010/10/15
【实验课程名称】数据结构
【实验项目名称】线性表基本操作的实现
【实验目的】
1掌握线性表顺序存储基本操作;
2掌握线性表链式存储基本操作;
3学会设计实验数据验证程序。
【实验仪器及环境】计算机,windowxp操作系统,VC++6.0
【实验内容及步骤】
1.线性表顺序存储基本操作
存储结构定义:
#defineLIST_INIT_SIZE100//线性表存储空间的初始分配量
#defineLISTINCREMENT10//线性表存储空间的分配增量
typedefstruct{
ElemType*elem;//存储空间基址
intlength;//当前长度
intlistsize;//当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;
实现的基本操作:
InitList(&L)
操作结果:
构造一个空的线性表L。
DestroyList(&L)
初始条件:
线性表L已存在。
操作结果:
销毁线性表L。
ListEmpty(L)
初始条件:
线性表L已存在。
操作结果:
若L为空表,则返回TRUE,否则返回FALSE。
ListLength(L)
初始条件:
线性表L已存在。
操作结果:
返回L中元素个数。
PriorElem(L,cur_e,&pre_e)
初始条件:
线性表L已存在。
操作结果:
若cur_e是L中的数据元素,则用pre_e返回它的前驱,否则操作失败,pre_e无定义。
NextElem(L,cur_e,&next_e)
初始条件:
线性表L已存在。
操作结果:
若cur_e是L中的数据元素,则用next_e返回它的后继,否则操作失败,next_e无定义。
GetElem(L,i,&e)
初始条件:
线性表L已存在,1≤i≤LengthList(L)。
操作结果:
用e返回L中第i个元素的值。
LocateElem(L,e,compare())
初始条件:
线性表L已存在,compare()是元素判定函数。
操作结果:
返回L中第1个与e满足关系compare()的元素的位序。
若这样的元素不存在,则返回值为0。
ListTraverse(L,visit())
初始条件:
线性表L已存在,visit()为元素的访问函数。
操作结果:
依次对L的每个元素调用函数visit()。
一旦visit()失败,则操作失败。
ClearList(&L)
初始条件:
线性表L已存在。
操作结果:
将L重置为空表。
PutElem(&L,i,&e)
初始条件:
线性表L已存在,1≤i≤LengthList(L)。
操作结果:
L中第i个元素赋值同e的值。
ListInsert(&L,i,e)
初始条件:
线性表L已存在,1≤i≤LengthList(L)+1。
操作结果:
在L的第i个元素之前插入新的元素e,L的长度增1。
ListDelete(&L,i,&e)
初始条件:
线性表L已存在且非空,1≤i≤LengthList(L)。
操作结果:
删除L的第i个元素,并用e返回其值,L的长度减1。
#include
usingnamespacestd;
#include
#include
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
typedefintStatus;
typedefintElemType;
#defineLIST_INIT_SIZE100//线性表存储空间的初始分配量
#defineLISTINCREMENT10//线性表存储空间的分配增量
typedefstruct{
ElemType*elem;//存储空间基址
intlength;//当前长度
intlistsize;//当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;
StatusInitList_Sq(SqList&L);
StatusListInsert_Sq(SqList&L,inti,ElemTypee);
StatusListDelete_Sq(SqList&L,inti,ElemType&e);
intLocateElem_Sq(SqListL,ElemTypee,
Status(*compare)(ElemType,ElemType));
voidMergeList_Sq(SqListLa,SqListLb,SqList&Lc);
intdeng(ElemTypex,ElemTypey)
{if(x==y)return1;elsereturn0;}
StatusInitList_Sq(SqList&L){//算法2.3
//构造一个空的线性表L。
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!
L.elem)returnOK;//存储分配失败
L.length=0;//空表长度为0
L.listsize=LIST_INIT_SIZE;//初始存储容量
returnOK;
}//InitList_Sq
StatusListInsert_Sq(SqList&L,inti,ElemTypee){//算法2.4
//在顺序线性表L的第i个元素之前插入新的元素e,
//i的合法值为1≤i≤ListLength_Sq(L)+1
ElemType*p;
if(i<1||i>L.length+1)returnERROR;//i值不合法
if(L.length>=L.listsize){//当前存储空间已满,增加容量
ElemType*newbase=(ElemType*)realloc(L.elem,
(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!
newbase)returnERROR;//存储分配失败
L.elem=newbase;//新基址
L.listsize+=LISTINCREMENT;//增加存储容量
}
ElemType*q=&(L.elem[i-1]);//q为插入位置
for(p=&(L.elem[L.length-1]);p>=q;--p)*(p+1)=*p;
//插入位置及之后的元素右移
*q=e;//插入e
++L.length;//表长增1
returnOK;
}//ListInsert_Sq
StatusListDelete_Sq(SqList&L,inti,ElemType&e){//算法2.5
//在顺序线性表L中删除第i个元素,并用e返回其值。
//i的合法值为1≤i≤ListLength_Sq(L)。
ElemType*p,*q;
if(i<1||i>L.length)returnERROR;//i值不合法
p=&(L.elem[i-1]);//p为被删除元素的位置
e=*p;//被删除元素的值赋给e
q=L.elem+L.length-1;//表尾元素的位置
for(++p;p<=q;++p)*(p-1)=*p;//被删除元素之后的元素左移
--L.length;//表长减1
returnOK;
}//ListDelete_Sq
intLocateElem_Sq(SqListL,ElemTypee,
Status(*compare)(ElemType,ElemType)){//算法2.6
//在顺序线性表L中查找第1个值与e满足compare()的元素的位序。
//若找到,则返回其在L中的位序,否则返回0。
inti;
ElemType*p;
i=1;//i的初值为第1个元素的位序
p=L.elem;//p的初值为第1个元素的存储位置
while(i<=L.length&&!
(*compare)(*p++,e))
++i;
if(i<=L.length)returni;
elsereturn0;
}//LocateElem_Sq
voidTraverse(SqListL){
//逐个输出顺序线性表L的元素。
for(inti=0;i cout< } voidMergeList_Sq(SqListLa,SqListLb,SqList&Lc){//算法2.7 //已知顺序线性表La和Lb的元素按值非递减排列。 //归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排列。 ElemType*pa,*pb,*pc,*pa_last,*pb_last; pa=La.elem;pb=Lb.elem; Lc.listsize=Lc.length=La.length+Lb.length; pc=Lc.elem=(ElemType*)malloc(Lc.listsize*sizeof(ElemType)); if(! Lc.elem) exit(OVERFLOW);//存储分配失败 pa_last=La.elem+La.length-1; pb_last=Lb.elem+Lb.length-1; while(pa<=pa_last&&pb<=pb_last){//归并 if(*pa<=*pb)*pc++=*pa++; else*pc++=*pb++; } while(pa<=pa_last)*pc++=*pa++;//插入La的剩余元素 while(pb<=pb_last)*pc++=*pb++;//插入Lb的剩余元素 }//MergeList voidDestroylist(SqList&L) {if(L.elem)free(L.elem);}//破坏线性表 voidlistempty(SqList&L) {L.length=0;}//清空线性表 StatusPriorelem(SqListL,ElemTypecur_e,ElemType&pre_e) { inti; for(i=1;i<=L.length;i++) {if(L.elem[i]==cur_e)//取直接前驱 pre_e=L.elem[i-1]; } returnpre_e; } StatusNextelem(SqListL,ElemTypecur_e,ElemType&next_e) {inti; for(i=0;i {if(L.elem[i]==cur_e) next_e=L.elem[i+1]; } returnnext_e; //取直接后继 } voidListlength(SqListL) { cout< StatusGetelem(SqListL,inti,ElemType&e) {if(i>=1&&i<=L.length) e=L.elem[i]; returne; }//获取第i个元素 voidmain(){ SqListLa,Lb,Lc,Ld;int(*com)(ElemType,ElemType);ElemTypee,pre_e,next_e; InitList_Sq(La); InitList_Sq(Lb); InitList_Sq(Lc); InitList_Sq(Ld);//构造4个线性表 for(inti=1;i<=10;i++){ ListInsert_Sq(La,i,i*2); ListInsert_Sq(Lb,i,i*3); ListInsert_Sq(Ld,i,i*4);//在a,b,d三个表中插入元素 } com=deng;printf("dex=%d",LocateElem_Sq(La,4,com)); cout<<"\n"<<"La: "; Traverse(La); cout<<"\n"<<"Lb: "; Traverse(Lb); cout<<"\n"<<"ld"; Traverse(Ld); MergeList_Sq(La,Lb,Lc);//合并Lb和La cout<<"\n"<<"Lc: "; Traverse(Lc);ListDelete_Sq(Lc,5,e);cout<<"\n"<<"Lc: ";Traverse(Lc);cout< // cout<<"prioreis"< cout<<"nextelemis"< cout<<"Ld.elem[3]="< cout<<"Ld";Listlength(Ld);//输出当前Ld表长 }【测试数据及实验结果】 2.线性表链式存储基本操作 存储结构定义: typedefstructLNode{ ElemTypedata; structLNode*next; }LNode,*LinkList; 实现的基本操作: InitList(&L) 操作结果: 构造一个空的线性表L。 DestroyList(&L) 初始条件: 线性表L已存在。 操作结果: 销毁线性表L。 ListEmpty(L) 初始条件: 线性表L已存在。 操作结果: 若L为空表,则返回TRUE,否则返回FALSE。 ListLength(L) 初始条件: 线性表L已存在。 操作结果: 返回L中元素个数。 PriorElem(L,cur_e,&pre_e) 初始条件: 线性表L已存在。 操作结果: 若cur_e是L中的数据元素,则用pre_e返回它的前驱,否则操作失败,pre_e无定义。 NextElem(L,cur_e,&next_e) 初始条件: 线性表L已存在。 操作结果: 若cur_e是L中的数据元素,则用next_e返回它的后继,否则操作失败,next_e无定义。 GetElem(L,i,&e) 初始条件: 线性表L已存在,1≤i≤LengthList(L)。 操作结果: 用e返回L中第i个元素的值。 LocateElem(L,e,compare()) 初始条件: 线性表L已存在,compare()是元素判定函数。 操作结果: 返回L中第1个与e满足关系compare()的元素的位序。 若这样的元素不存在,则返回值为0。 ListTraverse(L,visit()) 初始条件: 线性表L已存在,visit()为元素的访问函数。 操作结果: 依次对L的每个元素调用函数visit()。 一旦visit()失败,则操作失败。 ClearList(&L) 初始条件: 线性表L已存在。 操作结果: 将L重置为空表。 PutElem(&L,i,&e) 初始条件: 线性表L已存在,1≤i≤LengthList(L)。 操作结果: L中第i个元素赋值同e的值。 ListInsert(&L,i,e) 初始条件: 线性表L已存在,1≤i≤LengthList(L)+1。 操作结果: 在L的第i个元素之前插入新的元素e,L的长度增1。 ListDelete(&L,i,&e) 初始条件: 线性表L已存在且非空,1≤i≤LengthList(L)。 操作结果: 删除L的第i个元素,并用e返回其值,L的长度减1。 #include usingnamespacestd; #include #include #defineTRUE1 #defineFALSE0 #defineOK1 #defineERROR0 #defineINFEASIBLE-1 #defineOVERFLOW-2 typedefintStatus; typedefintElemType;typedefstructLNode{ ElemTypedata; structLNode*next; }LNode,*Linklist; //建立一个带头结点的空线性链表L StatusInitlist(Linklist&L) { L=(Linklist)malloc(sizeof(LNode));//生成新结点 if(! L)returnERROR;//存储分配失败 elseL->next=NULL; }//InitList StatusListInsert(Linklist&L,inti,ElemTypee){ //在带头结点的单链线性表L的第i个元素之前插入元素e Linklistp,s; p=L; intj=0; while(p&&j p=p->next; ++j; } if(! p||j>i-1)returnERROR;//i小于1或者大于表长 s=(Linklist)malloc(sizeof(LNode));//生成新结点 s->data=e;s->next=p->next;//插入L中 p->next=s; returnOK; }//LinstInsert_L StatusListDelete(Linklist&L,inti,ElemType&e){ //在带头结点的单链线性表L中,删除第i个元素,并由e返回其值 Linklistp,q; p=L; intj=0; while(p->next&&j p=p->next; ++j; } if(! (p->next)||j>i-1)returnERROR;//删除位置不合理 q=p->next; p->next=q->next;//删除并释放结点 e=q->data; free(q); returnOK; }//ListDelete_L voidMergeList(Linklist&La,Linklist&Lb,Linklist&Lc){ //已知单链线性表La和Lb的元素按值非递减排列。 //归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列。 Linklistpa,pb,pc; pa=La->next;pb=Lb->next; Lc=pc=La;//用La的头结点作为Lc的头结点 while(pa&&pb){ if(pa->data<=pb->data){ pc->next=pa;pc=pa;pa=pa->next; } else{pc->next=pb;pc=pb;pb=pb->next;} } pc->next=pa? pa: pb;//插入剩余段 free(Lb);//释放Lb的头结点 }//MergeList_L StatusListlength(LinklistL)//输出表长 { Linklistp=L->next; inti=0; while(p) { p=p->next; i++; } cout<<"listlength="< returni; } StatusPriorelem(LinklistL,ElemTypecur_e,ElemType&pri_e)//取直接前驱 { inti; Linklistq=L->next; intL_length=Listlength(L); for(i=1;i<=L_length;i++) { if(q->next->data==cur_e)pri_e=q->data; elseq=q->next; } returnpri_e; } StatusNextelem(LinklistL,ElemTypecur_e,ElemType&next_e)//取直接后继 { inti; Linklistq=L; intL_length=Listlength(L); for(i=0;i { if(q->data==cur_e)next_e=q->next->data; elseq=q->next; } return0; voidListempty(LinklistL)//滞空线性链表 { if(L->next)L->next=NU
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 线性 基本 操作 实现