1. 程式人生 > >C語言實現資料結構:一.可變陣列

C語言實現資料結構:一.可變陣列

目錄

可變陣列

C語言本身提供的陣列,在定義時就需要指定陣列的長度。然而在一些場景下並不會知道需要用陣列取儲存的資料有多少個,無法明確定義陣列的長度。強行定義一個很大很大的陣列又會浪費機器的記憶體空間。這種情況下就需要一個長度可擴充套件的陣列。

構造陣列

使用結構體來定義可變陣列,包括:①.陣列頭部地址int *array ②陣列長度int szie

typedef struct{
    int *array;
    int size;
} Array;

實現可變陣列

實現可變陣列的過程包括 建立陣列下標查詢陣列長度查詢擴充套件陣列釋放陣列記憶體空間

等功能。

可執行程式碼如下:

#include <stdio.h>
#include <stdlib.h>

const int BLOCK_SIZE = 20;
typedef struct{
    int *array;
    int size;
} Array;

Array array_create(int init_size)//建立陣列
{
    Array a;
    a.size = init_size;
    a.array = (int*)malloc(sizeof(int)*a.size);
    return a;
}

void array_free(Array *a)//釋放陣列記憶體空間
{ free(a->array); a->array = NULL; a->size = 0; } //封裝 int array_szie(const Array *a)//陣列長度查詢 { return a->size; } void array_inflate(Array *a, int more_size)//擴充套件陣列 { int *p = (int*)malloc(sizeof(int)*(a->size + more_size)); int i; for(i=0; i<a->size; ++i) p[i] = a->array
[i]; free(a->array); a->array = p; a->size += more_size; } int* array_at(Array *a, int index)//陣列下標查詢 { if(index >= a->size) array_inflate(a, (index/BLOCK_SIZE+1)*BLOCK_SIZE-a->size); return &(a->array[index]); } int main(int argc, char const *argv[]) { Array a = array_create(20); printf("%d\n", array_szie(&a)); *array_at(&a, 0) = 10; printf("%d\n", *array_at(&a, 0)); int cnt = 0; int number; while(1){ scanf("%d", &number); if(number == -1) break; *array_at(&a, ++cnt) = number; printf("%d %d\n",cnt, number);//輸出下標及對應的值 } array_free(&a); return 0; }

可變陣列的缺點

  1. 在每一次的擴充套件過程中都需要做一次原陣列的拷貝,時間複雜度為O(n),當陣列很長的時候很浪費時間。
  2. 每一次擴充套件都新申請一塊大於原陣列空間的新的記憶體區域,再將原陣列記憶體空間釋放出去。當陣列足夠大的時候,可能會出現記憶體中還有空間,陣列卻不能擴充套件的情況。

連結串列這種資料結構就很好的解決了可變陣列存在的缺點。下一篇的內容就是單向連結串列的實現

相關推薦

C語言實現資料結構.可變陣列

目錄 可變陣列 C語言本身提供的陣列,在定義時就需要指定陣列的長度。然而在一些場景下並不會知道需要用陣列取儲存的資料有多少個,無法明確定義陣列的長度。強行定義一個很大很大的陣列又會浪費機器的記憶體空間。這種情況下就需要一個長度可擴充套件的陣列。

c語言描述資料結構例項

1 線性結構的操作 1.1實驗資料 學生的學號、姓名、性別、年齡 1.2程式要求 1、用線性表的順序儲存(陣列)儲存資料 (1)鍵盤輸入你所在宿舍的同學資訊到陣列; (2)遍歷輸出所有學生資料; (3)按姓名查詢並輸出指定學生資料,統計查詢的次數; (4)把陣列內容輸

C語言實現資料結構中的鏈棧

實現方式一# include <stdio.h># include <stdlib.h>typedef char NodeData;//鏈棧typedef struct Node

c語言實現資料結構中的連結串列原始碼

#include <stdio.h> #include <stdlib.h> typedef struct LNode *List; struct LNode { int data; List next; }; struct LNode L;

領卓教育C語言資料結構------佇列

本文章適合C語言佇列的初學者,下面粉線一下我對對壘的初步理解。 1.佇列含義: 佇列是一種操作受限的線性表,其限制條件為允許在表的一端進行插入,而在表的另一端進行刪除。插入的一端叫做隊尾,刪除的一端叫做隊頭。向佇列中插入新元素的行為稱為進隊,從佇列中刪除元素的行

c語言描述資料結構應用

