欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用C語言實(shí)現(xiàn)動(dòng)態(tài)數(shù)組Vector

 更新時(shí)間:2024年01月10日 09:48:14   作者:廚子老林  
這篇文章主要為大家詳細(xì)介紹了使用C語言實(shí)現(xiàn)動(dòng)態(tài)數(shù)組Vector的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

代碼倉庫地址

1. 動(dòng)態(tài)數(shù)組原理

定義一個(gè)結(jié)構(gòu)體類型,在結(jié)構(gòu)體中用指針指向一個(gè)在堆空間開辟的一塊內(nèi)存。

2. 編寫頭文件

在頭文件里定義Vector的數(shù)據(jù)結(jié)構(gòu)和相關(guān)操作,可以通過修改 “typedef char* Element;” 來修改存儲(chǔ)的數(shù)據(jù)的類型;

#ifndef VECTOR_H
#define VECTOR_H

// 數(shù)組默認(rèn)容量設(shè)置為10
#define DEFAULT_CAPACITY 10 
// 數(shù)組長度低于 HIGHT_SIZE 時(shí),每次按照原長度翻倍擴(kuò)容
// 數(shù)組長度高于 HIGHT_SIZE 時(shí),擴(kuò)充原容量的1/2
#define HIGHT_SIZE 1000 

// 定義存儲(chǔ)的數(shù)據(jù)類型
typedef char* Element;

// 定義Vector的數(shù)據(jù)結(jié)構(gòu)
typedef struct vector_s {
    Element *data; // 用于存儲(chǔ)數(shù)據(jù)的動(dòng)態(tài)數(shù)組的指針
    int size; // 數(shù)組長度
    int capacity; // 容量
} Vector;

// 創(chuàng)建一個(gè)空的Vector
Vector* vector_create();

// 銷毀釋放Vector
void vector_destroy(Vector *v);

// 向動(dòng)態(tài)數(shù)組的末尾新增一個(gè)元素
void vector_push_back(Vector *v, Element val);

// 向數(shù)組的前面插入一個(gè)元素
void vector_push_front(Vector *v, Element val);

// 將元素val添加到索引為idx的位置,idx后面的元素依次后移
void vector_insert(Vector *v, int idx, Element val);

// 給Vector的動(dòng)態(tài)數(shù)組擴(kuò)容
static void vector_rsize(Vector *v);

// 將數(shù)組的元素從指定下標(biāo)位置依次向后挪動(dòng)
static void move_data(Vector *v, int idx);


#endif

3. 具體實(shí)現(xiàn)

1. 創(chuàng)建一個(gè)空的Vector

Vector* vector_create() {
    Vector *v = (Vector*)calloc(1, sizeof(Vector));
    if (v == NULL) {
        puts("error:創(chuàng)建一個(gè)空的Vector時(shí)分配內(nèi)存失敗");
        exit(-1);
    }
    // 給Vector的成員變量賦值
    v->data = c1alloc(DEFAULT_CAPACITY, sizeof(Element));
    if (v->data == NULL) {
        puts("error:創(chuàng)建一個(gè)空的Vector時(shí)分配內(nèi)存失敗");
        free(v); // 因?yàn)橄旅嬉恍惺侵苯油顺龀绦?,free(v)意義不大,但最好還是寫上,養(yǎng)成習(xí)慣
        exit(-1);
    }
    v->capacity = DEFAULT_CAPACITY;
    return v;
}

2. 銷毀釋放Vector

void vector_destroy(Vector *v) {
    if (v == NULL) { // Vector不能是NULL
        return;
    }
    free(v->data);
    free(v);
}

3. 向動(dòng)態(tài)數(shù)組的末尾新增一個(gè)元素

void vector_push_back(Vector *v, Element val) {
    if (v == NULL) { // Vector不能是NULL
        return;
    }
    if (v->size == v->capacity) { // 容量不足,擴(kuò)容
        vector_rsize(v);
    }
    v->data[v->size] = val;
    v->size++;
}

4. 向數(shù)組的前面插入一個(gè)元素

void vector_push_front(Vector *v, Element val) {
    if (v == NULL) { // Vector不能是NULL
        return;
    }
    if (v->size == v->capacity) { // 容量不足,擴(kuò)容
        vector_rsize(v);
    }
    // 從下標(biāo)0向后移動(dòng)并在0下標(biāo)位置賦值
    move_data(v, 0);
    v->data[0] = val;
    v->size++;
}

5. 將元素val添加到索引為idx的位置,idx后面的元素依次后移

void vector_insert(Vector *v, int idx, Element val) {
    if (v == NULL || idx < 0 || idx > v->size) { // Vector不能是NULL,索引位置不能為負(fù)且不能越界
        return;
    }
    if (v->size == v->capacity) { // 容量不足,擴(kuò)容
        vector_rsize(v);
    }
    move_data(v, idx);
    v->data[idx] = val;
    v->size++;
}

6. 給Vector的動(dòng)態(tài)數(shù)組擴(kuò)容

tips:此函數(shù)以下幾點(diǎn)需要注意

  • 算術(shù)運(yùn)算‘+’的優(yōu)先級比位運(yùn)算符‘>>’高,要用括號括起來;
  • 用realloc擴(kuò)容,不能用calloc和malloc來擴(kuò)大容量,數(shù)據(jù)會(huì)丟失;
  • 擴(kuò)容的時(shí)候要注意是給Vector的data數(shù)組擴(kuò)容,即v->data;
  • 只有calloc會(huì)默認(rèn)自動(dòng)賦初值,malloc和realloc都不會(huì)默認(rèn)賦初值,記得給擴(kuò)容部分附上初始值;
