国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C/C++數(shù)據(jù)結(jié)構(gòu)之動態(tài)數(shù)組篇

這篇具有很好參考價值的文章主要介紹了C/C++數(shù)據(jù)結(jié)構(gòu)之動態(tài)數(shù)組篇。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

數(shù)據(jù)結(jié)構(gòu)之——動態(tài)數(shù)組(順序表)

1.動態(tài)數(shù)組和靜態(tài)數(shù)組

靜態(tài)數(shù)組:靜態(tài)數(shù)組在內(nèi)存中位于棧區(qū),是在編譯時就已經(jīng)在棧上分配了固定大小,程序結(jié)束由系統(tǒng)釋放。在運行時不能改變數(shù)組大小。

//靜態(tài)數(shù)組
	int N = 10;
	int a[N];	/*定義一個數(shù)組大小為10的數(shù)組,因為靜態(tài)數(shù)組在編譯階段就會確定數(shù)組大小,所以這里的N必須是一個確定的值
	如果在這里沒有給出N值的大小,會導(dǎo)致編譯失敗*/

動態(tài)數(shù)組:動態(tài)數(shù)組是malloc(在c語言中使用malloc函數(shù))或者new(在c++中使用new操作符)出來的,位于內(nèi)存的堆區(qū),它的大小是在程序運行時給定的,可以動態(tài)的改變數(shù)組的大小,以及動態(tài)的增,刪,查,改數(shù)組中的元素。

//動態(tài)數(shù)組
struct Array
{
	int* a;		//這里只需要定義一個指針,在程序運行起來之后如果在堆區(qū)開辟了一塊數(shù)組空間,就讓這個指針指向數(shù)組的首地址即可
	int size;   //size用于記錄當(dāng)前數(shù)組儲存了多少個元素
	int acpcaity;	//acpcaity用于記錄當(dāng)前數(shù)組的容量大?。ㄔ摂?shù)組最多能存儲多少個元素)
}

2.如何維護(hù)一個動態(tài)數(shù)組

c++動態(tài)數(shù)組,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),c語言,c++
根據(jù)上圖將維護(hù)一個數(shù)組分為以下三點:
1.當(dāng)數(shù)組未創(chuàng)建時只需要讓arr指針指向NULL,size,acpcaity都初始化為零,當(dāng)成功在堆區(qū)創(chuàng)建了一個數(shù)組之后我們只需要把arr指針指向該數(shù)組的首地址即可。

2.每次對數(shù)組進(jìn)行添加元素或者刪除元素時,都要對應(yīng)的對size進(jìn)行相應(yīng)的加減操作,size必須準(zhǔn)確的記錄數(shù)組中的元素個數(shù)

3.每次對數(shù)組擴(kuò)容時都要實時更新當(dāng)前數(shù)組大小給acpcaity,以便于更準(zhǔn)確的控制數(shù)組大小如果acpcaity大于數(shù)組真實容量,可能導(dǎo)致程序崩潰。
列: 如果當(dāng)前acpcaity=5;而當(dāng)前數(shù)組實際容量為4,這時通過arr[4]插入第5個元素時,就會因為非法訪問內(nèi)存而導(dǎo)致程序崩潰

如果acpcaity小于數(shù)組真實容量,會導(dǎo)致數(shù)組頻繁擴(kuò)容,造成資源浪費。

以下是一個動態(tài)數(shù)組的小案列,用C語言實現(xiàn)c++中的vector容器(沒有學(xué)過的c++的家人們完全可以忽略這句話,因為這就是一個簡單動態(tài)數(shù)組的實現(xiàn),vector容器的底層也是用動態(tài)數(shù)組實現(xiàn)的)

//頭文件(vector.h)
#pragma once
#include<stdio.h>

//如果想儲存其他數(shù)據(jù)類型只需將這里的int換成你想要儲存的數(shù)據(jù)類型即可
typedef int anytype;	//儲存int類型的數(shù)據(jù)
//typedef double anytype;     //儲存double類型的數(shù)據(jù)

typedef struct STL_Vector
{
	anytype* arr;		//定義一個指針,用于指向后面創(chuàng)建的數(shù)組的首地址
	int size;			//記錄數(shù)組當(dāng)前元素個數(shù)
	int capacity;		//記錄數(shù)組當(dāng)前容量大小
}vector;

