数据结构作业——动态数组

关于动态数组的初步理解

摘要:动态数组的组成以及动态内存分配常用函数的原理以及使用方法。

关键字: 动态数组、 动态内存分配、 指针、 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;
}

猜你喜欢

转载自blog.csdn.net/zzzzone/article/details/77994660