数据结构学习——第一天

本文详细介绍了顺序表的初始化,包括有初始值和无初始值的情况,以及使用运算符[]和指针两种方式实现。接着讲解了顺序表的插入数据操作,其时间复杂度为O(n)。删除数据同样涉及数据移动,与插入类似。清空顺序表只需将长度设为0。最后,文章讨论了顺序表的反转方法,包括直接交换两端元素和创建新顺序表反向赋值。这些操作对于理解数据结构中的顺序表至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2.1 顺序表

初始化

顺序表初始化分为两种方式:有初始值和没有初始值,前者通过参数将数组元素赋值到顺序表,后者创建空的顺序表。

Sq_List()
    {
        elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
        if (!elem)
            exit(OVERFLOW);
        length = 0;
        listsize = LIST_INIT_SIZE;
    };

创建有初始值的顺序表时,数据的赋值可以通过运算符函数[]或者指针进行复制,下面代码使用了两种赋值方法。

Sq_List(ElemType a[], int n)
    {
        // []
        // elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
        // if(!elem) exit(OVERFLOW);
        // for(int i = 0; i < n; i++){
        //     elem[i] = a[i];
        // }
        // length = n;
        // listsize = LIST_INIT_SIZE;

        // 指针
        elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
        if (!elem)
            exit(OVERFLOW);
        ElemType *end = a + n - 1;
        ElemType *p = elem;
        ElemType *q = a;
        while (q <= end)
        {
            *p++ = *q++;
        }
        length = n;
        listsize = LIST_INIT_SIZE;
    }
插入数据

顺序表的插入较为麻烦,时间复杂度为O(n),需要将插入位置和该位置后边的数据向后移动一位,因此时间复杂度为O(n),数据后移的方式同样可以通过运算符[]和指针来进行操作,下面介绍了两种方法。

Status InsertList(ElemType x, int i){
        if(i<1||i>(length+1)) return ERROR; // 判断插入位置是否合法
        if(length >= listsize){
            ElemType* newbase = (ElemType *)realloc(elem, (listsize + LISTINCREMENT) * sizeof(ElemType));
            elem = newbase;
            listsize += LISTINCREMENT;
        } // 判断数组空间是否充足

        // // []后移
        // for(int j = length; j >= i; j--){
        //     elem[j] = elem[j - 1];
        // }
        // elem[i - 1] = x;
        // length += 1;
        // return OK;

        // 指针后移
        ElemType* p = elem + length;
        ElemType* end = elem + i;
        while(p>=end){
            *p = *(p - 1);
            p--;
        }
        *p = x;
        length++;
        return OK;
    }
删除数据

顺序表中数据删除和数据插入很类似,都需要将后边的数据移动。数据删除需要将插入位置后边的数据全部向前移动一位,可以通过运算符[]和指针来进行操作,下面介绍了两种方法。

Status DeleteList(int i){
        if(i<1||(i>length)) return ERROR;

        // // []
        // for(int j = i - 1; j < length - 1; j++){
        //     elem[j] = elem[j + 1];
        // }
        // length -= 1;
        // return OK;

        // *
        ElemType* end = elem + length - 1;
        ElemType* q = elem + i - 1;
        while(q<=end){
            *q = *(q + 1);
            q++;
        }
        length--;
        return OK;
    }
清空顺序表

顺序表中清空顺序表可以不对数据进行删除,在class中定义了length数据,记录顺序表中数据的长度,即使数据不删除,只要length的值赋值为0,就实现了数据清空的目的,但实际物理地址仍存储着数据,但是无法直接调用。

Status ClearList(){
        length = 0;
        return OK;
    }
顺序表反转

顺序表反转即将数据方向存储,可以通过以下两个方法进行实现。

  1. 将length对半分开,实现两端元素的交换;
  2. 创建一个新的顺序表,将原来顺序表的元素反向赋值给新的顺序表,最后将新的顺序表首地址赋值给elem;
Status TraverseList(){
        ElemType *newbase = (ElemType *)malloc(listsize * sizeof(ElemType));
        if(!newbase) return ERROR;

        // // []
        // for(int i = 0; i < length; i++){
        //     newbase[i] = elem[length - i - 1];
        // }
        // free(elem);
        // elem = newbase;
        // return OK;

        // *
        ElemType* q = newbase;
        ElemType* p = elem + length - 1;
        ElemType* end = elem;
        while(p>=end){
            *q ++ = *p --;
        }
        free(elem);
        elem = newbase;
        return OK;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值