順序表(動態陣列)
阿新 • • 發佈:2018-12-15
一、動態陣列的框架搭建
1.先新增DynamicAyyar.h標頭檔案,01動態陣列.c原始檔(有主函式)和DynamicAray.c原始檔(沒有主函式);
2.在DynamicAyyar.h新增以下內容:
動態陣列的結構體;
對結構體進行操作的一系列函式;
#ifndef DYNAMIC_ARRAY_H #define DYNAMIC_ARRAY_H #include<stdlib.h> #include<stdio.h> #include<string.h> //動態陣列的結構體定義完了 typedef struct DYNAMICARRAY{ int* pAddr; //存放資料的地址 int size; //當前有多少個元素 int capacity; //容量,我容器當前最大能容納多少元素 }Dynamic_Array; //寫一系列的相關對DYNAMICARRAY結構體操作的函式 //初始化 Dynamic_Array* Init_Array(); //插入 void PushBack_Array(Dynamic_Array* arr,int value); //根據位置刪除 void RemoveByPos_Array(Dynamic_Array* arr,int pos); //根據值刪除 void RemoveByValue_Array(Dynamic_Array* arr, int value); //查詢 int Find_Array(Dynamic_Array* arr, int value); //列印 void Print_Array(Dynamic_Array* arr); //釋放動態陣列的記憶體 void FreeSpace_Array(Dynamic_Array* arr); //清空陣列 void Clear_Array(Dynamic_Array* arr); //獲得動態陣列容量 int Capacity_Array(Dynamic_Array* arr); //獲得動態資料當前元素個數 int Size_Array(Dynamic_Array* arr); //根據位置獲得某個位置元素 int At_Array(Dynamic_Array* arr,int pos); #endif
3.在DynamicAyyar.c中新增一下內容:
各種函式功能的實現框架;
#include "DynamicArray.h"; //初始化 Dynamic_Array* Init_Array(){ } //插入 void PushBack_Array(Dynamic_Array* arr, int value){ } //根據位置刪除 void RemoveByPos_Array(Dynamic_Array* arr, int pos){ } //根據值刪除 void RemoveByValue_Array(Dynamic_Array* arr, int value){ } //查詢 int Find_Array(Dynamic_Array* arr, int value){ return 0; } //列印 void Print_Array(Dynamic_Array* arr){ } //釋放動態陣列的記憶體 void FreeSpace_Array(Dynamic_Array* arr){ } //清空陣列 void Clear_Array(Dynamic_Array* arr){ } //獲得動態陣列容量 int Capacity_Array(Dynamic_Array* arr){ return 0; } //獲得動態資料當前元素個數 int Size_Array(Dynamic_Array* arr){ return 0; } //根據位置獲得某個位置元素 int At_Array(Dynamic_Array* arr, int pos){ return 0; }
3.在動態陣列.c中新增主函式:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "DynamicArray.h";
void main(){
printf("\n");
system("pause");
return 0;
}
編譯通過,沒問題!
二、動態陣列的功能實現
1.在DynamicAyyar.c中新增以下內容:
各種函式功能的具體實現;
#include"DynamicArray.h" //動態陣列的初始化 Dynamic_Array* Init_Array(){ //申請記憶體 Dynamic_Array* myArray = (Dynamic_Array*)malloc(sizeof(Dynamic_Array)); //初始化 myArray->size = 0; myArray->capacity = 20; myArray->pAddr = (int*)malloc(sizeof(int)*myArray->capacity); return myArray; } //插入 void PushBack_Array(Dynamic_Array* arr, int value){ if (arr == NULL){ return; } //判斷空間是否足夠 if (arr->size == arr->capacity){ //第一步 申請一塊更大的記憶體空間 新空間是舊空間的2倍 int* newSpace = (int*)malloc(sizeof(int) * arr->capacity * 2); //第二步 拷貝資料到新的空間 memcpy(newSpace,arr->pAddr,arr->capacity * sizeof(int)); //第三步 釋放舊空間的記憶體 free(arr->pAddr); //更新容量 arr->capacity = arr->capacity * 2; arr->pAddr = newSpace; } //插入新元素 arr->pAddr[arr->size] = value;//尾部增加資料 arr->size++; } //根據位置刪除 void RemoveByPos_Array(Dynamic_Array* arr, int pos){ if (arr == NULL){ return; } //判斷位置是否有效 if(pos < 0 || pos >= arr->size){ return; } //刪除元素 for (int i = pos; i < arr->size -1; i ++){ arr->pAddr[i] = arr->pAddr[i + 1]; } arr->size--; } //根據值刪除value第一次出現的位置 void RemoveByValue_Array(Dynamic_Array* arr, int value){ if (arr == NULL){ return; } //找到值的位置 int pos = Find_Array(arr,value); //根據位置刪除 RemoveByPos_Array(arr, pos); } //查詢 int Find_Array(Dynamic_Array* arr, int value){ if (arr == NULL){ return -1; } //找到值的位置 int pos = -1;//說明沒有找到該元素的位置 for (int i = 0; i < arr->size; i++){ if (arr->pAddr[i] == value){ pos = i; break; } } return pos; } //列印 void Print_Array(Dynamic_Array* arr){ if (arr == NULL){ return; } for (int i = 0; i < arr->size;i++){ printf("%d ",arr->pAddr[i]); } printf("\n"); } //釋放動態陣列的記憶體 void FreeSpace_Array(Dynamic_Array* arr){ if (arr == NULL){ return; } if (arr->pAddr != NULL){ free(arr->pAddr); } free(arr); } //清空陣列 void Clear_Array(Dynamic_Array* arr){ if (arr == NULL){ return; } //pAddr -> 空間 arr->size = 0; } //獲得動態陣列容量 int Capacity_Array(Dynamic_Array* arr){ if (arr == NULL){ return -1; } return arr->capacity; } //獲得動態資料當前元素個數 int Size_Array(Dynamic_Array* arr){ if (arr == NULL){ return -1; } return arr->size; } //根據位置獲得某個位置元素 int At_Array(Dynamic_Array* arr, int pos){ return arr->pAddr[pos]; }
2.測試,在動態陣列.c裡面新增以下內容:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include"DynamicArray.h"
void test01(){
//初始化動態陣列
Dynamic_Array* myArray = Init_Array();
//列印容量
printf("陣列容量:%d\n", Capacity_Array(myArray));
printf("陣列大小:%d\n", Size_Array(myArray));
//插入元素
for (int i = 0; i < 10;i++){
PushBack_Array(myArray, i);
}
printf("陣列容量:%d\n", Capacity_Array(myArray));
printf("陣列大小:%d\n", Size_Array(myArray));
//列印
Print_Array(myArray);
//刪除
RemoveByPos_Array(myArray,0);
RemoveByValue_Array(myArray,7);
//列印
Print_Array(myArray);
//查詢值為5的位置
int pos = Find_Array(myArray, 5);
printf("5查詢到:pos:%d %d\n", pos, At_Array(myArray, pos));
//銷燬
FreeSpace_Array(myArray);
}
int main(void){
test01();
system("pause");
return 0;
}
結果為:
以上就是順序表的實現過程!