实验一-顺序表的设计与实现

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

实验一顺序表的设计与实现

一.实验目的

1.进一步熟悉VC环境,会在其中编写调试运行c++代码,并理解多文件项目的组织,为以后的实验编程做准备。

2.掌握在VC环境中进行代码的调试

3.掌握顺序表的设计过程,并能通过一实例对设计的顺序表进行测试。

二、实验内容

1.顺序表的设计(Sqlist.h):设计头文件sqlist.h,其内容如下:

①类型设计

②基本操作的设计(包括初始化、求数据元素个数、插入、删除、取数据元素等)

(补充完整)

#define LIST_INIT_SIZE 10

#define LIST_INCREMENT 2

//线性表的动态分配顺序存储结构

struct SqList

{

ElemType *elem;

int length;

int listsize;

};

//顺序表的初始化

void InitList(SqList &L)

{

//动态分配存储空间,并将分配到的存储空间的首地址保持在顺序表的elem项中

L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));

if(!L.elem)

exit(OVERFLOW);

//将顺序表的长度初始化为0

L.length=0;

//将顺序表的容量初始化为分配的空间数

L.listsize=LIST_INIT_SIZE;

}

//在线性表的第i个位置上插入数据元素e

Status ListInsert(SqList &L,int i,ElemType e)

{

ElemType *newbase,*q,*p;

//判断插入的位置是否合理,不合理则返回错误信息

if(i<1||i>L.length+1)

return ERROR;

//判断是否有足够的空间插入元素,空间不够则增补空间

if(L.length==L.listsize)

{

newbase=(ElemType*)realloc(L.elem,(L.listsize+LIST_INCREMENT)*sizeof(ElemType ));

if(!newbase)

exit(OVERFLOW);

L.elem=newbase;

L.listsize+=LIST_INCREMENT;

}

//插入数据元素(先将第i个元素及其后所有元素后移一个位置)

q=L.elem+i-1;

for(p=L.elem+L.length-1;p>=q;--p)

*(p+1)=*p;

//将元素e插入到第i个位置

*q=e;

//线性表的长度增加1

++L.length;

return OK;

}

//删除线性表中第i个数据元素

Status ListDelete(SqList &L,int i,ElemType &e)

{

ElemType *p,*q;

//判断删除的元素是否存在,不存在则返回错误信息

if(i<1||i>L.length)

return ERROR;

//将第i+1个元素及其后所有元素前移一个位置,实现元素的删除

p=L.elem+i-1;

e=*p;

q=L.elem+L.length-1;

for(++p;p<=q;++p)

*(p-1)=*p;

//删除元素后,线性表的长度减1

L.length--;

//返回操作成功的提示信息

return OK;

}

//在顺序表中找给定元素值e的元素是否存在。存在则返回其位序,不存在返回0

int Locate(SqList L,ElemType e)

{

//依次访问顺序表中的数据元素,并和e做比较,若相等则放回其位序,否则返回0

for(int i=0;i

if(L.elem[i]==e)

return i+1;

return 0;

}

//遍历线性表

void ListTraverse(SqList L,void(*visit)(ElemType))

{

ElemType *p=L.elem;

int i;

for(i=1;i<=L.length;i++)

visit(*p++);

cout<

}

2.测试:设计测试文件test.cpp,验证所设计的顺序表的正确性。其内容如下:

①设计一个函数求解两个集合的并集。

②设计一个主函数。

#include

typedef int ElemType;

#include "SqList.h"

void print(ElemType c)

{

cout<

}

Status equal(ElemType a,ElemType b)

{

if(a==b)

return TRUE;

else

return FALSE;

}

void unionlist(SqList LA, SqList LB,SqList &LC)

{

for(int i=0;i

{

LC.elem[i]=LA.elem[i];

LC.length++;

}

for(i=0;i

{

int k=LocateElem(LA,LB.elem[i],equal);

if(!k)

{

ListInsert(LC,LC.length+1,LB.elem[i]);

}

}

}

void main()

{

SqList LA,LB,LC;

ElemType a[4]={12,32,21,45};

ElemType b[5]={32,34,54,12,27};

InitList(LA);

InitList(LB);

InitList(LC);

for(int i=1;i<5;i++)

ListInsert(LA,i,a[i-1]);

for(i=1;i<=5;i++)

ListInsert(LB,i,b[i-1]);

ListTraverse(LA,print);

ListTraverse(LB,print);

unionlist(LA,LB,LC);

cout<<"合并数据元素后的线性表为:";

ListTraverse(LC,print);

}

相关文档
最新文档