顺序表的基本操作

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

顺序表的基本操作

/*sqList.h 文件*/

#define LIST_INIT_SIZE 50 /*初始分配的顺序表长度*/

#define INCREM 10 /*溢出时,顺序表长度的增量*/

#define OVERFLOW 1

#define OK 0

#define ERROR -1

typedef int ElemType; /*定义表元素的类型*/

typedef struct SqList{

ElemType *elem; /*存储空间的基地址*/

int length; /*顺序表的当前长度*/

int listsize; /*当前分配的存储空间*/

}SqList;

/*sqListOp.h 文件*/

#include "Sqlist.h"

int InitList_sq(SqList &L); //顺序表创建函数定义

void FreeList_sq(SqList &L); //顺序表销毁函数定义

int ListInsert_sq(SqList &L, int i, ElemType e); //在顺序表的位置i插入元素e

void PrintList_sq(SqList &L); //遍历并输出顺序表所有元素

int ListDelete_sq(SqList &L, int i,ElemType &e); //删除顺序表第i个元素的

bool ListEmpty(SqList &L); //判断顺序表是否为空

int LocateElem_sq(SqList L,ElemType e); //在顺序表里查找出第1个与e相等的数据元素位置

//已知线性表La和Lb的元素按值非递减排列

//归并后的La和Lb得到新的顺序线性表Lc,Lc的元素也是按值非递减排列

void MergeList_sq(SqList La,SqList Lb, SqList &Lc);

/*sqListOp.cpp文件*/

#include

#include

#include

#include "sqlistOp.h"

//创建顺序表

int InitList_sq(SqList &L) {

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

if (!L.elem) exit(OVERFLOW); /*初始化失败,返回0*/

L.length = 0; /*置空表长度为0*/

L.listsize = LIST_INIT_SIZE; /*置初始空间容量*/

return OK; /*初始化成功,返回1*/

}/*InitList*/

//销毁顺序表

void FreeList_sq(SqList &L){

if (L.elem)

free(L.elem);

printf("完成链表存销毁\n");

}

//在顺序表的第i个位置之前插入新元素

int ListInsert_sq(SqList &L, int i, ElemType e){

int k;

if (i<1 || i>L.length + 1) return ERROR; /*插入位置不合法*/

if (L.length >= L.listsize){ /*存储空间满,重新分配空间*/

L.elem = (ElemType*)realloc(L.elem, (LIST_INIT_SIZE + INCREM)*sizeof(ElemType));

if (!L.elem) return OVERFLOW; /*存储分配失败*/

L.listsize += INCREM; /*修改存储空间大小*/

}

for (k = L.length - 1; k >= i - 1; k--){ /*插入位置之后元素后移*/ L.elem[k + 1] = L.elem[k];

}

L.elem[i - 1] = e; /*插入元素*/

L.length++; /*顺序表长度加1*/

return OK;

}/*ListInsert*/

//遍历并输出顺序表所有元素

void PrintList_sq(SqList &L){

if (!L.elem)

return;

int i = 0;

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

printf("第[%d]元素= [%d]\n", i, L.elem[i]);

}

//删除顺序表第i个位置的元素

int ListDelete_sq(SqList &L, int i,ElemType &e){

int k;

if (i<1 || i>L.length) return ERROR; /*删除位置不合法*/

e = L.elem[i-1];

for (k = i - 1; k

L.elem[k] = L.elem[k + 1];

L.length--; /*顺序表长度减1*/

return OK;

}

//在顺序表里查找出第1个与e相等的数据元素位置

int LocateElem_sq(SqList L,ElemType e){

int i = 0;

while(i<=L.length){

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

break;

else

i++;

}

if(i<=L.length) return i;

return -1;

}

//已知线性表La和Lb的元素按值非递减排列

//归并后的La和Lb得到新的顺序线性表Lc,Lc的元素也是按值非递减排列

void MergeList_sq(SqList La,SqList Lb, SqList &Lc){

ElemType *pa = La.elem;

ElemType *pb = Lb.elem;

Lc.listsize = Lc.length = La.length + Lb.length;

if(!Lc.elem) exit(OVERFLOW); //存储分配失败

int i = 0,j = 0; //书上合并的算法采用指针方式,这里采用简单点的方法

int k =0; //i指向La的当前位置,j指向Lb当前位置,k指向Lc当前位置while(i

if(La.elem[i]

Lc.elem[k] = La.elem[i];

i++;

}

else{

Lc.elem[k] = Lb.elem[j];

j++;

}

k++;

}

while(i

while(j

}//MergeList_sq

bool ListEmpty(SqList &L){ //判断顺序表是否为空

if(L.length > 0)

return 1;

else

return 0;

}

相关文档
最新文档