最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言多維數(shù)組數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)詳解

 更新時(shí)間:2021年12月12日 11:42:47   作者:落別雨  
對(duì)于數(shù)組想必大家都不陌生首先得要知道的是對(duì)于數(shù)組元素在內(nèi)存存儲(chǔ)是連續(xù)性的,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言多維數(shù)組數(shù)據(jù)結(jié)構(gòu)的相關(guān)資料,需要的朋友可以參考下

數(shù)據(jù)結(jié)構(gòu)之多維數(shù)組

定義結(jié)構(gòu)體

typedef struct {

	ElemType* base;//數(shù)組元素基址(數(shù)組基址)
	int dim;//數(shù)組維數(shù)
	int* bounds;//數(shù)組維界基址(存放各位長(zhǎng)度信息)
	int* constants;//數(shù)組映象函數(shù)常量基址
}Array;

各基本操作函數(shù)原型說(shuō)明

(1)創(chuàng)建數(shù)組

//若函數(shù)參數(shù)合法,則構(gòu)建數(shù)組A
Status InitArray(Array* A, int dim, ...);

(2)銷(xiāo)毀數(shù)組

//銷(xiāo)毀數(shù)組
Status DestroyArray(Array* A);

(3)數(shù)組的定位

//獲取元素位置(數(shù)組定位)
Status LocateArray(Array A, va_list ap, int* offset);

(4)數(shù)組元素的賦值

//A為n維數(shù)組,e為元素變量,隨后是n個(gè)下標(biāo)值
//若下標(biāo)不超界,則將e的值賦給所指定的A的元素(賦值)
Status SetArray(Array* A, ElemType e, ...);

(5)獲取數(shù)組元素

//A為n維數(shù)組,e為元素變量,隨后是n個(gè)下標(biāo)值
//若下標(biāo)不超界,則將e賦值為所指定的A的元素(獲?。?
Status GetValue(ElemType* e, Array A, ...);

各基本操作的具體實(shí)現(xiàn)

(1)創(chuàng)建數(shù)組函數(shù)實(shí)現(xiàn)

//創(chuàng)建多維數(shù)組
Status InitArray(Array* A, int dim, ...) {
	if (dim <1 || dim>MAX_ARRAY_DIM) return ERROR;//參數(shù)不合法
	A->dim = dim;
	A->bounds = (int*)malloc(sizeof(int) * dim);
	if (!A->bounds) return OVERFLOW;//分配內(nèi)存失敗
	//若各維長(zhǎng)度合法,則存入A.bounds,并求出A的元素總數(shù)elemtotal
	int elemtotal = 1;
	va_list ap;
	va_start(ap, dim);
	for (int i = 0; i < dim; ++i) {
		A->bounds[i] = va_arg(ap, int);
		if (A->bounds[i] < 0)return UNDERFLOW;
		elemtotal *= A->bounds[i];
	}
	va_end(ap);
	//為數(shù)組分配內(nèi)存空間內(nèi)
	A->base = (ElemType*)malloc(sizeof(ElemType) * elemtotal);
	if (!A->base) return OVERFLOW;//分配內(nèi)存失敗
	//求映像函數(shù)Ci,并存入A.constants[i-1],i = 1,...,dim;
	A->constants = (int*)malloc(sizeof(int) * dim);
	if (!A->constants) return OVERFLOW;//分配內(nèi)存失敗
	A->constants[dim - 1] = 1;
	for (int i = dim - 2; i >= 0; --i) {
		A->constants[i] = A->bounds[i + 1] * A->constants[i + 1];
	} 
	return OK;
}

(2)銷(xiāo)毀數(shù)組函數(shù)實(shí)現(xiàn)

//銷(xiāo)毀數(shù)組
Status DestroyArray(Array* A) {
	if (!A->base) return ERROR;
	free(A->base);
	A->base = NULL;
	if (!A->bounds) return ERROR;
	free(A->bounds);
	A->bounds = NULL;
	if (!A->constants) return ERROR;
	free(A->constants);
	A->constants = NULL;
	return OK;
}

(3)數(shù)組定位函數(shù)實(shí)現(xiàn)

//數(shù)組的定位
Status LocateArray(Array A, va_list ap, int* offset) {
	int i, instand;
	//若ap指示的元素下標(biāo)合理,則求出元素相對(duì)位置,返回到offset
	*offset = 0;
	for (i = 0; i < A.dim; i++) {
		instand = va_arg(ap, int);
		if (instand < 0 || instand > A.bounds[i]) {
		//	printf("instand = %d,定位失敗\n",instand);//調(diào)試代碼
			return ERROR;
		}
		*offset += A.constants[i] * instand;
	}
	return  OK;
}

(4)數(shù)組元素賦值函數(shù)實(shí)現(xiàn)

