实验1(1) 线性表-顺序表及其应用-16
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一线性表
班级: 姓名: 学号:
一、实验目的
1.掌握线性表的顺序存储结构的含义;
2.掌握动态内存分配方式和顺序表的类型定义;
3.掌握顺序表的基本操作的实现算法;
4.通过上机实践加强利用数据结构解决实际问题的能力。
二、实验要求
1.实验前做好充分准备,包括复习第一章、第二章所学内容,事先预习好本次实验内容;
2.实验时记录实验结果,按要求完成各题;
3.实验结束后,给出实验总结与分析并及时给出本次实验的实验报告。
三、实验题目与要求
1.实验题目一:顺序表的类型定义及其相关操作算法的实现
要求:编程实现顺序表的类型定义及顺序表的初始化操作、插入操作、删除操作、取元素操作、输出操作等,并对其进行验证。
2.实验题目二:顺序表的应用实例
结合课上讲过的顺序表的逆向删除操作的例子以及顺序表的逆置问题,编程实现。
四、实验内容
本指导书所给出的示例程序均为DEV C++环境下完成的,若使用其它C开发环境,则部分语句要进行少许修改。
1.实验题目一:顺序表的类型定义及其相关操作算法的实现
#include "stdio.h"
#include "stdlib.h"
//预定义常量及类型
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0
typedef int Status;
//顺序表类型及其基本操作函数的定义
#define ListSpaceIncr 20
typedef int LElemType;
typedef struct SqList
{ LElemType *base;
int length;
int listSize;
}SqList; //SqList类型为顺序表类型
Status initList(SqList &L, int initSize)
//初始化操作函数定义
{
L.base=(LElemType*)malloc(InitSize*sizeof(LEl emType));//申请初始指定大小的存储空间
if(!L.base) return(OVERFLOW);
L.length=0;
L.listSize=InitSize;
return OK;
}
Status listInsert(SqList &L, int i, LElemType e){
//顺序表的插入操作
LElemType *newBase;
int j;
if(i<1||i>L.length+1) return ERROR;
if( L.length==L.listSize){
//补齐代码,若存储空间已满,则追加存储空间
newBase=(LElemType*)realloc(L.base,
(L.listSize+ListSpaceIncr)*sizeof(LElemType) );
if(!newBase) return OVERFLOW;
L.base=newBase;
L.listSize+=ListSpaceIncr;
}
for(j= L.length-1; j>= i-1 ; j--)
L.base[j+1]=L.base[j];
L.base[i-1]=e;
L.length++;
return OK;
}
Status listDelete(SqList &L, int i, LElemType &e){ //顺序表的删除操作
int j;
if(i<1||i>L.length) return ERROR;
e=L.base[i-1];
for(j= i ; j< L.length; j++)
L.base[j-1]=L.base[j];
L.length--;
return OK;
}
void listOutput(SqList L) //顺序表输出操作
{
int i;
for(i=0;i printf("%d ",L.base[i]); printf("\n"); } int main() { SqList La; int i,e; initList(La,100); for (i=0;i<5;i++) listInsert(La,i+1,2*i); listOutput(La); listInsert(La,1,999); listOutput(La); listInsert(La,4,888); listOutput(La); listInsert(La,La.length+1,111); listOutput(La); listDelete(La,3,e); listOutput(La); listDelete(La,1,e); listOutput(La); system("pause"); return 0; } 程序运行结果: 2.实验题目二:顺序表的应用实例 (1)设顺序表L中的数据元素为数值类型,下述算法用来实现删除顺序表L中所有值在[x, y]之间的元素。 void deleteElem(SqList &L, LElemType x, LElemType y){ //删除顺序表L中所有值在区间[x, y]内的元素 int i=0, j=0; while(i if( !(L.base[i]>=x&&L.base[i]<=y )){ L. base [j]=L. base [i]; j++ ; } i++; } L.length= j; } 任务:补齐上述算法中的代码,然后编写主函数实现上述算法。(提示:首先创建一个长度为n的顺序表,向顺序表中输入n个元素,然后调用deleteElem算法删除掉给定区间的元素,最后再输出顺序表L,看是否删除成功!) #include "stdio.h" #include "stdlib.h" typedef int Status; //顺序表类型及其基本操作函数的定义#define ListSpaceIncr 20 typedef int LElemType; typedef struct { LElemType *base; int length; int listsize; } SqList; void deleteElem(SqList &L, LElemType x, LElemType y){ //删除顺序表L中所有值在区间[x, y]内的元素 int i=0, j=0; while(i if( !(L.base[i]>=x&&L.base[i]<=y)){ L. base [j]=L. base [i]; j++ ; } i++; } L.length= j; } //任务:补齐上述算法中的代码,然后编写主函数实现上述算法。(提示:首先创建一个长度为n的顺序表,向顺序表中输入n个元素,然后调用deleteElem 算法删除掉给定区间的元素,最后再输出顺序表L,看是否删除成功!) int main() { int n,x,y; SqList La;