static void vector_rsize(Vector *v) {
    int old_capacity = v->capacity;
    // tips:算術(shù)運(yùn)算‘+'的優(yōu)先級比位運(yùn)算符‘>>'高,要用括號括起來
    int new_capacity = v->size < HIGHT_SIZE ? old_capacity << 1 : old_capacity + (old_capacity >> 1);
    // tips:用realloc擴(kuò)容,不能用calloc和malloc,數(shù)據(jù)會(huì)丟失!
    // tips:擴(kuò)容的是v->data,而不是v
    Element *temp = realloc(v->data, new_capacity * sizeof(Element));
    if (temp == NULL) {
        puts("error:給Vector的動(dòng)態(tài)數(shù)組擴(kuò)容失敗");
        exit(-1);
    }
    // tips:v->data擴(kuò)容部分附上初值
    memset(v->data + v->size, 0, (v->capacity - v->size) * sizeof(Element));
    v->data = temp;
    v->capacity = new_capacity;
}

7. 將數(shù)組的元素從指定下標(biāo) idx 位置依次向后挪動(dòng)1個(gè)位置

static void move_data(Vector *v, int idx) {
    for (int i = v->size - 1; i >= idx; i--) {
        v->data[i+1] = v->data[i];
    }
    v->data[idx] = 0;
}

到此這篇關(guān)于使用C語言實(shí)現(xiàn)動(dòng)態(tài)數(shù)組Vector的文章就介紹到這了,更多相關(guān)C語言動(dòng)態(tài)數(shù)組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c++利用stl set_difference對車輛進(jìn)出區(qū)域進(jìn)行判定

    c++利用stl set_difference對車輛進(jìn)出區(qū)域進(jìn)行判定

    這篇文章主要介紹了set_difference,用于求兩個(gè)集合的差集,結(jié)果集合中包含所有屬于第一個(gè)集合但不屬于第二個(gè)集合的元素,需要的朋友可以參考下
    2017-03-03
  • C++基礎(chǔ)知識實(shí)例解析(一)

    C++基礎(chǔ)知識實(shí)例解析(一)

    這篇文章主要對C++基礎(chǔ)知識實(shí)例解析,通過四個(gè)簡短的案例,鞏固大家的基礎(chǔ)知識,需要的朋友可以參考下
    2015-08-08
  • C++?繼承的范例講解

    C++?繼承的范例講解

    繼承是C++面向?qū)ο缶幊讨械囊婚T。繼承是子類繼承父類的特征和行為,或者是繼承父類得方法,使的子類具有父類得的特性和行為。重寫是子類對父類的允許訪問的方法實(shí)行的過程進(jìn)行重新編寫,返回值和形參都不能改變。就是對原本的父類進(jìn)行重新編寫,但是外部接口不能被重寫
    2022-06-06
  • 基于C語言實(shí)現(xiàn)shell指令的詳解

    基于C語言實(shí)現(xiàn)shell指令的詳解

    本篇文章是對C語言實(shí)現(xiàn)shell指令的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言的數(shù)組與指針可以這樣了解

    C語言的數(shù)組與指針可以這樣了解

    這篇文章主要介紹了C語言的數(shù)組與指針,本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下,希望能給你帶來幫助
    2021-08-08
  • 用c語言實(shí)現(xiàn)2000內(nèi)既能被3整除又能被7整除的個(gè)數(shù)

    用c語言實(shí)現(xiàn)2000內(nèi)既能被3整除又能被7整除的個(gè)數(shù)

    本篇文章是對使用c語言實(shí)現(xiàn)2000內(nèi)既能被3整除又能被7整除的個(gè)數(shù),用實(shí)例進(jìn)行了分析說明,需要的朋友參考下
    2013-05-05
  • 算法之排列算法與組合算法詳解

    算法之排列算法與組合算法詳解

    這篇文章主要介紹了算法之排列算法與組合算法詳解,本文以字典序法、遞歸法為例講解了排列算法、全組合算法等,需要的朋友可以參考下
    2014-08-08
  • C語言深入探究程序的編譯之預(yù)處理

    C語言深入探究程序的編譯之預(yù)處理

    在C語言的程序中包括各種以符號#開頭的編譯指令,這些指令稱為預(yù)處理命令。預(yù)處理命令屬于C語言編譯器,而不是C語言的組成部分,通過預(yù)處理命令可擴(kuò)展C語言程序設(shè)計(jì)的環(huán)境
    2022-05-05
  • C語言手撕一個(gè)Hash表(HashTable)實(shí)例代碼

    C語言手撕一個(gè)Hash表(HashTable)實(shí)例代碼

    哈希表(HashTable)是一種非常重要的數(shù)據(jù)結(jié)構(gòu),它可以在常量時(shí)間內(nèi)進(jìn)行插入、查找和刪除操作,下面這篇文章主要給大家介紹了關(guān)于C語言手撕一個(gè)Hash表(HashTable)的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • Qt生成隨機(jī)數(shù)的方法

    Qt生成隨機(jī)數(shù)的方法

    本文主要介紹了Qt生成隨機(jī)數(shù),生成隨機(jī)數(shù)主要用到了函數(shù)qsrand和qrand,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11

最新評論