【数据结构】顺序线性表(1)

顺序线性表(数组)

#define LIST_INIT_SIZE 10
#define LIST_INCREMENT 2

typedef int ElemType;

struct SqListArray
{
    ElemType * pBase;    //数组首地址
    int length;          //数组最大长度
    int cnt;             //数组有效长度
};


//顺序存储的线性表的基本操作(12个)
//1构造一个空的线性表
void init_arr(struct SqListArray * arr)
{
    arr->pBase = (ElemType *) malloc(sizeof (ElemType) * LIST_INIT_SIZE);
    if (NULL == arr->pBase)
    {
        printf("动态内存分配失败!\n");
        exit(-1);
    }
    else
    {
        arr->length = LIST_INIT_SIZE;
        arr->cnt = 0;
    }
}

//2顺序线性表若存在,销毁顺序线性表
void destroy_arr(struct SqListArray * arr)
{
    free(arr->pBase = NULL);
    arr->pBase = NULL;
    arr->cnt = 0;
    arr->length = 0;
}

//3顺序线性表重置为空表
void clear_arr(struct SqListArray * arr)
{
    arr->cnt = 0;
}

//4判断是否为空
bool is_empty(struct SqListArray * arr)
{
    if (0 == arr->cnt)
        return true;
    else
        return false;
}

//5.返回顺序线性表元素个数
int length_arr(struct SqListArray * arr)
{
    return arr->cnt;
}

//6获取第pos个元素的值  从 1 开始
bool get_arr(struct SqListArray * arr, int pos, ElemType * value)
{
    if (pos < 0 || pos > arr->cnt)
        return false;
    *value = arr->pBase[pos - 1];

    return true;
}

//7给定一个数,得到线性表中与此数相等的最小的位序
bool compare(ElemType e1, ElemType e2)
{
    if (e1 == e2)
        return true;
    else
        return false;
}
int locate_arr(struct SqListArray * arr, ElemType value)
{
    int i = 1;
    while (i < arr->cnt && !compare(value, arr->pBase[i-1]))
    {
        i++;
    }
    if ( i < arr->cnt)
        return i;
    else
    {
        return 0;
    }
}

//8给定一个数,判断是否在数组里,如果在,从第二个元素开始得到此数的前一个数
bool prior_arr(struct SqListArray * arr, ElemType cur_e, ElemType * pre_e)
{
    int i = 1;
    while (i < arr->cnt && arr->pBase[i] != cur_e)
    {
        i++;
    }
    if (i > arr->cnt - 1)
    {
        return false;
    }
    else
    {
        *pre_e = arr->pBase[i-1];
        return true;
    }
}

//9返回cur的后一个
bool next_arr(struct SqListArray * arr, ElemType cur_e, ElemType * next_e)
{
    int i = 0;
    while (i < arr->cnt && arr->pBase[i] != cur_e)
    {
        i++;
    }
    if (i == arr->cnt - 2)
        return false;
    else
    {
        *next_e = arr->pBase[i + 1];
        return true;
    }
}

//10插入元素
bool insert_arr(struct SqListArray * arr, int pos, ElemType value)
{
    ElemType * pNewBase;
    if (pos < 0 || pos > arr->cnt + 1)
        return false;
    if (arr->cnt == arr->length)
    {
        pNewBase = (ElemType *) realloc(arr->pBase, sizeof (ElemType) * (arr->length + LIST_INCREMENT));
        if (!pNewBase)
            exit(-1);

        arr->pBase = pNewBase;
        arr->length += LIST_INCREMENT;
    }
    for (int i = arr->cnt - 1; i >= pos - 1; --i)
    {
        arr->pBase[i+1] = arr->pBase[i];
    }
    arr->pBase[pos - 1] = value;
    arr->cnt++;

    return true;
}

//11删除第i个位置上的元素
bool delete_arr(struct SqListArray * arr, int pos, ElemType * pValue)
{
    if (is_empty(arr))
        return false;
    if (pos < 0 || pos > arr->cnt)
        return false;

    *pValue = arr->pBase[pos-1];
    for (int i = pos; i <= arr->cnt; i++)
    {
        arr->pBase[i-1] = arr->pBase[i];
    }
    arr->cnt--;
    return true;
}