2 樹的操作 2.1實驗資料 學生的學號、姓名 2.2程式要求 根據輸入資料建立一棵二叉樹(第一個輸入資料作為根節點),要求:左子樹節點的學號總比根節點小,右子樹節點的學號總比根節點大。 (1)鍵盤輸入你所在宿舍的同學資訊到二叉樹; (2)按學號大小輸出所有同學資訊; (

C語言複習資料結構之簡單的二叉樹輸入和輸出操作

C語言複習之簡單的二叉樹的僅輸入輸出操作 1:結構體 typedef struct TreeNode{ _Data value; struct TreeNode * father; struct TreeNode * right; stru

C語言_資料結構_棧

#include <iostream> #include <algorithm> using namespace std; typedef int Status; #define stackElemType int #define STACK_IN

C語言描述資料結構_線性表_單鏈表

- 什麼是線性表 線性表是由n個元素(結點)組成的有限序列。n為線性表的長度,n=0是稱為空表。 - 線性表的邏輯特徵 (1)對於非空的線性表,有且有一個開始結點,它沒有直接前驅,而僅有一個直接後繼。 (2)對於非空的線性表,有且有一個終端結點,它沒有直接後繼,而僅有一個直接前驅。

C語言描述資料結構_線性表_順序表

順序表的概念和運算 - 什麼是線性表 線性表是由n個元素(結點)組成的有限序列。n為線性表的長度,n=0時稱為空表。 - 線性表的邏輯特徵 (1)對於非空的線性表,有且有一個開始結點,它沒有直接前驅,而僅有一個直接後繼。 (2)對於非空的線性表,有且有一個終端結點,它沒有直接後繼

C語言描述資料結構_計算機如何解決實際問題

計算機解決實際問題的過程 流程圖解: 過程敘述: 將問題進行資料描述形成資料集合以後,此時的資料是獨立與計算機之外的原始組織形式,稱為資料的邏輯結構。 資料集合包括: (1)數值資料 (2)非數值資料 資料的邏輯關係(結構): (1)線性 (2)非線性 對資

C語言資料結構 迷宮求解(附完整程式碼)

一、程式設計思路 1、題目:應用棧實現迷宮遊戲 要求:以書中3.2.4節迷宮求解為基礎實現迷宮遊戲,遊戲執行時顯示一個迷宮地圖(迷宮內容結構可以參照書中圖片,也可以自己編寫),玩家從地圖左上角的入口處進入迷宮,從右下角出口離開迷宮。玩家不能穿牆而過。本題目需在作

[從頭學數學] 第259節 Python實現資料結構平衡多路搜尋樹(B-Tree)

劇情提要:阿偉看到了一本比較有趣的書,是關於《計算幾何》的,2008年由北清派出版。很好奇它裡面講了些什麼,就來看看啦。 正劇開始: 星曆2016年09月08日 11:00:14, 銀河系厄爾斯星球中華帝國江南行省。 [工程師阿偉]正在和[機器小偉]一起研究[計算幾何]]。

[從頭學數學] 第260節 Python實現資料結構B+樹

劇情提要:阿偉看到了一本比較有趣的書,是關於《計算幾何》的,2008年由北清派出版。很好奇它裡面講了些什麼,就來看看啦。 正劇開始: 星曆2016年09月08日 13:04:01, 銀河系厄爾斯星球中華帝國江南行省。 [工程師阿偉]正在和[機器小偉]一起研究[計算幾何]]。

C語言實現,找出個數組中只出現次的數

題目: 一個數組中只有兩個數字是出現一次,其他所有數字都出現了兩次,找出這兩個數字,程式設計實現。 思路: 最簡單直觀的方法,我們用兩個for迴圈,外迴圈用i,內迴圈用j表示,陣列長度用len表示,外迴圈執行一次,內迴圈執行len-1次,逐一比較,如果相等

哈夫曼樹 (c語言資料結構

for(i=1;i<=len;i++){if(ht[i].w<min2&&ht[i].p==0&&i!=*s1){min2=ht[i].w;*s2=i;}}//找到另一個最小的元素 } hfmsNode *createhfms(int n)//構造哈夫曼樹 {  

C語言_資料結構_二叉樹(遞迴)

#include <iostream> #include <algorithm> #include <stack> #include <queue> using namespace std; typedef int Statu

【Linux】C語言實現資料夾拷貝

在《【Linux】利用C語言檔案流複製單一檔案》(點選開啟連結)講述瞭如何用C語言拷貝檔案,但是這隻能拷貝單一檔案。如果你要用LinuxC拷貝整個資料夾,同樣要像《【Java】利用檔案輸入輸出流完成把一個資料夾內的所有檔案拷貝的另一的資料夾的操作》(點選開啟連結)一樣,先用

C語言資料結構《運動會分數統計》

問題描述:參加運動會有n個學校,學校編號為1……n。比賽分成m個男子專案,和w個女子專案。專案編號為男子1……m,女子m+1……m+w。不同的專案取前五名或前三名積分;取前五名的積分分別為:7、5、3、2、1,前三名的積分分別為:5、3、2;哪些取前五名或前三名由學生自己設定

C語言描述資料結構———封裝DLL

vs建立dll的過程: DLL的空專案建立完成後,建立dll的標頭檔案,程式碼如下: #ifdef _myFirstDLL_H_ #define _myFirstDLL_H_ #endif #include <stdio.h> #include