数据结构2.1

/*sqList.h*/
/*声明结构体以及函数*/
//线性表增长大小
#define LISTINCREMENT 10

#define OK 1
#define FALSE 0

//结构体
typedef struct {
    int *elem;
    int length;
    int listsize;
}sqList;

//初始化线性表
int initSqList(sqList &);

//向线性表中插入数据
int insertSqList(sqList &, int, int);

//删除线性表中数据
int delSqList(sqList &, int, int &);

//合并两张表
int margSqList(sqList, sqList, sqList &);

#endif // !_SQ_LIST


/*sqList.cpp*/
/*对函数进行定义*/
#include "sqList.h"
#include <cstdlib>
#include <memory>


//初始化线性表
int initSqList(sqList &L)
{
    //创建大小为LIST_INIT_SIZE的数组
    L.elem = (int *)malloc(LIST_INIT_SIZE * sizeof(int));
    if (!L.elem)
        return FALSE;
    L.length = 0;
    L.listsize = LIST_INIT_SIZE;
    return OK;
}

//向线性表中插入数据
int insertSqList(sqList &L, int i, int nElem)
{
    //判断i是否合法
    if (i < 1 || i > L.length + 1)
        return FALSE;
    //存储空间已满,重新分配
    if (L.length >= L.listsize)
    {
        int *newBase = (int *)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(int));
        if (!newBase)
            return FALSE;
        L.elem = newBase;
        L.listsize += LISTINCREMENT;
    }
    
    //i(包括i)后的数据依次后移
    for (int n = L.length + 1; n >= i; --n)
        L.elem[n] = L.elem[n - 1];
    //插入数据
    L.elem[i - 1] = nElem;
    ++L.length;
    /*
    int *q = &(L.elem[i - 1]);
    for (int *p = &(L.elem[L.length - 1]); p >= q; --p)
        *(p + 1) = *p;
    ++L.length;
    */
    return OK;
}

//删除线性表中数据
int delSqList(sqList &L, int i, int &nElem)
{
    //判断i是否合法
    if (i < 1 || i > L.length + 1)
        return FALSE;

    //取出被删除的元素
    nElem = L.elem[i - 1];

    //i(包括i)后的数据前移
    for (int n = i - 1; n < L.length; ++n)
        L.elem[n] = L.elem[n + 1];
    --L.length;

    /*
    int *p = &(L.elem[i - 1]);
    nElem = *p;
    int *q = L.elem + L.length - 1;
    for (++p; p <= q; ++p)
        *(p - 1) = *p;
    --L.length;
    */
    return OK;
}


//合并两张表
int margSqList(sqList slL, sqList slR, sqList &slD)
{
    
    slD.listsize = slD.length = slL.length + slR.length;
    //为目标线性表分配空间
    slD.elem = (int *)malloc(slD.listsize * sizeof(int));
    if (!slD.elem)
        return FALSE;

    int nl = 0;                //slL的下标值
    int nr = 0;                //slR的下标值
    int nd = 0;                //slD的下标值
    //归并
    while (nl < slL.length && nr < slR.length)
    {
        if (slL.elem[nl] <= slR.elem[nr])
            slD.elem[nd++] = slL.elem[nl++];
        else
            slD.elem[nd++] = slR.elem[nr++];
    }
    //插入slL剩余值
    while(nl < slL.length)
        slD.elem[nd++] = slL.elem[nl++];
    //插入slR剩余值
    while(nr < slR.length)
        slD.elem[nd++] = slR.elem[nr++];
    return OK;
}

/*main.cpp*/
/*测试以及样例输出*/
#include "sqList.h"
#include <iostream>
#include <ctime>

using std::cout;
using std::endl;

int main()
{
    sqList sl;
    initSqList(sl);
    int seed = 10;
    //添加元素
    cout << "添加元素" << endl;
    for (int i = 0; i < seed; ++i)
    {
        int nRet = insertSqList(sl, i + 1, i);
        if (!nRet)
            break;
    }

    //样例输出
    cout << "线性表大小:" << sl.listsize << endl;
    cout << "数据长度:" << sl.length << endl;
    cout << "数据内容:" << endl;
    for (auto i = 0; i < sl.length; ++i)
        cout << sl.elem[i] << "\t";
    cout << endl;



    //删除元素

    //产生1-10之间的随机数
    srand((unsigned int)time(0));
    int nIndex = rand() % 10;

    cout << "删除元素" << endl;
    int nDelElem = 0;
    delSqList(sl, nIndex, nDelElem);

    //样例输出
    cout << "删除的元素位置:" << nIndex << endl;
    cout << "删除的元素:" << nDelElem << endl;

    //合并线性表
    cout << endl;
    cout << "合并线性表" << endl;
    sqList slL, slR, slD;
    initSqList(slL);
    initSqList(slR);
    initSqList(slD);
    for (int i = 0; i < seed; ++i)
    {
        int nRet = insertSqList(slL, i + 1, i);
        if (!nRet)
            break;
        nRet = insertSqList(slR, i + 1, i);
        if (!nRet)
            break;
    }
    //合并
    margSqList(slL, slR, slD);
    
    //样例输出
    cout << "线性表大小:" << slD.listsize << endl;
    cout << "数据长度:" << slD.length << endl;
    cout << "数据内容:" << endl;
    for (auto i = 0; i < slD.length; ++i)
        cout << slD.elem[i] << "\t";
    cout << endl;
    system("pause");
    return 0;
        
}


你可能感兴趣的:(数据结构)