线性表的基本操作.docx

上传人:b****6 文档编号:6047041 上传时间:2023-01-03 格式:DOCX 页数:18 大小:74.65KB
下载 相关 举报
线性表的基本操作.docx_第1页
第1页 / 共18页
线性表的基本操作.docx_第2页
第2页 / 共18页
线性表的基本操作.docx_第3页
第3页 / 共18页
线性表的基本操作.docx_第4页
第4页 / 共18页
线性表的基本操作.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

线性表的基本操作.docx

《线性表的基本操作.docx》由会员分享,可在线阅读,更多相关《线性表的基本操作.docx(18页珍藏版)》请在冰豆网上搜索。

线性表的基本操作.docx

线性表的基本操作

数据结构实验报告

2011

4

13

1.项目组成

2.程序结构图

main

题目一:

 

ClearList_Sq

ListEmpty_Sq

CreateList_Sq

ListInsert_Sq

GetElem_Sq

NextElem_Sq

PriorElem_Sq

ListLength_Sq

DestroyList_Sq

LocateElem_Sq

ListTraverse_Sq

ListDelete_Sq

InitList_Sq

 

题目二:

main

ListInsert_L

CreateList_L

ClearList_L

ListEmpty_L

InitList_L

DestroyList_L

ListLength_L

NextElem_L

LocateElem_L

PriorElem_L

GetElem_L

 

ListTraverse_L

ListDelete_L

 

3.算法及其功能函数

题目一:

InitList_Sq(SqList*L)/*创建线性表*/

CreateList_Sq(SqList*L)/*输入线性表中元素*/

DestroyList_Sq(SqList*L)/*销毁线性表*/

ClearList_Sq(SqList*L)/*清空线性表*/

ListEmpty_Sq(SqListL)/*判断是否为空*/

ListLength_Sq(SqListL)/*求线性表长度*/

GetElem_Sq(SqListL,inti,ElemType*e)/*取第i个元素并用e返回*/

LocateElem_Sq(SqListL,inte)/*判断e在表中位置*/

PriorElem_Sq(SqListL,inti,ElemTypecur_e,ElemType*pre_e)/*取前驱*/

NextElem_Sq(SqListL,inti,ElemTypecur_e,ElemType*next_e)/*取后继*/

ListInsert_Sq(SqList*L,inti,ElemTypee)/*在第i个元素前插入e*/

ListDelete_Sq(SqList*L,inti,ElemType*e)/*删除第i个元素*/

ListTraverse_Sq(SqListL,inti)/*遍历线性表*/

题目二:

InitList_L(LinkList*L)/*创建线性表*/

CreateList_L(LinkList*L)/*输入线性表中元素*/

DestroyList_L(LinkList*L)/*销毁线性表*/

ClearList_L(LinkList*L)/*清空线性表*/

ListEmpty_L(LinkListL)/*判断是否为空*/

ListLength_L(LinkListL)/*求线性表长度*/

GetElem_L(LinkListL,inti,ElemType*e)/*取第i个元素并用e返回*/

LocateElem_L(LinkListL,inte)/*判断e在表中位置*/

PriorElem_L(LinkListL,inti,ElemTypecur_e,ElemType*pre_e)/*取前驱*/

NextElem_L(LinkListL,inti,ElemTypecur_e,ElemType*next_e)/*取后继*/

ListInsert_L(LinkList*L,inti,ElemTypee)/*在第i个元素前插入e*/

ListDelete_L(LinkList*L,inti,ElemType*e)/*删除第i个元素*/

ListTraverse_L(LinkListL,inti)/*遍历线性表*/

 

4.源代码

题目一:

#include

#include

typedefintElemType;

typedefintStatus;

#defineOK1

#defineERROR0

#defineTRUE1

#defineFALSE0

#defineOVERFLOW-2

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

#defineLISTINCREMENT10//线性表空间的分配增量

typedefstruct{

ElemType*elem;//存储空间基址

intlength;//当前长度

intlistsize;//当前分配的存储容量(以sizeof(ElemType)为单位)

}SqList;

StatusInitList_Sq(SqList*L){

//构造一个空的线性表L。

(*L).elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));

if(!

(*L).elem)exit(OVERFLOW);//存储空间失败

(*L).length=0;//空表长度为0

(*L).listsize=LIST_INIT_SIZE;//初始存储容量

returnOK;

}//InitList_Sq

