顺序表的基本运算
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
一、实验目的:
(1)掌握顺序表存储结构的特点
(2)掌握顺序表的基本运算实现
二、实验内容:
1.构造顺序表List,在List上实现元素的插入、删除(提示:参照教材P23-24算法
2.3,算法
2.4,算法2.5)。
三、实验代码:
#include
#include
#include
//函数结果状态代码
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
typedef int Status; //Status是函数的类型,其值是函数结果状态代码,如OK等
typedef int Boolean; //Boolean 是布尔类型,其值是TURE或FALSE
//线性表的动态分配顺序存储结构
#define LIST_INIT_SIZE 10 //线性表存储空间的初始分配量
#define LIST_INCREMENT 2 //线性表存储空间的分配增量
typedef int ElemType;
struct SqList
{
ElemType *elem; //存储空间基址
int length; //当前长度
int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位)
};
void InitList(SqList&L)
{
L.elem=new ElemType[LIST_INIT_SIZE];
if(!L.elem)
exit(OVERFLOW); //存储分配失败
L.length=0; //空标称度为0
L.listsize=LIST_INIT_SIZE; //初始存储容量
}
Status ListInsert(SqList &L,int i,ElemType e)
{
ElemType *newbase,*q,*p;
if(i<1||i>L.length+1)//i值不合法
return ERROR;
if(L.length>=L.listsize)//当前存储空间已满,增加分配
{
if(!(newbase=(int *)realloc(L.elem,(L.listsize+LIST_INCREMENT)*sizeof(int)))) exit(OVERFLOW);//存储分配失败
L.elem=newbase;//新基址
L.listsize+=LIST_INCREMENT;//增加存储容量
}
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
return OK;
}
Status ListDelete(SqList &L,int i,ElemType &e)
{
ElemType *p,*q;
if(i<1||i>L.length)//i值不合法
return ERROR;
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
return OK;
}
void main()
{
SqList List;
int e;
int i,j;
//初始化顺序表
printf("******************************初始化顺序表******************************\n");
InitList(List);
printf("初始化List后:List.length=%d List.listsize=%d\n",List.length,List.listsize);
//在表头依次插入1~10
printf("\n***************************在表头依次插入1~10***************************\n");
for (i=1;i<=10;i++)
ListInsert(List,1,i);
printf("在List的表头依次插入1~10后,表中的数据元素值为:");
for (i=1;i<=List.length;i++)
printf("%d ",List.elem[i-1]);
printf("\n");
printf("List.length=%d List.listsize=%d\n",List.length,List.listsize);
//继续在表尾插入第11个元素值:11
printf("\n*********************继续在表尾插入第11个元素值:11*********************\n");
ListInsert(List,List.length+1,11);
printf("在表尾插入11后,表中的数据元素值为:");
for (i=1;i<=List.length;i++)
printf("%d ",List.elem[i-1]);
printf("\n");
printf("List.length=%d List.listsize=%d(改变)\n",List.length,List.listsize);
//依次删除表中第12,11个元素和第10个元素
printf("\n*******************依次删除表中第12,11,10个元素*******************\n");
for (i=12;i>=10;i--){
j=ListDelete(List,i,e);
if (j==ERROR)
printf("删除第%d个元素失败\n",i);
else
printf("删除第%d个元素成功,其值为:%d\n",i,e);
}
printf("List.length=%d List.listsize=%d\n",List.length,List.listsize);
}