C++顺序表实现

#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 100

typedef int Status;
typedef int ElemType;

typedef struct
{
    
    ElemType* data;
    int length;

}SqList;
Status visit(ElemType e);
Status InitList(SqList& L);
Status EmptyList(SqList L);
int  ListLength(SqList L);
Status GetElem(SqList L, int i, ElemType& e);
int LocateElem(SqList L, ElemType e);
Status ListInsert(SqList& L, int i, ElemType e);
Status ListDelete(SqList& L, int i, ElemType& e);
Status ClearList(SqList& L);
Status ListTravers(SqList L);
void Connect(SqList& La, SqList Lb);
Status MerGeList(SqList La, SqList Lb, SqList& Lc);

Status visit(ElemType e)
{
    cout << e << " ";
    return OK;

}

//初始化顺序表
Status InitList(SqList &L)
{
    L.data = new ElemType[MAXSIZE];
    L.length = 0;
    return OK;
}

//判断顺序表是否为空,如果是空表,返回TRUE,否则返回FALSE
Status EmptyList(SqList L)
{
    if (L.length == 0)
        return TRUE;
    else
        return FALSE;

}

//返回顺序表的长度(元素个数)
int  ListLength(SqList L)
{
    return L.length;
}

//获取第i个元素的值(i不是下标)
Status GetElem(SqList L, int i, ElemType& e)
{
    int length = ListLength(L);
    if (i<1 || i>length)
        return ERROR;

    e = L.data[i - 1];
    return OK;

}

//返回顺序表中元素e的位置,如果顺便表为空,或者元素不存在,返回0
int LocateElem(SqList L, ElemType e)
{
    if (L.length == 0)
        return 0;
    int length = ListLength(L);
    for (int i=0;i<length;i++)
    {
        if (L.data[i] == e)
            return i + 1;
    }
    return 0;
}


//在第i个位置插入元素e,如果插入位置不合理或者顺序表已满,返回ERROR
Status ListInsert(SqList &L,int i,ElemType e)
{
    int length = ListLength(L);
    if (i<1 || i>L.length + 1 || length == MAXSIZE)
        return ERROR;
    for (int j = length - 1; j >= i - 1; j--)
        L.data[j + 1] = L.data[j];
    L.data[i - 1] = e;
    L.length++;
    return OK;

}

//删除第i个位置元素e,如果删除位置不合理或者顺序表为空,返回ERROR
Status ListDelete(SqList &L,int i,ElemType &e)
{
    int length = ListLength(L);
    if (i<1 || i>length || length == 0)
        return ERROR;
    
    e = L.data[i - 1];
    for (int j = i; j <= length - 1; j++)
    {
        L.data[j - 1] = L.data[j];
    }
    L.length--;
    return OK;

}

//清空顺序表
Status ClearList(SqList &L)
{
    ElemType e;
    int length = ListLength(L);
    for (int i = 1; i <= length; i++)
        ListDelete(L, 1, e);

    L.length = 0;
    return OK;

}

//遍历顺序表
Status ListTravers(SqList L)
{
    ElemType e;
    int length = ListLength(L);
    for (int i = 1; i <= length; i++)
    {
        /*visit(L.data[i - 1]);*/
        GetElem(L, i, e);
        visit(e);
    }
    cout << endl;
    return OK;

}

//接下来就是顺序表玩具了

//对比La顺序表和Lb顺序表,在Lb顺序表中查找不是La顺序表的元素,插入到La顺序表的末尾
void Connect(SqList& La, SqList Lb)
{
    ElemType e;
    int La_len, Lb_len;
    La_len = ListLength(La);
    Lb_len = ListLength(Lb);

    for (int i = 1; i <= Lb_len; i++)
    {
        GetElem(Lb, i, e);
        if (!LocateElem(La, e))
        {
            ListInsert(La, ++La_len, e);
        }    
    }
    

}


