顺序表的基本操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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; }