zoukankan      html  css  js  c++  java
  • 12、顺序表的顺序存储结构

    动态数组实现

    动态数组头文件:DynamicArray.h

     1 #ifndef DYNAMIC_ARRAY_H
     2 #define DYNAMIC_ARRAY_H
     3 
     4 #include<stdio.h>
     5 #include<stdlib.h>
     6 #include<string.h>
     7 //动态增长内存,策略:将存放数据的内存放到?堆上
     8 //动态数组 如果5个元素 申请内存 拷贝数据 释放内存 插入第七个?太麻烦了!!!!
     9 //用capacity保存容量  用size记录当前数组中具体的元素个数
    10 
    11 typedef struct DYNAMICARRAY {
    12     int *pAddr;//存放数据的地址
    13     int size;//当前有多少个元素
    14     int capacity;//容量,最大能容纳多少个元素
    15 }Dynamic_Array;
    16 
    17 //写一系列的相关对DYNAMICARRAY结构体操作的函数
    18 //初始化
    19 Dynamic_Array* Init_Dynamic_Array();
    20 //插入
    21 void PushBack_Array(Dynamic_Array* arr,int value);
    22 //根据位置删除
    23 void RemoveByPos_Array(Dynamic_Array* arr, int pos);
    24 //根据值删除
    25 void RemoveByValue_Array(Dynamic_Array* arr, int value);
    26 //查找
    27 int Find_Array(Dynamic_Array* arr,int value);
    28 //打印
    29 void Print_Array(Dynamic_Array* arr);
    30 //释放动态数组的内存
    31 void FreeSpace_Array(Dynamic_Array* arr);
    32 
    33 //清空数组
    34 void Clear_Array(Dynamic_Array* arr);
    35 //获取动态数组容量
    36 int Capacity_Array(Dynamic_Array* arr);
    37 //获取动态数据当前元素个数
    38 int Size_Array(Dynamic_Array* arr);
    39 //根据位置获得某个位置元素
    40 int At_Array(Dynamic_Array* arr, int pos);
    41 #endif

    DynamicArray.c

      1 #include"DynamicArray.h"
      2 
      3 //初始化
      4 Dynamic_Array* Init_Dynamic_Array() {
      5     //申请内存
      6     Dynamic_Array* myArray = (Dynamic_Array*)malloc(sizeof(Dynamic_Array));
      7     //初始化
      8     myArray->size = 0;
      9     myArray->capacity = 20;
     10     myArray->pAddr = (int*)malloc(sizeof(int)*myArray->capacity);
     11 
     12 
     13 
     14     return myArray;
     15 }
     16 //插入
     17 void PushBack_Array(Dynamic_Array* arr, int value) {
     18     if (arr == NULL) {
     19         return;
     20     }
     21     //判断空间是否足够
     22     if (arr->size == arr->capacity) {
     23         //第一步 申请一块更大的内存空间 新空间是旧空间的两倍
     24 
     25         int* newSpace = (int*)malloc(sizeof(int)*arr->capacity * 2);
     26         //第二步 拷贝数据到新的空间
     27         memcpy(newSpace, arr->pAddr, arr->capacity*sizeof(int));
     28         //释放旧空间的内存
     29         free(arr->pAddr);
     30         //更新容量
     31         arr->capacity = arr->capacity * 2;
     32         arr->pAddr = newSpace;
     33     }
     34     //插入新元素
     35     arr->pAddr[arr->size] = value;
     36     arr->size++;
     37 
     38 }
     39 //根据位置删除
     40 void RemoveByPos_Array(Dynamic_Array* arr, int pos) {
     41     if (arr == NULL) {
     42         return;
     43     }
     44     //判断位置是否有效
     45     if (pos < 0 || pos >= arr->size) {
     46         return;
     47     }
     48     //删除元素    如果删除不是最后位置,将删除位置后继元素前移
     49     for (int i = pos; i < arr->size-1; i++)
     50         arr->pAddr[i] = arr->pAddr[i+1];
     51     arr->size--;
     52 
     53 }
     54 //根据值删除value第一次出现的位置
     55 void RemoveByValue_Array(Dynamic_Array* arr, int value)
     56 {
     57     if (arr == NULL) {
     58         return ;
     59     }
     60     //找值的位置
     61     int pos = Find_Array(arr,value);
     62     //int pos = -1;
     63     //for (int i = 0; i < arr->size; i++) {
     64     //    if (arr->pAddr[i] == value) {
     65     //        pos = i;
     66     //        break;
     67     //    }
     68     //}
     69 
     70     //根据位置删除
     71     RemoveByPos_Array(arr, pos);
     72 
     73 }
     74 //查找value的位置
     75 int Find_Array(Dynamic_Array* arr, int value) {
     76     if (arr == NULL) {
     77         return -1;
     78     }
     79     //找值的位置
     80     int pos = -1;
     81     for (int i = 0; i < arr->size; i++) {
     82         if (arr->pAddr[i] == value) {
     83             pos = i;
     84             break;
     85         }
     86     }
     87     return pos;
     88 }
     89 
     90 
     91 //打印
     92 void Print_Array(Dynamic_Array* arr) {
     93     if (arr == NULL) {
     94         return;
     95     }
     96     for (int i = 0; i < arr->size; i++)
     97     {
     98         printf("%d ",arr->pAddr[i]);
     99     }
    100     printf("
    ");
    101 
    102 }
    103 //释放动态数组的内存
    104 void FreeSpace_Array(Dynamic_Array* arr) {
    105     if (arr == NULL) {
    106         return;
    107     }//让程序更健壮
    108 
    109     if (arr->pAddr != NULL) {
    110         free(arr->pAddr);
    111     }
    112 
    113     free(arr);
    114 }
    115 //清空数组
    116 void Clear_Array(Dynamic_Array* arr) {
    117     if (arr == NULL) {
    118         return;
    119     }
    120     //pAddr->空间
    121     arr->size = 0;
    122 
    123 }
    124 
    125 //获取动态数组容量
    126 int Capacity_Array(Dynamic_Array* arr) {
    127     if (arr == NULL) {
    128         return -1;
    129     }
    130 
    131 
    132     return arr->capacity;
    133 }//获取动态数据当前元素个数
    134 int Size_Array(Dynamic_Array* arr) {
    135 
    136     if (arr == NULL) {
    137         return -1;
    138     }
    139     return arr->size;
    140 }
    141 //根据位置获得某个位置元素
    142 int At_Array(Dynamic_Array* arr, int pos) {
    143     return arr->pAddr[pos];
    144 }

    main.c

     1 #define _CRT_SECURE_NO_WARNINGS
     2 #include<stdio.h>
     3 #include<stdlib.h>
     4 #include<string.h>
     5 #include"DynamicArray.h"
     6 
     7 void test01() {
     8     //初始化动态数组
     9     Dynamic_Array* myArray = Init_Dynamic_Array();
    10     //打印容量
    11     printf("数组容量:%d
    ", Capacity_Array(myArray));
    12     printf("数组大小:%d
    ", Size_Array(myArray));
    13     //插入元素
    14     for (int i = 0; i < 30; i++)
    15     {
    16         PushBack_Array(myArray, i);
    17     }
    18     printf("数组容量:%d
    ", Capacity_Array(myArray));
    19     printf("数组大小:%d
    ", Size_Array(myArray));
    20     //打印
    21     Print_Array(myArray);
    22 
    23     //删除
    24     RemoveByPos_Array(myArray,0);
    25     RemoveByValue_Array(myArray,27);
    26     //打印
    27     Print_Array(myArray);
    28 
    29     //查找
    30     int pos = Find_Array(myArray, 5);
    31     printf("5查找到:pos:%d %d
    ", pos, At_Array(myArray, pos));
    32 
    33     //销毁
    34     FreeSpace_Array(myArray);
    35 }
    36 
    37 
    38 int main()
    39 {
    40 
    41     test01();
    42     system("pause");
    43     return 0;
    44 }

    vs2015运行结果:

  • 相关阅读:
    document.getElementById的简便方式
    uri编解码
    javascript数组
    前端网站收藏
    html5 canvas
    interview material
    Merge into(oracle)
    机器学习入门二 ----- 机器学习术语表
    机器学习入门一 ------- 什么是机器学习,机器学习的在实际中的用处
    Dubbo 源码分析系列之一环境搭建
  • 原文地址:https://www.cnblogs.com/luanxin/p/8932990.html
Copyright © 2011-2022 走看看