//接口函數(shù)
void VectorInit(vector * v);				 //初始化結(jié)構(gòu)體
void Add_Capacity(vector* v);			  	 //當(dāng)數(shù)組容量不夠時擴(kuò)容
void push_back(vector* v, anytype x);		 //尾部插入元素
void push_front(vector* v, anytype x);		 //頭部插入元素
void My_print(vector v);					 //遍歷數(shù)組
void pop_back(vector* v);					 //刪除最后一個元素
int find(vector v, anytype x);				 //查找指定元素的位置,返回元素位置
void pop_front(vector* v);					 //刪除第一個元素下標(biāo)
int pos_insert(vector* v,int pos, anytype x);//指定下標(biāo)位置插入元素
int pos_delect(vector* v, int pos);			 //指定下標(biāo)位置刪除元素

以下是接口函數(shù)的實現(xiàn)

//.c文件(vector.c)
#include"vector.h"
//初始化結(jié)構(gòu)體
void VectorInit(vector* v){
	v->arr = NULL;
	v->capacity = v->size = 0;
}
//創(chuàng)建數(shù)組或?qū)σ呀?jīng)滿的數(shù)組進(jìn)行擴(kuò)容
void Add_Capacity(vector* v){
	if (v->size == v->capacity){	//當(dāng)size=capacity時,說明數(shù)組可能還未創(chuàng)建,或數(shù)組已經(jīng)滿了
		int newspace = v->capacity == 0 ? 4 : v->capacity * 2;	/*如果數(shù)組容量為零就先給4個整形的大小,否則就在原來的
		基礎(chǔ)上乘以2,每次擴(kuò)容2倍*/
		anytype* tem = (anytype*)realloc(v->arr, newspace * sizeof(anytype));
		/*1.擴(kuò)容成功,返回新空間的地址
		  2.擴(kuò)容失敗,返回NULL*/
		if (tem == NULL){
			printf("擴(kuò)容失?。?);
			exit(-1); //擴(kuò)容失敗直接退出程序
		}
		v->arr = tem;  
		v->capacity = newspace;
	}
}
//尾插數(shù)據(jù)
void push_back(vector* v, anytype x){
	Add_Capacity(v); //首先要確定數(shù)組是否創(chuàng)建,容量是否大于零,如果數(shù)據(jù)未創(chuàng)建,先創(chuàng)建數(shù)組,如果已創(chuàng)建但是容量已滿,就擴(kuò)容
	if (v->arr != NULL){
		v->arr[v->size] = x;
		v->size++;
	}
		
}
//頭插數(shù)據(jù)
void push_front(vector* v, anytype x){
	Add_Capacity(v);
	int ret = v->size;
	for (ret; ret>=0; ret--){
		v->arr[ret] = v->arr[ret-1];
	}
	if (v->arr != NULL){
		v->arr[0] = x;
		v->size++;
	}

}
//尾刪數(shù)據(jù)
void pop_back(vector* v){
	if (v->size > 0){   //首先判斷數(shù)組中是否有數(shù)據(jù),有數(shù)據(jù)才刪除,以下同理
		v->size--;
	}
}
//頭刪數(shù)據(jù)
void pop_front(vector* v){
	if (v->size > 0){
		int ret = v->size;
		for (int i= 0; i<ret; i++){
			v->arr[i] = v->arr[i+1];
		}
		v->size--;
	}
	
}
//查找數(shù)據(jù),成功返回數(shù)據(jù)下標(biāo),失敗返回-1
int find(vector v, anytype x){
	if (v.size > 0){
		for (int i = 0; i < v.size; i++){
			if (v.arr[i] == x){
				return i;
			}
		}
	}
	return -1;
}
//指定下標(biāo)添加數(shù)據(jù)
int pos_insert(vector* v, int pos, anytype x){
	Add_Capacity(v);
	if (pos >= 0 && pos <= v->size){
		int i = v->size;
		for (i - 1; pos <= i; i--){
			v->arr[i] = v->arr[i-1];
		}
		v->arr[pos] = x;
		v->size++;
		return 0;
	}
	return -1;
}
//指定下標(biāo)刪除數(shù)據(jù)
int pos_delect(vector* v, int pos){
	Add_Capacity(v);
	if (pos >= 0 && pos < v->size){
		int i = v->size;
		for (pos; pos < i; pos++){
			v->arr[pos] = v->arr[pos+1];
		}
		v->size--;
		return 0;
	}
	return -1;
}
//遍歷數(shù)組
void My_print(vector v){
	if (v.arr == NULL){
		printf("數(shù)組未創(chuàng)建!\n");
		return;
	}
	else if (v.size == 0){
		printf("數(shù)組為空!\n");
		return;
	}
	for (int i=0; i < v.size; i++){
		printf("%d ",v.arr[i]);
	}
	printf("\n");
}

3.動態(tài)數(shù)組和靜態(tài)數(shù)組的優(yōu)缺點

靜態(tài)數(shù)組
優(yōu)點:
(1).容量大小固定,下標(biāo)固定,查找數(shù)據(jù)快,效率高
缺點:
(1).如果數(shù)組滿了,就不能繼續(xù)插入數(shù)據(jù)了
(2). 很難確定數(shù)組的容量大小,給大了浪費,給大小不夠放
(3).同一個數(shù)組只能儲存一種數(shù)據(jù)類型
動態(tài)數(shù)組
優(yōu)點:
(1).可以根據(jù)數(shù)據(jù)量的大小動態(tài)擴(kuò)容和縮小容量
(2).可以通過下標(biāo)快速查找數(shù)據(jù)
缺點:
(1).頭插數(shù)據(jù),中間插入數(shù)據(jù)時,需要挪動數(shù)據(jù),速度慢效率低
(2).同一個數(shù)組只能儲存一種數(shù)據(jù)類型

面試常見考點

1.請你說說delete和free的區(qū)別

(1). delete是操作符,free是庫函數(shù)
(2). delete用于在c++中釋放new創(chuàng)建的空間,free用于釋放c語言中malloc創(chuàng)建的空間
(3). 調(diào)用free之前需要檢查要釋放的指針是否為空,而delete則不需要

2.請你說說malloc和new的區(qū)別

(1).new/delete是C++操作符,需要編譯器支持,而malloc/free是庫函數(shù),需要引入頭文件。

(2).使用new操作符申請內(nèi)存分配時無須指定內(nèi)存塊的大小,編譯器會根據(jù)類型信息自行計算。而malloc則需要指定要開辟空間的大小。

(3). new操作符內(nèi)存分配成功時,返回的是對象類型的指針,類型嚴(yán)格與對象匹配,無須進(jìn)行類型轉(zhuǎn)換,故new是符合類型安全性的操作符。而malloc內(nèi)存分配成功則是返回void * ,需要通過強制類型轉(zhuǎn)換將void*指針轉(zhuǎn)換成我們需要的類型。

(4).new內(nèi)存分配失敗時,會拋出bac_alloc異常。malloc分配內(nèi)存失敗時返回NULL。

(5). new會先調(diào)用operator new函數(shù),申請足夠的內(nèi)存(通常底層使用malloc實現(xiàn))。然后調(diào)用類型的構(gòu)造函數(shù),初始化成員變量,最后返回自定義類型指針。delete先調(diào)用析構(gòu)函數(shù),然后調(diào)用operator delete函數(shù)釋放內(nèi)存(通常底層使用free實現(xiàn))。

(6). C++允許重載new/delete操作符,特別的,布局new的就不需要為對象分配內(nèi)存,而是指定了一個地址作為內(nèi)存起始區(qū)域,new在這段內(nèi)存上為對象調(diào)用構(gòu)造函數(shù)完成初始化工作,并返回此地址。而malloc不允許重載。

(7).new操作符從自由存儲區(qū)(free store)上為對象動態(tài)分配內(nèi)存空間,而malloc函數(shù)從堆上動態(tài)分配內(nèi)存。自由存儲區(qū)是C++基于new操作符的一個抽象概念,凡是通過new操作符進(jìn)行內(nèi)存申請,該內(nèi)存即為自由存儲區(qū)。而堆是操作系統(tǒng)中的術(shù)語,是操作系統(tǒng)所維護(hù)的一塊特殊內(nèi)存,用于程序的內(nèi)存動態(tài)分配,C語言使用malloc從堆上分配內(nèi)存,使用free釋放已分配的對應(yīng)內(nèi)存。自由存儲區(qū)不等于堆,如上所述,布局new就可以不位于堆中。
轉(zhuǎn)載自

總結(jié)

順序表應(yīng)該是數(shù)據(jù)結(jié)構(gòu)中最簡單的一個了,接下來的時間我也會更加努力的學(xué)習(xí),提升自己的同時給家人們帶來更優(yōu)質(zhì)的文章,最后希望該篇文章能幫助到大家,作者本人水平有限,如果文章中錯誤或者不足的地方歡迎大家指出。文章來源地址http://www.zghlxwxcb.cn/news/detail-590650.html

到了這里,關(guān)于C/C++數(shù)據(jù)結(jié)構(gòu)之動態(tài)數(shù)組篇的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu)03:棧、隊列和數(shù)組 隊習(xí)題01[C++]

    數(shù)據(jù)結(jié)構(gòu)03:棧、隊列和數(shù)組 隊習(xí)題01[C++]

    ?? 考研筆記整理~???? 之前的博文鏈接在此:數(shù)據(jù)結(jié)構(gòu)03:棧、隊列和數(shù)組_-CSDN博客~???? 本篇作為鏈表的代碼補充,供小伙伴們參考~???? 第1版:王道書的課后習(xí)題~???? 編輯: 梅頭腦?? 參考用書: 王道考研《2025年 數(shù)據(jù)結(jié)構(gòu)考研復(fù)習(xí)指導(dǎo)》 目錄 ??01 不犧牲存儲單

    2024年04月13日
    瀏覽(11)
  • 【C語言 數(shù)據(jù)結(jié)構(gòu)】數(shù)組與對稱矩陣的壓縮存儲

    【C語言 數(shù)據(jù)結(jié)構(gòu)】數(shù)組與對稱矩陣的壓縮存儲

    提到數(shù)組,大家首先會想到的是:很多編程語言中都提供有數(shù)組這種數(shù)據(jù)類型,比如 C/C++、Java、Go、C# 等。但本節(jié)我要講解的不是作為數(shù)據(jù)類型的數(shù)組,而是數(shù)據(jù)結(jié)構(gòu)中提供的一種叫數(shù)組的存儲結(jié)構(gòu)。 和線性存儲結(jié)構(gòu)相比,數(shù)組最大的不同是:它存儲的數(shù)據(jù)可以包含多種“一

    2024年02月04日
    瀏覽(26)
  • 頭歌(C語言)-數(shù)據(jù)結(jié)構(gòu)與算法-數(shù)組(共7關(guān))

    任務(wù)描述 本關(guān)任務(wù):將十個數(shù)進(jìn)行從大到小的順序進(jìn)行排列。 相關(guān)知識(略) 編程要求 根據(jù)提示,在右側(cè)編輯器 Begin-End 處補充代碼。 輸入 輸入十個整數(shù)。 輸出 以從大到小的順序輸出這個十個數(shù)。 測試說明 樣例輸入: 1 2 3 4 5 6 7 8 9 10 樣例輸出: 10 9 8 7 6 5 4 3 2 1 代碼:

    2024年02月11日
    瀏覽(31)
  • 數(shù)據(jù)結(jié)構(gòu)與算法—一維數(shù)組、二維數(shù)組、矩陣、順序串、鏈接串的C++代碼實現(xiàn)

    1、一維數(shù)組:ArrayOneD.h 數(shù)組這種數(shù)據(jù)結(jié)構(gòu)可以看作線性表的推廣。數(shù)組一般采用順序存儲的方法表示。 這是一個模板類 ArrayOneD 的實現(xiàn),用于表示一維數(shù)組。它包括了 構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)、析構(gòu)函數(shù)、重載下標(biāo)運算符、重載賦值運算符、求數(shù)組長度、重新設(shè)置數(shù)組長度

    2024年02月07日
    瀏覽(38)
  • C語言自定義數(shù)據(jù)類型(二)使用結(jié)構(gòu)體數(shù)組

    C語言自定義數(shù)據(jù)類型(二)使用結(jié)構(gòu)體數(shù)組

    一個結(jié)構(gòu)體變量中可以存放一組有關(guān)聯(lián)的數(shù)據(jù)(如一個學(xué)生的學(xué)號、姓名、成績等數(shù)據(jù))。如果有 10 個學(xué)生的數(shù)據(jù)需要參加運算,顯然應(yīng)該用數(shù)組,這就是結(jié)構(gòu)體數(shù)組。結(jié)構(gòu)體數(shù)組與以前介紹過的數(shù)值型數(shù)組的不同之處在于每個數(shù)組元素都是一個結(jié)構(gòu)體類型的數(shù)據(jù),它們都分別

    2024年01月19日
    瀏覽(25)
  • 【JavaSE專欄48】Java集合類ArrayList解析,這個動態(tài)數(shù)組數(shù)據(jù)結(jié)構(gòu)你了解嗎?

    【JavaSE專欄48】Java集合類ArrayList解析,這個動態(tài)數(shù)組數(shù)據(jù)結(jié)構(gòu)你了解嗎?

    作者主頁 :Designer 小鄭 作者簡介 :3年JAVA全棧開發(fā)經(jīng)驗,專注JAVA技術(shù)、系統(tǒng)定制、遠(yuǎn)程指導(dǎo),致力于企業(yè)數(shù)字化轉(zhuǎn)型,CSDN學(xué)院、藍(lán)橋云課認(rèn)證講師。 主打方向 :Vue、SpringBoot、微信小程序 本文講解了 Java 中集合類 ArrayList 的語法、使用說明和應(yīng)用場景,并給出了樣例代碼。

    2024年02月16日
    瀏覽(27)
  • 數(shù)據(jù)結(jié)構(gòu)與算法教程,數(shù)據(jù)結(jié)構(gòu)C語言版教程?。ǖ谖宀糠帧?shù)組和廣義表詳解)五

    數(shù)據(jù)結(jié)構(gòu)與算法教程,數(shù)據(jù)結(jié)構(gòu)C語言版教程!(第五部分、數(shù)組和廣義表詳解)五

    數(shù)組和廣義表,都用于存儲邏輯關(guān)系為“一對一”的數(shù)據(jù)。 數(shù)組存儲結(jié)構(gòu),99% 的編程語言都包含的存儲結(jié)構(gòu),用于存儲不可再分的單一數(shù)據(jù);而廣義表不同,它還可以存儲子廣義表。 本章重點從矩陣的角度討論二維數(shù)組的存儲,同時講解廣義表的存儲結(jié)構(gòu)以及有關(guān)其廣度和

    2024年01月23日
    瀏覽(26)
  • 數(shù)據(jù)結(jié)構(gòu)與算法教程,數(shù)據(jù)結(jié)構(gòu)C語言版教程!(第五部分、數(shù)組和廣義表詳解)三

    數(shù)據(jù)結(jié)構(gòu)與算法教程,數(shù)據(jù)結(jié)構(gòu)C語言版教程?。ǖ谖宀糠帧?shù)組和廣義表詳解)三

    數(shù)組和廣義表,都用于存儲邏輯關(guān)系為“一對一”的數(shù)據(jù)。 數(shù)組存儲結(jié)構(gòu),99% 的編程語言都包含的存儲結(jié)構(gòu),用于存儲不可再分的單一數(shù)據(jù);而廣義表不同,它還可以存儲子廣義表。 本章重點從矩陣的角度討論二維數(shù)組的存儲,同時講解廣義表的存儲結(jié)構(gòu)以及有關(guān)其廣度和

    2024年01月21日
    瀏覽(29)
  • 數(shù)據(jù)結(jié)構(gòu) | 尋找二維數(shù)組的最大值和對應(yīng)下標(biāo) | C語言代碼

    題目: ????????本題目要求讀入M(最大為10)行N(最大為15)列個元素,找出其中最大的元素,并輸出其行列值。 輸入格式: ????????輸入在第一行中給出行數(shù)m和列數(shù)n。接下來輸入m*n個整數(shù)。 輸出格式: ????????輸出最大值的行號,列號,值。 輸入樣例: 2 3 1 2 3 4 5 6 輸

    2024年02月05日
    瀏覽(33)
  • 從0開始學(xué)C++ 第二十七課 數(shù)據(jù)結(jié)構(gòu)入門 - 數(shù)組與鏈表

    第二十七課:數(shù)據(jù)結(jié)構(gòu)入門 - 數(shù)組與鏈表 學(xué)習(xí)目標(biāo): 理解數(shù)組的基本概念和操作。 掌握鏈表的基本結(jié)構(gòu)與特點。 學(xué)會在C++中定義和操作數(shù)組和鏈表。 了解數(shù)組和鏈表的基本使用場景。 學(xué)習(xí)內(nèi)容: 數(shù)組(Array) 概念:數(shù)組是一種線性數(shù)據(jù)結(jié)構(gòu),用一段連續(xù)的內(nèi)存空間來存儲

    2024年01月23日
    瀏覽(47)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包