//顺序表La,Lb都为升序排列,对比顺序表La和Lb,依次将最小的元素插入到新的顺序表Lc
Status MerGeList(SqList La, SqList Lb, SqList& Lc)
{
    ElemType* pa, * pb, * pc, * pa_last, * pb_last;
    Lc.length = La.length + Lb.length;
    Lc.data = new ElemType[Lc.length]; //堆区申请一个新数组,长度为Lc.length
    pa = La.data;  //指针pa指向顺序表pa首元素
    pb = Lb.data; //指针pb指向顺序表pb首元素
    pc = Lc.data; //指针pc指向顺序表pc首元素

    //指针pa_last指向顺序表La最后一个元素
    pa_last = La.data + La.length - 1;
    //指针pb_last指向顺序表Lb最后一个元素
    pb_last = Lb.data + Lb.length - 1;

    while (pa <= pa_last && pb <= pb_last)
    {
        if (*pa <= *pb)
            *pc++ = *pa++;
        else
            *pc++ = *pb++;
    }
    while (pa <= pa_last)
    {
        *pc++ = *pa++;
    }
    while(pb<=pb_last)
    {
        *pc++ = *pb++;
    }
    return OK;


}


int main()
{
    SqList L;
    SqList Lb;
    SqList Lc;
    ElemType e;
    Status i;
    int j, k;
    i = InitList(L);
    cout << "初始化L后:L.length=" << L.length << endl;
    for (j = 1; j <= 5; j++)
    {
        i = ListInsert(L, 1, j);
    }
    cout << "在L的表头依次插入1~5后:L.data=";
    ListTravers(L);
    cout << "L.length=" << L.length << endl;
    i = EmptyList(L);
    cout << "L是否空:(1:是 0:否)" << i << endl;
    i = ClearList(L);
    cout << "清空L后:L.length=" << L.length << endl;

    i = EmptyList(L);
    cout << "L是否空:(1:是 0:否)" << i << endl;


    for (j = 1; j <= 10; j++)
    {
        ListInsert(L, j, j);

    }
    cout << "在L的表尾依次插入1~10后:L.data=";
    ListTravers(L);

    cout << "L.length=" << L.length << endl;
    ListInsert(L, 1, 0);

    cout << "在L的表头插入0后:L.data=";
    ListTravers(L);

    cout << "L.length=" << L.length << endl;

    GetElem(L, 5, e);
    cout << "第5个元素的值为:" << e << endl;

    for (j = 3; j <= 4; j++)
    {
        k = LocateElem(L, j);
        if (k)
        {
            cout << "第" << k << "个元素的值为" << j << endl;
        }
        else
        {
            cout << "没有值为" << j << "的元素" << endl;
        }
    }
    k = ListLength(L);
    for (j = k + 1; j >= k; j--)
    {
        i = ListDelete(L, j, e);
        if (i == ERROR)
        {
            cout << "删除第" << j << "个元素失败" << endl;
        }
        else
        {
            cout << "删除第" << j << "个元素为" << e << endl;
        }

    }
    cout << "依次输出L的元素:";
    ListTravers(L);

    j = 5;
    ListDelete(L, j, e);
    cout << "删除第" << j << "个元素为" << e << endl;

    cout << "依次输出L的元素:";
    ListTravers(L);

    i = InitList(Lb);
    for (j = 6; j <= 15; j++)
    {
        i = ListInsert(Lb, 1, j);
    }
    Connect(L, Lb);
    cout << "依次输出合并了Lb的L的元素:";
    ListTravers(L);

    ClearList(L);
    ClearList(Lb);

    ListInsert(L, 1, 1);
    ListInsert(L, 2, 3);
    ListInsert(L, 3, 5);
    cout << "L=";
    ListTravers(L);

    ListInsert(Lb, 1, 2);
    ListInsert(Lb, 2, 4);
    ListInsert(Lb, 3, 6);
    ListInsert(Lb, 4, 8);
    ListInsert(Lb, 5, 10);
    cout << "Lb=";
    ListTravers(Lb);

    InitList(Lc);
    MerGeList(L, Lb, Lc);
    cout << "依次输出有序合并L,Lb后的Lc的元素:";
    ListTravers(Lc);

    return 0;
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值