//12遍历数组
void traverse_arr(struct SqListArray * arr)
{
    if(is_empty(arr))
    {
        printf("数组为空!\n");
    }
    else
    {
        for (int i = 0; i < arr->cnt; i++)
        {
            printf("%d ", arr->pBase[i]);
        }
        printf("\n");
    }
}
//将所有在线性表Lb中但不在La的数据元素插入到表La中
void Union(struct SqListArray * La, struct SqListArray * Lb)
{
    ElemType value;
    for (int i = 0; i < Lb->cnt; i++)
    {
        get_arr(Lb, i+1, &value);
        if (!locate_arr(La, value))
            insert_arr(La, La->cnt + 1, value);
    }
}
//La Lb先排序(给定升序),归并La 和 Lb 得到新的线性表 Lc 也是升序
void MergeList_array(struct SqListArray * La, struct SqListArray * Lb, struct SqListArray * Lc)
{
    Lc->length = length_arr(La) + length_arr(Lb) ;
    printf("Lc->length = %d\n", Lc->length);
    Lc->pBase = (ElemType *) malloc(sizeof (ElemType) * Lc->length);
    if (NULL == Lc->pBase)
    {
        printf("动态内存分配失败!\n");
        exit(-1);
    }

    int i = 0;
    int j = 0;
    Lc->cnt = 0;
    while (i < La->cnt && j < Lb->cnt)
    {

        if (La->pBase[i] <= Lb->pBase[j])
        {
            Lc->pBase[Lc->cnt] = La->pBase[i];
            i++;
            Lc->cnt++;
        }
        else
        {
            Lc->pBase[Lc->cnt] = Lb->pBase[j];
            j++;
            Lc->cnt++;
        }

    }
    while (i < La->cnt )
    {
        Lc->pBase[Lc->cnt] = La->pBase[i];
        i++;
        Lc->cnt++;
    }
    while (j < Lb->cnt )
    {
        Lc->pBase[Lc->cnt] = Lb->pBase[j];
        j++;
        Lc->cnt++;
    }

}

测试

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <stdbool.h>


int main()
{
    struct SqListArray array;
    init_arr(&array);
    for (int i = 0; i < 6; i++)
    {
        insert_arr(&array, i+1, i);
    }
    insert_arr(&array, 7, 3);
    insert_arr(&array, 8, 3);
    insert_arr(&array, 9, 4);


    int len = length_arr(&array);
    printf("len = %d\n", len);

    ElemType val;
    get_arr(&array, 3, &val);
    printf("val = %d\n", val);

    int locate_cnt;
    locate_cnt = locate_arr(&array, 4);
    printf("locate_cnt = %d\n", locate_cnt);

    ElemType pre_e;
    prior_arr(&array, 4, &pre_e);
    printf("pre_e = %d\n", pre_e);

    ElemType next_e;
    next_arr(&array, 4, &next_e);
    printf("pre_e = %d\n", next_e);

    traverse_arr(&array);

    ElemType value;
    delete_arr(&array, 7, &value);
    printf("value = %d\n", value);
    traverse_arr(&array);
    /*
    clear_arr(&array);
    destroy_arr(&array);

    traverse_arr(&array);
    */

    struct SqListArray La;
    struct SqListArray Lb;
    struct SqListArray Lc;
    init_arr(&La);
    init_arr(&Lb);

    insert_arr(&La, 1, 2);
    insert_arr(&La, 2, 2);
    insert_arr(&La, 3, 3);
    insert_arr(&La, 4, 6);
    insert_arr(&La, 5, 9);

    insert_arr(&Lb, 1, 2);
    insert_arr(&Lb, 2, 4);
    insert_arr(&Lb, 3, 6);
    insert_arr(&Lb, 4, 8);
    insert_arr(&Lb, 5, 9);
    insert_arr(&Lb, 6, 10);

    traverse_arr(&La);
    traverse_arr(&Lb);
    //Union(&La, &Lb);
    //traverse_arr(&La);
    MergeList_array(&La, &Lb, &Lc);
    printf("La->length = %d\n", La.cnt);
    traverse_arr(&Lc);

    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值