顺序表的基本运算

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验报告

一、实验目的:

(1)掌握顺序表存储结构的特点

(2)掌握顺序表的基本运算实现

二、实验内容:

1.构造顺序表List,在List上实现元素的插入、删除(提示:参照教材P23-24算法

2.3,算法

2.4,算法2.5)。

三、实验代码:

#include//malloc()等

#include//NULL,printf()等

#include //exit()等

//函数结果状态代码

#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);

}

相关文档
最新文档