亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語言多維數(shù)組數(shù)據(jù)結構的實現(xiàn)詳解

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

數(shù)據(jù)結構之多維數(shù)組

定義結構體

typedef struct {

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

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

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

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

(2)銷毀數(shù)組

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

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

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

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

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

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

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

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

(1)創(chuàng)建數(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)存失敗
	//若各維長度合法,則存入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)銷毀數(shù)組函數(shù)實現(xiàn)

//銷毀數(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ù)實現(xiàn)

//數(shù)組的定位
Status LocateArray(Array A, va_list ap, int* offset) {
	int i, instand;
	//若ap指示的元素下標合理,則求出元素相對位置,返回到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ù)實現(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ù)實現(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;
}

測試分析

創(chuàng)建

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

測試代碼:

運行結果:

銷毀

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

測試代碼:

運行結果:

數(shù)組元素賦值

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

測試代碼:

運行結果:

取出數(shù)組元素

測試代碼:

運行結果:

思考與小結

1、 對數(shù)組的再認識

存儲器的結構是一維線性的結構,數(shù)組是多維的結構。如果要將一個多維的結構放在一個一維的存儲單元里,就必須先將多維的數(shù)組轉(zhuǎn)換成一個一維的線性序列,才能將其放在存儲器當中。數(shù)組的存儲方式主要有兩種:一張是以行序為主的存儲方式,另外一種是以列序為主的存儲方式。

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

1、兩次編譯報錯

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

va_start函數(shù)的運用問題,函數(shù)原型:void va_start(va_list ap,parmN);報錯原因為參數(shù)不正確。查看c語言開發(fā)手冊,得出原因。

ap 一個va_list類型的實例

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

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

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

2、運行時報錯

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

3、運行結果出錯

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

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

3、算法的時間復雜度分析

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

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

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

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

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

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

總結

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

相關文章

  • C語言數(shù)據(jù)結構之圖書借閱系統(tǒng)

    C語言數(shù)據(jù)結構之圖書借閱系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言數(shù)據(jù)結構之圖書借閱系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言數(shù)組任意位置插入一個元素方法

    C語言數(shù)組任意位置插入一個元素方法

    這篇文章主要給大家分享C語言數(shù)組任意位置插入一個元素方法,
    2021-11-11
  • c++將vector迭代器轉(zhuǎn)換為指針的實現(xiàn)方式

    c++將vector迭代器轉(zhuǎn)換為指針的實現(xiàn)方式

    這篇文章主要介紹了c++將vector迭代器轉(zhuǎn)換為指針的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • QT實現(xiàn)提示右下角冒泡效果

    QT實現(xiàn)提示右下角冒泡效果

    這篇文章主要為大家詳細介紹了QT實現(xiàn)提示右下角冒泡效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • C語言通訊錄管理系統(tǒng)完整版

    C語言通訊錄管理系統(tǒng)完整版

    這篇文章主要為大家詳細介紹了C語言通訊錄管理系統(tǒng)的完整版本,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 詳解C++中賦值,關系,函數(shù)調(diào)用運算符重載的實現(xiàn)

    詳解C++中賦值,關系,函數(shù)調(diào)用運算符重載的實現(xiàn)

    本文主要為大家講解一下三個C++中的運算符重載,分別是賦值運算符重載、關系運算符重載和函數(shù)調(diào)用運算符重載,感興趣的小伙伴可以跟隨小編一起學習一下
    2022-06-06
  • C語言數(shù)據(jù)結構之隊列的定義與實現(xiàn)

    C語言數(shù)據(jù)結構之隊列的定義與實現(xiàn)

    隊列是一種特殊的線性表,特殊之處在于它只允許在表的前端(head)進行刪除操作,而在表的后端(tail)進行插入操作。本文將詳細講講C語言中隊列的定義與實現(xiàn),感興趣的可以了解一下
    2022-07-07
  • 超詳細的c語言字符串操作函數(shù)教程

    超詳細的c語言字符串操作函數(shù)教程

    字符串是一種重要的數(shù)據(jù)類型,有零個或多個字符組成的有限串行,下面這篇文章主要給大家介紹了關于c語言字符串操作函數(shù)的相關資料,需要的朋友可以參考下
    2021-10-10
  • boost字符串處理函數(shù)format的用法

    boost字符串處理函數(shù)format的用法

    這篇文章介紹了boost字符串處理函數(shù)format的用法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C語言輸出教學日歷表的方法實例

    C語言輸出教學日歷表的方法實例

    最近幫朋友做一些C語言的練習題,期間遇到了個比較有意思的題目,下面這篇文章主要給大家介紹了關于C語言輸出教學日歷表的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-06-06

最新評論