面向過程方法利用結構體寫數組

線性存儲:把所有的結點用一根直線穿起來:


連續存儲:數組

離散存儲:鏈表


利用結構體寫數組主要有三個因素:

數組最大長度、數組當前長度、指向數組的第一個元素地址的指針變量(數組的首地址)


#include<cstdio>
#include<malloc.h>
/*
    定義了一個數據類型,該數據類型的名字叫做struct Arr
*/
struct Arr{

    int * pBase;//數組第一個元素的首地址
    int len; //數組所能容納的元素的最大個數
    int cnt;// 數組的當前有效個數

};

void init_arr(struct Arr * pArr,int length);//初始化
bool append_arr(struct Arr * arr,int val);//在後面追加元素
bool insert_arr(struct Arr * arr,int pos,int val);//插入元素
//pos的值從1開始
bool delete_arr();//刪除元素
int get();//獲得元素
void sort_arr();
void show(struct Arr * arr);
void insersion();//倒置整個數組,還沒實現。用兩個“指針”一個指向頭,一個指向尾就可以。直到兩個重合爲止

int main(){
    struct Arr arr;
    init_arr(&arr,20);
    show(&arr);
    append_arr(&arr,6);
    append_arr(&arr,8);
    append_arr(&arr,10);
    append_arr(&arr,106);
    append_arr(&arr,888);
    show(&arr);
    printf("\n");
    insert_arr(&arr,3,18);
    show(&arr);
    return 0;
    
}
void init_arr(struct Arr * pArr,int length){
    pArr->pBase =(int *)malloc(sizeof(int)*length);
    //如果內存滿了,無法再分配,就會把NULL賦給pBase
    if(pArr->pBase==NULL){
        printf("動態內存分配失敗...\n");
        //如果動態內存分配失敗的話,應該終止整個程序
        exit(-1);//終止整個程序
    }else{
        pArr->len = length;
        pArr->cnt = 0;
        printf("動態內存分配成功...\n");
    }
    return ;//寫return的目的是 這個函數終止了。
}
void show(struct Arr * arr){
    if(arr->cnt==0){
        printf("數組當前爲空數組...\n");
    }else{
        for(int i = 0;i<arr->cnt;i++){
            printf("%d ",arr->pBase[i]);
        }
    }

}
bool append_arr(struct Arr * arr,int val){
    //如果數組滿的話就不能放了
    if(arr->cnt==arr->len){
            printf("現在數組已經滿了!!不能放了!!!\n");
        return false;
    }else{
        arr->pBase[arr->cnt] = val;
        (arr->cnt)+=1;
        printf("當前數組中的個數是%d個\n",arr->cnt);
        return true;
    }
}

bool insert_arr(struct Arr * arr,int pos,int val){
    //pos的值從1開始
    if(arr->cnt==arr->len){
            printf("現在數組已經滿了!!不能放了!!!\n");
        return false;
    }
    //這裏pos值不能小於0,並且不能大於整個數組的總長度
    else if(pos>arr->len||pos<1){
        return false;
    }else{
        /*
                插入的時候,先移動,再把數值插入進去,要先騰出地方來
            否則就把數給蓋住了
                移動數字的時候,先移動後面的,再移動前面的。
        */
        //這裏如果難理解的話,可以畫畫圖加深理解
        int i;
        for(int i = arr->cnt-1;i>=pos-1;i--){
            //pos是位置,pos-1就是下標了
            arr->pBase[i+1] = arr->pBase[i];
        }
        arr->pBase[pos-1] = val;
        arr->cnt+=1;//因爲插入了一個元素,因此當前長度要加1,否則show函數會有問題
        return true;




    }

}




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