线性表的基本操作文档格式.docx
《线性表的基本操作文档格式.docx》由会员分享,可在线阅读,更多相关《线性表的基本操作文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
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<
stdio.h>
stdlib.h>
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;
\n输入线性表L:
\n"
for(i=0;
i<
n;
i++)
scanf("
((*L).elem[i]));
//输入线性表元素
}
StatusDestroyList_Sq(SqList*L){
//销毁线性表L。
if((*L).elem)
free((*L).elem);
//释放线性表占据的所有存储空间
}//DestroyList_Sq
StatusClearList_Sq(SqList*L){
//将L重置为空表。
//将线性表的长度置为0
}//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
}//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
}//PriorElem_Sq
StatusNextElem_Sq(SqListL,inti,ElemTypecur_e,ElemType*next_e){
if(i==ListLength_Sq(L)||i>
ListLength_Sq(L))return0;
*next_e=L.elem[i];
//将cur_e的后继赋值给next_e
}//NextElem_Sq
StatusListInsert_Sq(SqList*L,inti,ElemTypee){
//在线性表L中的第i个位置之前插入新的元素e。
ElemType*newbase,*p,*q;
if(i<
(*L).length+1)returnERROR;
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
}//ListInsert_Sq
StatusListDelete_Sq(SqList*L,inti,ElemType*e){
//在线性表L中删除第i个元素,并用e返回其值
ElemType*p,*q;
(*L).length)returnERROR;
//i值不合法
p=&
((*L).elem[i-1]);
//p为被删除元素的位置
*e=*p;
//被删除元素的值赋给e
q=(*L).elem+(*L).length-1;
//表尾元素的位置
for(++p;
p<
++p)
*(p-1)=*p;
//被删除元素之后的元素左移
--(*L).length;
//表长减1
}//ListDelete_Sq
StatusListTraverse_Sq(SqListL,inti){
//线性表L的遍历
线性表为:
"
L.length;
printf("
%4d"
(L.elem[i]));
\n\n"
}//ListTraverse_Sq
voidmain(){
SqListL;
ElemTypee,cur_e,pre_e,next_e;
inti,n,select,t;
InitList_Sq(&
L);
CreateList_Sq(&
do{
1:
判断线性表是否为空\n"
2:
线性表的长度\n"
3:
查询线性表的第i个元素\n"
4:
查找值为e的元素的位置\n"
5:
求数据元素t的前驱\n"
6:
求数据元素t的后继\n"
7:
在线性表第i个位置前插入新元素e\n"
8:
删除线性表第i个元素,返回其值\n"
9:
遍历线性表\n"
10:
清空线性表\n"
0:
结束\n"
select);
switch(select){
case1:
if(ListEmpty_Sq(L))
printf("
线性表为空\n"
else
线性表非空\n"
break;
case2:
ListLength_Sq(L);
printf("
线性表的长度为%d\n"
(L.length));
case3:
\ni="
scanf("
i);
if(GetElem_Sq(L,i,&
e)==ERROR)
printf("
i值不合法\n"
else
第%d个元素的值为%d\n"
i,e);
case4:
printf("
\ne="
e);
i=LocateElem_Sq(L,e);
if(i<
=L.length)
线性表中没有值为%d的元素\n"
e);
case5:
\nt="
t);
if(PriorElem_Sq(L,i,t,&
e)==1)
元素%d的前驱为%d\n\n"
t,e);
元素%d无前驱\n"
t);
case6:
if(NextElem_Sq(L,i,t,&
元素%d的后继为%d\n\n"
元素%d无后继\n"
case7:
\nie="
i,&
if(ListInsert_Sq(&
L,i,e)==ERROR)
i值不合法\n\n"
else{
新的线性表为:
for(i=0;
}break;
case8:
if(ListDelete_Sq(&
L,i,&
被删除的第%d个元素的值为%d\n"
case9:
ListTraverse_Sq(L,i);
case10:
ClearList_Sq(&
清空线性表成功,线性表长度是%d\n\n"
L.length);
case0:
操作结束\n"
default:
输入选择出错!
}
}while(select!
=0);
DestroyList_Sq(&
typedefstructLNode{
ElemTypedate;
structLNode*next;
}LNode,*LinkList;
StatusInitList_L(LinkList*L){
(*L)=(LinkList)malloc(sizeof(LNode));
(*L)->
next=NULL;
StatusCreateList_L(LinkListL){
structLNode*p;
请输入线性表长度n="
\n输入数据:
for(i=n;
i>
0;
i--){
p=(LinkList)malloc(sizeof(LNode));
(*p));
p->
next=L->
next;
L->
next=p;
StatusDestroyList_L(LinkList*L){
if(L)
free(L);
StatusClearList_L(LinkListL){
L->
StatusListEmpty_L(LinkListL){
if(L->
next==NULL)
returnERROR;
StatusListLength_L(LinkListL){
intj;
p=L->
j=1;
while(p){
p=p->
++j;
j--;
returnj;
StatusGetElem_L(LinkListL,inti,ElemType*e){
while(p&
&
j<
i){
p||j>
i)returnERROR;
*e=p->
date;
StatusLocateElem_L(LinkListL,ElemTypee){
p->
date!
=e){
p)returnERROR;
StatusPriorElem_L(LinkListL,ElemTypecur_e,ElemType*pre_e){
inti,j;
i=LocateElem_L(L,cur_e);
i-1){
i-1)returnERROR;
*pre_e=p->
StatusNextElem_L(LinkListL,ElemTypecur_e,ElemType*next_e){
p=L;
j=0;
i+1){
i+1)returnERROR;
*next_e=p->
StatusListInsert_L(LinkListL,inti,ElemTypee){
structLNode*p,*s;
s=(LinkList)malloc(sizeof(LNode));
s->
date=e;
next=p->
next=s;
StatusListDelete_L(LinkListL,inti,ElemType*e){
ElemTypem;
structLNode*p,*q;
while(p->
next&
(p->
next)||j>
q=p->
next=q->
*e=q->
free(q);
StatusListTraverse_L(LinkListL,inti){
%d\n"
p->
date);
p=p->
LinkListL;
inti,j,n,select,t;
ElemTypee,m;
InitList_L(&
CreateList_L(L);
删除线性表第i