可變陣列——連結串列前言
可變陣列,即陣列所佔空間大小可變的陣列。對於剛剛學完陣列,還未涉入連結串列的小萌新(比如我)來說,在解決一些題目時,常常會遇到陣列內有效資料個數未知的情況。通常,我們會建立一個滿足題目條件的足夠大的陣列,但是這樣的做法往往會浪費許多空間。至此,可變陣列的出現就應運而生了。下面,我們可以嘗試幾個關於可變陣列的函式。
建立新陣列
typedef struct
{
int *array;
int size;
} array;
//建立新陣列
array a_create(int initsize)
{
array a;
a.size = initsize;
a.array = (int *)malloc(sizeof(int *)*a.size);
return a;
}
回收陣列空間
//回收陣列空間
void a_free(array *a)
{
free(a->array);
a->size =0;
a->array = NULL;
}
檢視陣列大小
//檢視陣列大小
int a_size(const array *a)
{
return a->size;
}
陣列增長
//陣列增長
void a_inflate(array *a,int moresize)
{
int *p = (int *)malloc(sizeof(int)*(a->size + moresize));
for(int i=0; i < a->size; i++)
{
p[i] = a->array[i];
}
free(a->array);
a->array = p;
a->size += moresize;
}
訪問陣列中某個單元
//訪問陣列中某個單元
int *a_at(array *a, int index)
{
if(index >= a->size)
{
a_inflate(a, ((index/blocksize+1)*blocksize - a->size));
}
return &(a->array[index]);
}
測試一下上述功能
#include <stdio.h>
#include <stdlib.h>
#define blocksize 20
typedef struct
{
int *array;
int size;
} array;
//建立新陣列
array a_create(int initsize)
{
array a;
a.size = initsize;
a.array = (int *)malloc(sizeof(int *)*a.size);
return a;
}
//回收陣列空間
void a_free(array *a)
{
free(a->array);
a->size =0;
a->array = NULL;
}
//檢視陣列大小
int a_size(const array *a)
{
return a->size;
}
//陣列增長
void a_inflate(array *a,int moresize)
{
int *p = (int *)malloc(sizeof(int)*(a->size + moresize));
for(int i=0; i < a->size; i++)
{
p[i] = a->array[i];
}
free(a->array);
a->array = p;
a->size += moresize;
}
//訪問陣列中某個單元
int *a_at(array *a, int index)
{
if(index >= a->size)
{
a_inflate(a, ((index/blocksize+1)*blocksize - a->size));
}
return &(a->array[index]);
}
int main(int argc, char const *argv[])
{
array a = a_create(100);
printf("%d\n",a_size(&a));
*a_at(&a,0) = 10;
printf("%d\n",*a_at(&a,0));
int number;
int cnt = 0;
while(1)
{
scanf("%d", &number);
if(number==-1) break;
*a_at(&a,cnt++) = number;
}
for(int i=0;i<cnt;i++)
{
printf("%d ",*a_at(&a,i));
}
a_free(&a);
return 0;
}
執行一下,我們在終端中得到了陣列大小100,陣列0號位元素為10
再輸入1 2 3 4 5 6 7 8 9 -1,終端中輸出了陣列中各個元素
至此,可變陣列的基本框架建立完畢了。
可變陣列看似完美,但有一個缺陷:它需要整塊的記憶體空間,以首地址的指標來訪問每個單元。當沒有整塊記憶體的時候(或者說可用記憶體支離破碎),我們應該怎麼辦呢?
我們可以尋找一些可用記憶體,其記憶體大小能放下單個陣列單元,再將這些陣列單元的地址像鏈條一樣關聯起來,滿足知道其中一個單元的地址即可找到所有單元的地址,並進行訪問。
當我們要處理的元素不限於數字,而是一些資料,我們就可以通過這種方式把這些資料關聯起來。這樣的資料儲存結構,就叫做連結串列。
相關文章
- 陣列與連結串列陣列
- 陣列和連結串列陣列
- 陣列模擬單連結串列陣列
- 資料結構--陣列、單向連結串列、雙向連結串列資料結構陣列
- 線性結構 陣列與連結串列陣列
- day1-陣列和連結串列陣列
- 聊聊陣列與連結串列,棧與佇列陣列佇列
- L2-022 重排連結串列【陣列】陣列
- 線性表(陣列、連結串列、佇列、棧)詳細總結陣列佇列
- L2-002 連結串列去重【陣列】陣列
- 面試-陣列和連結串列的區別面試陣列
- 陣列模擬雙連結串列,你get到了嗎?陣列
- 陣列模擬單連結串列你會了嗎?陣列
- 資料結構--單連結串列(通過陣列實現)資料結構陣列
- 為什麼陣列查詢比連結串列要快?而插入刪除比連結串列效率低陣列
- 資料結構與演算法整理總結---陣列,連結串列資料結構演算法陣列
- C/C++ 陣列連結串列表示式計算C++陣列
- Android技能樹 — 陣列,連結串列,雜湊表基礎小結Android陣列
- 陣列二:使用陣列可變函式為陣列排序陣列函式排序
- 001 透過連結串列學習Rust筆記之前言Rust筆記
- 001 通過連結串列學習Rust筆記之前言Rust筆記
- 歸併排序:陣列和連結串列的多種實現排序陣列
- 佇列_單向連結串列佇列
- 連結串列&鏈棧&佇列佇列
- Redis 的基礎資料結構(一) 可變字串、連結串列、字典Redis資料結構字串
- 重溫四大基礎資料結構:陣列、連結串列、佇列和棧資料結構陣列佇列
- 資料結構-棧(通過陣列和單向連結串列實現)資料結構陣列
- 連結串列!比陣列更適合做增刪操作的資料結構陣列資料結構
- Java集合原始碼分析之基礎(一):陣列與連結串列Java原始碼陣列
- 《演算法圖解》NOTE 2 陣列、連結串列及選擇排序演算法圖解陣列排序
- 資料結構與演算法知識點總結(1)陣列與連結串列資料結構演算法陣列
- 連結串列 - 單向連結串列
- 連結串列-迴圈連結串列
- 連結串列-雙向連結串列
- 關於多項式的加和、乘積可用連結串列和陣列陣列
- 連結串列4: 迴圈連結串列
- 連結串列-雙向通用連結串列
- 連結串列-單連結串列實現