StatusCreateList_Sq(SqList*L){

inti,n;

printf("请输入线性表长度\nn=");

scanf("%d",&n);

(*L).length=n;

printf("\n输入线性表L:

\n");

for(i=0;i

scanf("%d",&((*L).elem[i]));//输入线性表元素

returnOK;

}

StatusDestroyList_Sq(SqList*L){

//销毁线性表L。

if((*L).elem)

free((*L).elem);//释放线性表占据的所有存储空间

returnOK;

}//DestroyList_Sq

StatusClearList_Sq(SqList*L){

//将L重置为空表。

(*L).length=0;//将线性表的长度置为0

returnOK;

}//ClearList_Sq

StatusListEmpty_Sq(SqListL){

//线性表判空。

if(L.length==0)

returnTRUE;//若L为空,则返回TURE

else

returnFALSE;//若L不为空,则返回FALSE

}//ListEmpty_Sq

StatusListLength_Sq(SqListL){

//返回线性表的长度。

return(L.length);

}//ListLength_Sq

StatusGetElem_Sq(SqListL,inti,ElemType*e){

//用e返回L中的第i个数据元素的值。

if(i<1||i>L.length)returnERROR;//i值不合法

*e=L.elem[i-1];//将第i个数据元素的值赋给e

returnOK;

}//GetElem_Sq

StatusLocateElem_Sq(SqListL,inte){

inti;

for(i=1;i<=L.length;i++)

{if(L.elem[i-1]==e)

returni;

}

}

StatusPriorElem_Sq(SqListL,inti,ElemTypecur_e,ElemType*pre_e){

i=LocateElem_Sq(L,cur_e);

if(i==1||i>ListLength_Sq(L))return0;

*pre_e=L.elem[i-2];//将cur_e的前驱赋值给pre_e

returnOK;

}//PriorElem_Sq

StatusNextElem_Sq(SqListL,inti,ElemTypecur_e,ElemType*next_e){

i=LocateElem_Sq(L,cur_e);

if(i==ListLength_Sq(L)||i>ListLength_Sq(L))return0;

*next_e=L.elem[i];//将cur_e的后继赋值给next_e

returnOK;

}//NextElem_Sq

StatusListInsert_Sq(SqList*L,inti,ElemTypee){

//在线性表L中的第i个位置之前插入新的元素e。

ElemType*newbase,*p,*q;

if(i<1||i>(*L).length+1)returnERROR;//i值不合法

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;//新基址

}

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){

//在线性表L中删除第i个元素,并用e返回其值

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

StatusListTraverse_Sq(SqListL,inti){

//线性表L的遍历

printf("线性表为:

");

for(i=0;i

printf("%4d",(L.elem[i]));

printf("\n\n");

returnOK;

}//ListTraverse_Sq

voidmain(){

SqListL;

ElemTypee,cur_e,pre_e,next_e;

inti,n,select,t;

InitList_Sq(&L);

CreateList_Sq(&L);

printf("\n");

do{

printf("1:

判断线性表是否为空\n");

printf("2:

线性表的长度\n");

printf("3:

查询线性表的第i个元素\n");

printf("4:

查找值为e的元素的位置\n");

printf("5:

求数据元素t的前驱\n");

printf("6:

求数据元素t的后继\n");

printf("7:

在线性表第i个位置前插入新元素e\n");

printf("8:

删除线性表第i个元素,返回其值\n");

printf("9:

遍历线性表\n");

printf("10:

清空线性表\n");

printf("0:

结束\n");

scanf("%d",&select);

switch(select){

case1:

if(ListEmpty_Sq(L))

printf("线性表为空\n");

else

printf("线性表非空\n");break;

case2:

ListLength_Sq(L);

printf("线性表的长度为%d\n",(L.length));break;

case3:

printf("\ni=");

scanf("%d",&i);

if(GetElem_Sq(L,i,&e)==ERROR)

printf("i值不合法\n");

else

printf("第%d个元素的值为%d\n",i,e);break;

case4:

printf("\ne=");

scanf("%d",&e);

i=LocateElem_Sq(L,e);

if(i<=L.length)

printf("第%d个元素的值为%d\n",i,e);

else

printf("线性表中没有值为%d的元素\n",e);break;

case5:

printf("\nt=");

scanf("%d",&t);

if(PriorElem_Sq(L,i,t,&e)==1)

printf("元素%d的前驱为%d\n\n",t,e);

else

printf("元素%d无前驱\n",t);break;

case6:

printf("\nt=");

scanf("%d",&t);

if(NextElem_Sq(L,i,t,&e)==1)

printf("元素%d的后继为%d\n\n",t,e);

else

printf("元素%d无后继\n",t);break;

case7:

printf("\nie=");

scanf("%d",&i,&e);

printf("\ne=");

scanf("%d",&e);

if(ListInsert_Sq(&L,i,e)==ERROR)

printf("i值不合法\n\n");

else{

printf("新的线性表为:

");

for(i=0;i

printf("%4d",(L.elem[i]));

printf("\n\n");}break;

case8:

printf("\ni=");

scanf("%d",&i);

if(ListDelete_Sq(&L,i,&e)==ERROR)

printf("i值不合法\n\n");

else{

printf("被删除的第%d个元素的值为%d\n",i,e);

printf("新的线性表为:

");

for(i=0;i

printf("%4d",(L.elem[i]));

printf("\n\n");}break;

case9:

ListTraverse_Sq(L,i);break;

case10:

ClearList_Sq(&L);

printf("清空线性表成功,线性表长度是%d\n\n",L.length);break;

case0:

printf("操作结束\n");break;

default:

printf("输入选择出错!

\n");

}

}while(select!

=0);

DestroyList_Sq(&L);

}

题目二:

#include

#include

typedefintElemType;

typedefintStatus;

#defineOK1

#defineERROR0

#defineTRUE1

#defineFALSE0

#defineOVERFLOW-2

typedefstructLNode{

ElemTypedate;

structLNode*next;

}LNode,*LinkList;

StatusInitList_L(LinkList*L){

(*L)=(LinkList)malloc(sizeof(LNode));

(*L)->next=NULL;

returnOK;

}

StatusCreateList_L(LinkListL){

inti,n;

structLNode*p;

printf("请输入线性表长度n=");

scanf("%d",&n);

printf("\n输入数据:

\n");

for(i=n;i>0;i--){

p=(LinkList)malloc(sizeof(LNode));

scanf("%d",&(*p));

p->next=L->next;L->next=p;

}

returnOK;

}

StatusDestroyList_L(LinkList*L){

if(L)

free(L);

returnOK;

}

StatusClearList_L(LinkListL){

L->next=NULL;

returnOK;

}

StatusListEmpty_L(LinkListL){

if(L->next==NULL)

returnOK;

else

returnERROR;

}

StatusListLength_L(LinkListL){

intj;

structLNode*p;

p=L->next;j=1;

while(p){

p=p->next;++j;

}

j--;

returnj;

}

StatusGetElem_L(LinkListL,inti,ElemType*e){

intj;

structLNode*p;

p=L->next;j=1;

while(p&&j

p=p->next;++j;

}

if(!

p||j>i)returnERROR;

*e=p->date;

returnOK;

}

StatusLocateElem_L(LinkListL,ElemTypee){

intj;

structLNode*p;

p=L->next;j=1;

while(p&&p->date!

=e){

p=p->next;++j;

}

if(!

p)returnERROR;

returnj;

}

StatusPriorElem_L(LinkListL,ElemTypecur_e,ElemType*pre_e){

inti,j;

structLNode*p;

i=LocateElem_L(L,cur_e);

p=L->next;j=1;

while(p&&j

p=p->next;++j;

}

if(!

p||j>i-1)returnERROR;

*pre_e=p->date;

returnOK;

}

StatusNextElem_L(LinkListL,ElemTypecur_e,ElemType*next_e){

inti,j;

structLNode*p;

i=LocateElem_L(L,cur_e);

p=L;j=0;

while(p&&j

p=p->next;++j;

}

if(!

p||j>i+1)returnERROR;

*next_e=p->date;

returnOK;

}

StatusListInsert_L(LinkListL,inti,ElemTypee){

intj;

structLNode*p,*s;

p=L;j=0;

while(p&&j

p=p->next;++j;

}

if(!

p||j>i-1)returnERROR;

s=(LinkList)malloc(sizeof(LNode));

s->date=e;

s->next=p->next;

p->next=s;

returnOK;

}

StatusListDelete_L(LinkListL,inti,ElemType*e){

intj;ElemTypem;

structLNode*p,*q;

p=L;j=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->date;

free(q);

returnOK;

}

StatusListTraverse_L(LinkListL,inti){

structLNode*p;

printf("线性表为:

\n");

p=L->next;

while(p){

printf("%d\n",p->date);

p=p->next;

}

printf("\n");

returnOK;

}

voidmain(){

LinkListL;

inti,j,n,select,t;

ElemTypee,m;

structLNode*p,*q;

InitList_L(&L);

CreateList_L(L);

printf("\n");

do{

printf("1:

判断线性表是否为空\n");

printf("2:

线性表的长度\n");

printf("3:

查询线性表的第i个元素\n");

printf("4:

查找值为e的元素的位置\n");

printf("5:

求数据元素t的前驱\n");

printf("6:

求数据元素t的后继\n");

printf("7:

在线性表第i个位置前插入新元素e\n");

printf("8:

删除线性表第i

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1