數組(數據結構)

一、什么叫數組

1、數組

元素類型相同,大小相等

// 數組寫法:
int a[10];

int *pArr = (int *)malloc(sizeof(int) * len);

2、確定一個數組,需要幾個參數?

3個:第一個元素的地址;數組的長度;有效元素的個數。

二、用數組實現一個類ArrayList(數組中常用操作的實現)

// Arr.c
#include <stdio.h>
#include <malloc.h> // 包含了malloc函數
#include <stdlib.h> // 包含了exit函數
#include <stdbool.h> // 包含了bool類型

struct Arr
{
    int *pBase; // 存儲的是數組第一個元素的地址
    int len; // 數組所能容納的最大元素的個數
    int cnt; // 當前數組有效元素的個數
    // int increment; // 自動增長因子(數組按照這個因子來擴充空間)
    // allocate();動態內存的擴充
};
// 定義了一個數據類型,名字叫struct Arr,含有3個成員,分別是pBase、len和cnt。
// 并沒有定義變量,因此并沒有分配內存。

void init_arr(struct Arr *pArr, int length); // 初始化
bool append_arr(struct Arr *pArr, int val); // 追加
bool insert_arr(struct Arr *pArr, int pos, int val); // 添加。pos的值從1開始
bool delete_arr(struct Arr *pArr, int pos, int *pVal); // 刪除
// 返回刪除成功與失敗;返回刪除的值
int get(); // 獲得某個下標處的值
bool is_empty(struct Arr *pArr);
bool is_full();
void sort_arr(); // 排序
void show_arr(struct Arr *pArr); // 顯示輸出
void inverse_arr(); // 倒置

int main()
{
    struct Arr arr; // 定義了一個變量,則分配了內存
    // 但因為只定義沒有進行初始化,因此pBase、len、cnt里面都保存的是垃圾數字
    // 初始化可以讓變量的成員保存的不再是垃圾數字,而是有意義的值
    int val = 0;  // 用于接收刪除的值

    init_arr(&arr, 6);
    show_arr(&arr);

    append_arr(&arr, 1);
    append_arr(&arr, 2);
    append_arr(&arr, 3);
    append_arr(&arr, 4);
    append_arr(&arr, 5);
    // append_arr(&arr, 6);
    // append_arr(&arr, 7);  // 數組只可以插入6個,因此追加不進去了
    show_arr(&arr);

    insert_arr(&arr, 1, 99);
    show_arr(&arr);

    delete_arr(&arr, 1, &val);

    return 0;
}

void init_arr(struct Arr *pArr, int length)
{
    (*pArr).len = 99;
    pArr->pBase = (int *)malloc(sizeof(int) * length); // pArr指針變量指向的結構體變量中的pBase成員
    if(NULL == pArr->pBase)  // malloc分配不成功時,會把NULL賦給pBase
    {
        printf("動態分配內存失敗!\n");
        exit(-1);  // 終止整個程序
    }
    else
    {
        pArr->len = length;
        pArr->cnt = 0;
    }
    return;
}

void show_arr(struct Arr *pArr)
{
    /* if(數組為空)
        提示用戶數組為空
    else
        顯示數組有效內容 */
    if(is_empty(pArr))
    {
        printf("數組為空!\n");
    }
    else
    {
        int i = 0;
        for(i = 0; i < pArr->cnt; ++i)
        {
            printf("%d", pArr->pBase[i]);
        }
    }
}

bool is_empty(struct Arr *pArr)
{
    if(0 == pArr->cnt)
    {
        return true;
    }
    else
    {
        return false;
    }
}

bool is_full(struct Arr *pArr)
{
    if(pArr->cnt == pArr->len)
        return true;
    else
        return false;
}

bool append_arr(struct Arr *arr, int val)
{
    if(is_full(pArr))
        return false;
    else
    {
        pArr->pBase[pArr->cnt] = val;
        (pArr->cnt)++;
        return true;
    }
}

bool insert_arr(struct Arr *pArr, int pos, int val)
{
    int i = 0;
    if(is_full(pArr))
        return false;
    if(pos <1 || pos > pArr->cnt+1)
        return false;
    for(i = pArr->cnt-1; i >= pos-1; i--)
    {
        pArr->pBase[i+1] = pArr->pBase[i];
    }
    pArr->pBase[pos-1] = val;
    (pArr->cnt)++;
    return true;
}

bool delete_arr(struct Arr *pArr, int pos, int *pVal)
{
    int i = 0;
    if(is_empty(pArr))
        return false;
    if(pos < 1 || pos>pArr->cnt)
        return false;

    *pVal = pArr->pBase[pos-1];
    for(i = pos; i<pArr->cnt; i++)
    {
        pArr->pBase[i-1] = pArr->pBase[i];
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 國家電網公司企業標準(Q/GDW)- 面向對象的用電信息數據交換協議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 11,121評論 6 13
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,754評論 18 399
  • java筆記第一天 == 和 equals ==比較的比較的是兩個變量的值是否相等,對于引用型變量表示的是兩個變量...
    jmychou閱讀 1,516評論 0 3
  • 上自習時,一走神,想到我未來會是什么樣子的呢? 辦公族還是記者?覺得自己都不適合,突然好迷惘。 一年又一年,好快。
    等風的獅子閱讀 162評論 0 0
  • 隨著網絡劇《最好的我們》播出完畢!雖然經歷過磕磕碰碰,但是女一號耿耿最終還是和男一號余淮終于在一起了!也許...
    沒有單車后座閱讀 749評論 12 6