C++语言 顺序表实现
头文件:
#pragma once
#define LIST_INIT_SIZE 100//线性表存储空间的初始化分配量
#define LISTINCREMENT 10 //线性表分配增量
#define OK 1
#define ERROR 0
#define OVERFOW -2
typedef int ElemType;//定义数据类型名称
//状态类型
typedef int Status;//状态类型
typedef struct {
ElemType *elem;//存储空间地址,
int length;//当前长度
int listsize;//当前分配的存储容量(以sizeof(ElemType))
}SqList; //定义了结构体类型名称
class SequenceTable
{
public:
SequenceTable(void);
~SequenceTable(void);
public:
//初始化顺序表
Status InitList_Sq(SqList &L);
//在第i个元素之前插入一个元素e
Status Insert_Sq(SqList &L,int i, ElemType e);
//获得L表中i位置的元素保存在e中
Status GetElem(SqList &L,int i, ElemType &e);
//删除第i个元素 返回其值保存在e中
Status DeleteElem(SqList &L,int i ,ElemType &e);
//查找L中是否有e值 如果有返回第一次出现的位置,否则返回-1
int LocateElem_Sq(SqList &L,ElemType e);
///顺序表合并 把L1,L2合并到L中
Status MergeList(SqList &L1,SqList &L2,SqList &L);
///释放线性表空间
void DestroyList(SqList *L);
};
实现头文件:
#include "ISequenceTable.h"
#include <stdlib.h>
//构造函数
SequenceTable::SequenceTable(void)
{
}
//析构函数
SequenceTable::~SequenceTable(void)
{
}
//初始化顺序表
Status SequenceTable::InitList_Sq(SqList &L)
{
L.elem =(ElemType *) malloc(LIST_INIT_SIZE *sizeof(ElemType));
if(!L.elem)exit(OVERFOW);//存储分配失败 退出系统
L.length = 0;
L.listsize = LIST_INIT_SIZE;//初始化存储容量
return OK;
}
//在i之前插入 i从1开始
Status SequenceTable::Insert_Sq(SqList &L,int i, ElemType e)
{
if(i<1 || i>L.length+1)return ERROR;
if(L.length >= L.listsize)
{
ElemType *newbase = (ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)exit(OVERFOW);
L.elem = newbase;//新基址
L.listsize += LISTINCREMENT;
}
int *q = &(L.elem[i-1]);
for(int *p = &(L.elem[L.length-1]);p>=q;--p)
*(p+1) = *p;
*q = e;
++L.length;
return OK;
}
//获得L表中i位置的元素保存在e中 从0开始
Status SequenceTable::GetElem(SqList &L,int i, ElemType &e)
{
if(i<0 || i > L.length)return ERROR;
e = L.elem[i];
return OK;
}
//删除第i个元素 返回其值保存在e中 从0开始
Status SequenceTable::DeleteElem(SqList &L,int i ,ElemType &e)
{
if(i<0||i>L.length)return ERROR;
e = L.elem[i];
for(int n=i;n<L.length; n++)
{
L.elem[n] = L.elem[n+1];
}
--L.length;
return OK;
}
//查找L中是否有e值 如果有返回第一次出现的位置,否则返回-1
int SequenceTable::LocateElem_Sq(SqList &L,ElemType e)
{
for(int i=0;i<L.length;i++)
{
ElemType value = L.elem[i];
if(value == e)
return i;
}
return -1;
}
///顺序表合并 把L1,L2合并到L中
Status SequenceTable::MergeList(SqList &L1,SqList &L2,SqList &L)
{
for(int i=1; i<L1.length+1;i++)
{
Insert_Sq(L,i,L1.elem[i-1]);
}
for(int j=0; j<L2.length;j++)
{
bool open =true;
for(int m=0; m< L.length; m++)
{
if(L.elem[m] == L2.elem[j])
{
open = false;
}
}
if(open)
Insert_Sq(L,L.length+1,L2.elem[j]);
}
return OK;
}
///释放线性表空间
void SequenceTable::DestroyList(SqList *L)
{
free(L->elem);
L->elem = NULL;
L->length=0;
L->listsize=0;
}

浙公网安备 33010602011771号