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;
    
}

 

posted @ 2013-10-26 13:33  聆听的风声  阅读(405)  评论(0)    收藏  举报