线性表的基本操作.docx
《线性表的基本操作.docx》由会员分享,可在线阅读,更多相关《线性表的基本操作.docx(18页珍藏版)》请在冰豆网上搜索。
![线性表的基本操作.docx](https://file1.bdocx.com/fileroot1/2023-1/3/35daae54-81da-49e9-9a98-9d605b2ddbb6/35daae54-81da-49e9-9a98-9d605b2ddbb61.gif)
线性表的基本操作
数据结构实验报告
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;iscanf("%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;iprintf("%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;iprintf("%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;iprintf("%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&&jp=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&&jp=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&&jp=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