//數(shù)組賦值
Status SetArray(Array *A, ElemType e, ...) {
	va_list ap;
	int offset;
	va_start(ap, e);
	if (LocateArray(*A, ap, &offset) == ERROR) return ERROR;
	va_end(ap); 
	*(A->base + offset) = e;
	return OK;
}

(5)取出數(shù)組元素函數(shù)實(shí)現(xiàn)

//獲取數(shù)組元素的值,并用E返回
Status GetValue(ElemType* e, Array A, ...) {
	va_list ap;
	int offset;
	va_start(ap, A);
	if (LocateArray(A, ap, &offset) == ERROR) return ERROR;
	va_end(ap);
	*e = *(A.base + offset);
	return OK;
}

測(cè)試分析

創(chuàng)建

創(chuàng)建一個(gè)二維數(shù)組,其第一維長(zhǎng)度為4,第二維長(zhǎng)度為3。

測(cè)試代碼:

運(yùn)行結(jié)果:

銷(xiāo)毀

將結(jié)構(gòu)體A的地址傳入到DestroyArray函數(shù)中,執(zhí)行操作。

測(cè)試代碼:

運(yùn)行結(jié)果:

數(shù)組元素賦值

定義二維數(shù)組B[4][3],通過(guò)SetArray函數(shù)將其值賦給數(shù)組A,通過(guò)遍歷輸出A中元素的值,則可以判斷出賦值是否準(zhǔn)確。

測(cè)試代碼:

運(yùn)行結(jié)果:

取出數(shù)組元素

測(cè)試代碼:

運(yùn)行結(jié)果:

思考與小結(jié)

1、 對(duì)數(shù)組的再認(rèn)識(shí)

存儲(chǔ)器的結(jié)構(gòu)是一維線(xiàn)性的結(jié)構(gòu),數(shù)組是多維的結(jié)構(gòu)。如果要將一個(gè)多維的結(jié)構(gòu)放在一個(gè)一維的存儲(chǔ)單元里,就必須先將多維的數(shù)組轉(zhuǎn)換成一個(gè)一維的線(xiàn)性序列,才能將其放在存儲(chǔ)器當(dāng)中。數(shù)組的存儲(chǔ)方式主要有兩種:一張是以行序?yàn)橹鞯拇鎯?chǔ)方式,另外一種是以列序?yàn)橹鞯拇鎯?chǔ)方式。

2、調(diào)試過(guò)程中遇到的問(wèn)題及解決方案

1、兩次編譯報(bào)錯(cuò)

①錯(cuò)誤信息:va_start argument must not have reference type and must not be parenthesized;

va_start函數(shù)的運(yùn)用問(wèn)題,函數(shù)原型:void va_start(va_list ap,parmN);報(bào)錯(cuò)原因?yàn)閰?shù)不正確。查看c語(yǔ)言開(kāi)發(fā)手冊(cè),得出原因。

ap 一個(gè)va_list類(lèi)型的實(shí)例

Prmhn 第一個(gè)變量參數(shù)前的命名參數(shù)

②錯(cuò)誤信息:*LNK2019 無(wú)法解析的外部符號(hào) "int __cdecl SetArray(struct Array ,int,int,…)" (?SetArray@@YAHPAUArray@@HHZZ),函數(shù) _main 中引用了該符號(hào)

此錯(cuò)誤信息為,找的到定義卻又未找到實(shí)現(xiàn)的函數(shù),故需將函數(shù)實(shí)現(xiàn)后才能調(diào)用,同時(shí)注意參數(shù)的對(duì)應(yīng),避免出現(xiàn)以上問(wèn)題。

2、運(yùn)行時(shí)報(bào)錯(cuò)

運(yùn)行時(shí)報(bào)錯(cuò),數(shù)據(jù)訪(fǎng)問(wèn)出現(xiàn)問(wèn)題。通過(guò)檢查報(bào)錯(cuò)信息的前后語(yǔ)句,發(fā)現(xiàn)在訪(fǎng)問(wèn)數(shù)組的時(shí)候忘記i+1,導(dǎo)致i走到-1形成錯(cuò)誤原因。

3、運(yùn)行結(jié)果出錯(cuò)

運(yùn)行結(jié)果出現(xiàn)了地址與數(shù)值都輸出的情況,通過(guò)調(diào)試,發(fā)現(xiàn)第一次進(jìn)入LocateArray函數(shù)之后,函數(shù)返回了ERROR,通過(guò)打印語(yǔ)句檢查,函數(shù)確實(shí)進(jìn)入了判斷語(yǔ)句內(nèi),返回ERROR;

表明參數(shù)不準(zhǔn)確或者函數(shù)判斷語(yǔ)句不正確,由于數(shù)值為自己控制的,故參數(shù)不準(zhǔn)確的可能性較小,仔細(xì)分析了參數(shù)臨界以及函數(shù)邏輯,將判斷參數(shù)的條件改成正確判斷語(yǔ)句。得到正確的結(jié)果。

