实验一++顺序表的建立和基本运算
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一顺序表的建立和基本运算
一、实验目的
1、掌握顺序表存储结构的定义及C/C++语言实现
2、掌握顺序表的各种基本操作及C/C++语言实现
3、设计并实现有序表的遍历、插入、删除等常规算法
二、实验环境
PC微机,Windows,DOS,Turbo C或Visual C++
三、实验内容
1、顺序表的建立和基本运算
(1)问题描述
顺序表经常进行的运算包括:创建顺序表、销毁顺序表、求顺序表的长度、在顺序表中查找某个数据元素、在某个位置插入一个新数据元素、在顺序表中删除某个数据元素等操作。试编程实现顺序表的这些基本运算。
(2)基本要求
实现顺序表的每个运算要求用一个函数实现。
(3)算法描述
参见教材算法2.3、算法2.4、算法2.5等顺序表的常规算法。
(4)算法实现——示例程序
#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是布尔类型,其值是TRUE或FALSE
//-------- 线性表的动态分配顺序存储结构-----------
#define LIST_INIT_SIZE 10 // 线性表存储空间的初始分配量
#define LIST_INCREMENT 2 // 线性表存储空间的分配增量
typedef int ElemType;
struct SqList
{
ElemType *elem; // 存储空间基址
int length; // 当前长度
int listsize; // 当前分配的存储容量(以sizeof(int)为单位)
};
void InitList(SqList &L) // 算法2.3
{ // 操作结果:构造一个空的顺序线性表L
L.elem=new ElemType[LIST_INIT_SIZE];
if(!L.elem)
exit(OVERFLOW); // 存储分配失败
L.length=0; // 空表长度为0
L.listsize=LIST_INIT_SIZE; // 初始存储容量
}
void DestroyList(SqList &L)
{ // 初始条件:顺序线性表L已存在。操作结果:销毁顺序线性表L
delete []L.elem;
L.elem=NULL;
L.length=0;
L.listsize=0;
}
void ClearList(SqList &L)
{ // 初始条件:顺序线性表L已存在。操作结果:将L重置为空表
L.length=0;
}
Status ListEmpty(SqList L)
{ // 初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE
if(L.length==0)
return TRUE;
else
return FALSE;
}
int ListLength(SqList L)
{ // 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数
return L.length;
}
Status GetElem(SqList L,int i,ElemType &e)
{ // 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)。操作结果:用e返回L中第i个数据元素的值
if(i<1||i>L.length)
return ERROR;
e=*(L.elem+i-1);
return OK;
}
//int LocateElem(SqList L,int e,Status(*compare)(int,int))
int LocateElem(SqList L,ElemType e, Status(*compare)(ElemType,ElemType))
{//初始条件:顺序线性表L已存在,compare( )是数据元素判定函数(满足为1,否则为0) // 操作结果:返回L中第1个与e满足关系compare( )的数据元素的位序。
// 若这样的数据元素不存在,则返回值为0。算法2.6
ElemType *p;
int i=1; // i的初值为第1个元素的位序
p=L.elem; // p的初值为第1个元素的存储位置
while(i<=L.length&&!compare(*p++,e))
++i;
if(i<=L.length)
return i;
else
return 0;
}
Status PriorElem(SqList L,ElemType cur_e,ElemType &pre_e)
{ // 初始条件:顺序线性表L已存在
// 操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,// 否则操作失败,pre_e无定义
int i=2;
ElemType *p=L.elem+1;
while(i<=L.length&&*p!=cur_e){
p++;
i++;
}
if(i>L.length)
return INFEASIBLE; // 操作失败
else{
pre_e=*--p;
return OK;
}
}
Status NextElem(SqList L,ElemType cur_e,ElemType &next_e)
{ // 初始条件:顺序线性表L已存在
// 操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,// 否则操作失败,next_e无定义
int i=1;
ElemType *p=L.elem;