最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

代碼倉庫地址

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

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

2. 編寫頭文件

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

#ifndef VECTOR_H
#define VECTOR_H

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

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

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

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

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

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

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

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

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

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


#endif

3. 具體實現(xiàn)

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

Vector* vector_create() {
    Vector *v = (Vector*)calloc(1, sizeof(Vector));
    if (v == NULL) {
        puts("error:創(chuàng)建一個空的Vector時分配內(nèi)存失敗");
        exit(-1);
    }
    // 給Vector的成員變量賦值
    v->data = c1alloc(DEFAULT_CAPACITY, sizeof(Element));
    if (v->data == NULL) {
        puts("error:創(chuàng)建一個空的Vector時分配內(nèi)存失敗");
        free(v); // 因為下面一行是直接退出程序,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. 向動態(tài)數(shù)組的末尾新增一個元素

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

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

void vector_push_front(Vector *v, Element val) {
    if (v == NULL) { // Vector不能是NULL
        return;
    }
    if (v->size == v->capacity) { // 容量不足,擴容
        vector_rsize(v);
    }
    // 從下標0向后移動并在0下標位置賦值
    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,索引位置不能為負且不能越界
        return;
    }
    if (v->size == v->capacity) { // 容量不足,擴容
        vector_rsize(v);
    }
    move_data(v, idx);
    v->data[idx] = val;
    v->size++;
}

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

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

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

7. 將數(shù)組的元素從指定下標 idx 位置依次向后挪動1個位置

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語言實現(xiàn)動態(tài)數(shù)組Vector的文章就介紹到這了,更多相關(guān)C語言動態(tài)數(shù)組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解C語言中常用的失敗退出和成功返回

    詳解C語言中常用的失敗退出和成功返回

    在 C 語言中,封裝函數(shù)時,我們通常需要判斷函數(shù)調(diào)用是否成功,并據(jù)此采取不同的操作,例如,在調(diào)用系統(tǒng)函數(shù)或庫函數(shù)時,我們通常會使用一些錯誤處理機制,來輸出錯誤信息、退出程序或返回不同的狀態(tài),以下是如何參考使用這些錯誤處理機制的示例,需要的朋友可以參考下
    2024-12-12
  • 詳談C++何時需要定義賦值/復(fù)制構(gòu)造函數(shù)

    詳談C++何時需要定義賦值/復(fù)制構(gòu)造函數(shù)

    下面小編就為大家?guī)硪黄斦凜++何時需要定義賦值/復(fù)制構(gòu)造函數(shù)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • Objective-C不帶加減號的方法實例

    Objective-C不帶加減號的方法實例

    顯而易見的事實是,Objective-C 中,+ 表示類方法,- 表示實例方法,這篇文章主要給大家介紹了關(guān)于Objective-C不帶加減號的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • C語言之free函數(shù)以及野指針介紹

    C語言之free函數(shù)以及野指針介紹

    以下是對C語言中的free函數(shù)與野指針進行了詳細的分析介紹,需要的朋友可以參考下
    2013-07-07
  • C語言中條件編譯詳解

    C語言中條件編譯詳解

    預(yù)處理程序提供了條件編譯的功能。可以按不同的條件去編譯不同的程序部分,因而產(chǎn)生不同的目標代碼文件。這對于程序的移植和調(diào)試是很有用的。條件編譯有三種形式,下面分別介紹。
    2017-05-05
  • C++11 強類型枚舉相關(guān)總結(jié)

    C++11 強類型枚舉相關(guān)總結(jié)

    這篇文章主要介紹了C++11 強類型枚舉的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c++11,感興趣的朋友可以了解下
    2021-02-02
  • C++生成和解析XML文件的講解

    C++生成和解析XML文件的講解

    今天小編就為大家分享一篇關(guān)于C++生成和解析XML文件的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • C++利用遞歸實現(xiàn)走迷宮

    C++利用遞歸實現(xiàn)走迷宮

    這篇文章主要為大家詳細介紹了C++利用遞歸實現(xiàn)走迷宮,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C++如何切割String對象的方法

    C++如何切割String對象的方法

    C++相較于Java,Python 并沒有提供的字符串分割的函數(shù)split,因此需要自己進行編寫,本文主要介紹了C++如何切割String對象的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • C語言動態(tài)順序表實例代碼

    C語言動態(tài)順序表實例代碼

    大家好,本篇文章主要講的是C語言動態(tài)順序表實例代碼,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12

最新評論

长岭县| 全南县| 巧家县| 井研县| 星座| 雷波县| 伊吾县| 涞源县| 孟津县| 兰坪| 滦南县| 乌鲁木齐县| 宜兴市| 新乡县| 韶关市| 秭归县| 阿瓦提县| 双鸭山市| 崇明县| 镇赉县| 于田县| 郓城县| 广饶县| 阿克苏市| 安乡县| 普兰店市| 灵武市| 磐石市| 八宿县| 阜宁县| 岗巴县| 汕尾市| 红原县| 房产| 鄂州市| 若羌县| 马山县| 南木林县| 达州市| 司法| 赣州市|