3、算法的時(shí)間復(fù)雜度分析

InitArray函數(shù)的時(shí)間復(fù)雜度為O(n);

DestroyArray函數(shù)的時(shí)間復(fù)雜度為O(1);

LocateArray函數(shù)的時(shí)間復(fù)雜度為O(n);

SetArray函數(shù)的時(shí)間復(fù)雜度為O(n);

GetArray函數(shù)的時(shí)間復(fù)雜度為O(n);

SetArray函數(shù)和GetArray函數(shù)的時(shí)間復(fù)雜度主要受LocateArray函數(shù)影響。

總結(jié)

到此這篇關(guān)于C語(yǔ)言多維數(shù)組數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C語(yǔ)言多維數(shù)組數(shù)據(jù)結(jié)構(gòu)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++實(shí)現(xiàn)LeetCode(86.劃分鏈表)

    C++實(shí)現(xiàn)LeetCode(86.劃分鏈表)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(86.劃分鏈表),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 判斷兩顆二叉樹(shù)是否相似的兩種方法

    判斷兩顆二叉樹(shù)是否相似的兩種方法

    今天小編就為大家分享一篇關(guān)于判斷兩顆二叉樹(shù)是否相似的兩種方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • C++ Qt屬性系統(tǒng)詳細(xì)介紹

    C++ Qt屬性系統(tǒng)詳細(xì)介紹

    這篇文章主要介紹了C++ Qt屬性系統(tǒng)詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • c語(yǔ)言 字符串轉(zhuǎn)大寫(xiě)的簡(jiǎn)單實(shí)例

    c語(yǔ)言 字符串轉(zhuǎn)大寫(xiě)的簡(jiǎn)單實(shí)例

    這篇文章主要介紹了c語(yǔ)言 字符串轉(zhuǎn)大寫(xiě)的簡(jiǎn)單實(shí)例,有需要的朋友可以參考一下
    2013-12-12
  • C語(yǔ)言中枚舉與聯(lián)合體的使用方法(enum union)

    C語(yǔ)言中枚舉與聯(lián)合體的使用方法(enum union)

    枚舉的意思就是列舉,將每一個(gè)可能的取值都進(jìn)行一一列舉,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中枚舉與聯(lián)合體的使用方法,需要的朋友可以參考下
    2021-09-09
  • C++實(shí)現(xiàn)簡(jiǎn)單五子棋游戲

    C++實(shí)現(xiàn)簡(jiǎn)單五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • C語(yǔ)言算法的時(shí)間復(fù)雜度和空間復(fù)雜度

    C語(yǔ)言算法的時(shí)間復(fù)雜度和空間復(fù)雜度

    這篇文章主要介紹了C語(yǔ)言算法的時(shí)間復(fù)雜度和空間復(fù)雜度,算法在編寫(xiě)成可執(zhí)行程序后,運(yùn)行時(shí)需要耗費(fèi)時(shí)間資源和空間(內(nèi)存)資源,更多相關(guān)需要的朋友可以參考一下
    2022-07-07
  • 基于c中使用ftruncate()前需要fflush(),使用后需要rewind()的深入探討

    基于c中使用ftruncate()前需要fflush(),使用后需要rewind()的深入探討

    本篇文章是對(duì)在c中使用ftruncate()前需要fflush(),使用后需要rewind()進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Linux下用Valgrind做檢查(防止內(nèi)存泄露)

    Linux下用Valgrind做檢查(防止內(nèi)存泄露)

    Valgrind是一款基于模擬linux下的程序調(diào)試器和剖析器的軟件套件,可以運(yùn)行于x86, amd64和ppc32架構(gòu)上。valgrind包含一個(gè)核心,它提供一個(gè)虛擬的CPU運(yùn)行程序,還有一系列的工具,它們完成調(diào)試,剖析和一些類(lèi)似的任務(wù)
    2014-01-01
  • VS2019+Opencv4.0+Win10配置詳解

    VS2019+Opencv4.0+Win10配置詳解

    這篇文章主要介紹了VS2019+Opencv4.0+Win10配置詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04

最新評(píng)論

永丰县| 高阳县| 洞头县| 东源县| 江城| 汉川市| 合山市| 威宁| 阳朔县| 如皋市| 横山县| 武平县| 宜宾市| 彭泽县| 璧山县| 林州市| 军事| 曲水县| 乐平市| 固始县| 西华县| 汉寿县| 普兰县| 阿克| 增城市| 额尔古纳市| 嵊州市| 东城区| 凤城市| 宽城| 大厂| 昌宁县| 玉田县| 河南省| 红原县| 班戈县| 天峨县| 樟树市| 双鸭山市| 苏州市| 宁武县|