線性存儲:把所有的結點用一根直線穿起來:
連續存儲:數組
離散存儲:鏈表
利用結構體寫數組主要有三個因素:
數組最大長度、數組當前長度、指向數組的第一個元素地址的指針變量(數組的首地址)
#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;
}
}