數據結構作業——動態數組

關於動態數組的初步理解

摘要:動態數組的組成以及動態內存分配常用函數的原理以及使用方法。

關鍵字: 動態數組、 動態內存分配、 指針、 malloc()、 free()、 sizeof()

  • 動態數組是把指針動態內存分配內存聯用。

    • 動態內存分配是指在程序運行時爲變量分配內存的一種方法。 C的動態內存分配從堆上分配內存。使用這些函數時只需要在程序開頭將頭文件<cstdli.b>包含到源程序。
    • 函數malloc()
      函數malloc()用於分配若干字節的內存空間,返回一個指向該內存首地址的指針。若系統不能提供足夠的內存單元,函數將返回空指針NULL
      函數原型爲:

      void *malloc(unsingend int size);

      size表示向系統申請空間的大小。 指針的返回類型爲void *是無類型的指針, 因此需要通過強制轉換將指針轉換爲所需要的類型。例如:

      int *p = NULL; 
      p = (int *)malloc(2);

      通常情況下,爲了增加代碼可移植性或者不確定某種類型所佔的字節數則用sizeof()來計算該類型所佔字節數:

      p = (int *)malloc(siezoef(int));
    • 函數realloc(): 如果數組長度不夠了怎麼辦呢,我們可以使用realloc()函數改變原來分配的空間大小,其原型爲:

      void * realloc(void *p, unsigned int size);

      需要注意的是,函數返回的新的地址不一定與原地址相同。所以一旦改變了指針的指向,原來分配的內存和數據也會丟失。

    • 函數free(): 函數free的功能是釋放向系統動態申請的由指針p指向的內存空間,由系統重新支配,該函數無返回值。其原型爲:

      void free(void *p);

      如果我們在程序中忘記釋放內存,就會造成內存泄漏。因此要儘量配套使用malloc()free()或者重複利用malloc()申請到的內存。


程序樣例:

  • 功能:

    1. 在i位置插入數字num
    2. 刪除第i個位置的數字並輸出這個數
    3. 打印當前的數組
    4. 退出程序
#include <cstdio>
#include <cmath>
#include <cstdlib>

const int addlen = 10;
const int initlen = 100;

struct sq{
    int *pos;
    int len, maxlen; 
};

bool init(sq &L){
    L.pos = (int *)malloc(initlen * sizeof(int));
    if(!L.pos) return false;
    L.len = 0, L.maxlen = initlen;
    return true;
}

bool add(sq &L, int i, int num){ 
    if(i < 1 || i > L.maxlen) return false;
    if(L.len >= L.maxlen){
        int * newpos = (int *)realloc(L.pos, (L.maxlen + addlen) * sizeof(int));
        if(!newpos) return false;
        L.pos = newpos;
        L.maxlen += addlen;
    }
    int *q = L.pos + i - 1;
    for(int *p = L.pos + L.len - 1; p >= q; p--) *(p + 1) = *p;
    *q = num;
    L.len++;
    return true;
}

bool del(sq &L, int i, int &num){
    if(i < 1 || i > L.len) return false;
    int *p = L.pos + i - 1;
    num = *p;
    for(int *p = L.pos + i; p < L.pos + L.len; p++) *(p - 1) = *p;
    L.len--;
    return true;
}

void print(sq &L){
    for(int i = 0; i < L.len; i++) printf("%d ", L.pos[i]);
    printf("\n");
}


int main()
{
    int x = 0;
    sq L;
    init(L);
    while(true){
        scanf("%d", &x);
        if(x == 1) {
            int p, num;
            scanf("%d %d", &p, &num);
            if(!add(L, p, num)) printf("can't do this\n");
        }
        else if(x == 2){
            int p, num;
            scanf("%d", &p);
            if(!del(L, p, num)) printf("can't do this\n");
            else printf("%d\n", num);
        }
        else if(x == 3) print(L);
        else if(x == 0) break;
    }
    free(L.pos);
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章