國家電網(wǎng)考試備考資料:計(jì)算機(jī)之?dāng)?shù)據(jù)結(jié)構(gòu)與算法(一)
國有企業(yè)2015-07-22www.qdbaoqi.com信息來源
國家電網(wǎng)考試備考資料:計(jì)算機(jī)之?dāng)?shù)據(jù)結(jié)構(gòu)與算法(一)
1.數(shù)據(jù)結(jié)構(gòu)
數(shù)據(jù)結(jié)構(gòu)是指相互之間存在著一種或多種關(guān)系的數(shù)據(jù)元素的集合和該集合中數(shù)據(jù)元素之間的關(guān)系組成。記為:Data_Structure=(D,R),其中D是數(shù)據(jù)元素的集合,R是該集合中所有元素之間的關(guān)系的有限集合。
數(shù)據(jù)的邏輯結(jié)構(gòu):指反映數(shù)據(jù)元素之間的邏輯關(guān)系的數(shù)據(jù)結(jié)構(gòu),其中的邏輯關(guān)系是指數(shù)據(jù)元素之間的前后件關(guān)系,而與他們?cè)谟?jì)算機(jī)中的存儲(chǔ)位置無關(guān)。邏輯結(jié)構(gòu)包括:1.集合2.線性結(jié)構(gòu)3.樹形結(jié)構(gòu)4.圖形結(jié)構(gòu)
2.數(shù)組 (Array)
在程序設(shè)計(jì)中,為了處理方便, 把具有相同類型的若干變量按有序的形式組織起來。這些按序排列的同類數(shù)據(jù)元素的集合稱為數(shù)組。在C語言中, 數(shù)組屬于構(gòu)造數(shù)據(jù)類型。一個(gè)數(shù)組可以分解為多個(gè)數(shù)組元素,這些數(shù)組元素可以是基本數(shù)據(jù)類型或是構(gòu)造類型。因此按數(shù)組元素的類型不同,數(shù)組又可分為數(shù)值數(shù)組、字符數(shù)組、指針數(shù)組、結(jié)構(gòu)數(shù)組等各種類別。
數(shù)組類別:
多維數(shù)組
有時(shí)需要追蹤記錄數(shù)組中的相關(guān)信息。
例如,為了追蹤記錄計(jì)算機(jī)屏幕上的每一個(gè)像素,需要引用它的 X、Y坐標(biāo)。這時(shí)應(yīng)該用多維數(shù)組存儲(chǔ)值。
可用 Visual Basic 聲明多維數(shù)組。
例如,下面的語句聲明了一個(gè)過程內(nèi)的 10 × 10 的二維數(shù)組。
Static MatrixA (9,9) As Double
可用顯式下界來聲明兩個(gè)維數(shù)或兩個(gè)維數(shù)中的任何一個(gè):
Static MatrixA (1 To 10,1 To 10) As Double
可以將所有這些推廣到二維以上的數(shù)組。例如:
Dim MultiD (3,1 To 10,1 To 15)
這個(gè)聲明建立了三維數(shù)組,大小為 4 × 10 × 15。元素總數(shù)為三個(gè)維數(shù)的乘積,為 600。
注意
在增加數(shù)組的維數(shù)時(shí),數(shù)組所占的存儲(chǔ)空間會(huì)大幅度增加,所以要慎用多維數(shù)組。使用 Variant 數(shù)組時(shí)更要格外小心,因?yàn)樗麄冃枰蟮拇鎯?chǔ)空間。
用循環(huán)操作數(shù)組:
可以用 For循環(huán)嵌套有效的處理多維數(shù)組。例如,在 MatrixA 中基于每個(gè)元素在數(shù)組中的位置為其賦值:
Dim I As Integer,J As Integer
Static MatrixA(1 To 10,1 To 10) As Double
For I = 1 To 10
For J = 1 To 10
MatrixA (I,J) = I * 10 + J
Next J
Next I
一維數(shù)組
定義
一維數(shù)組是最簡單的數(shù)組,其邏輯結(jié)構(gòu)是線性表。要使用一維數(shù)組,需經(jīng)過定義、初始化和應(yīng)用等過程。
數(shù)組聲明
在數(shù)組的聲明格式里,"數(shù)據(jù)類型"是聲明數(shù)組元素的數(shù)據(jù)類型,可以是java語言中任意的數(shù)據(jù)類型,包括簡單類型和結(jié)構(gòu)類型。"數(shù)組名"是用來統(tǒng)一這些相同數(shù)據(jù)類型的名稱,其命名規(guī)則和變量的命名規(guī)則相同。
數(shù)組聲明之后,接下來便是要分配數(shù)組所需要的內(nèi)存,這時(shí)必須用運(yùn)算符new,其中"個(gè)數(shù)"是告訴編譯器,所聲明的數(shù)組要存放多少個(gè)元素,所以new運(yùn)算符是通知編譯器根據(jù)括號(hào)里的個(gè)數(shù),在內(nèi)存中分配一塊空間供該數(shù)組使用。利用new運(yùn)算符為數(shù)組元素分配內(nèi)存空間的方式稱為動(dòng)態(tài)分配方式。
舉例:
int[]x; //聲明名稱為x的int型數(shù)組
x=new int[10]; //x數(shù)組中包含有10個(gè)元素,并為這10個(gè)元素分配內(nèi)存空間
在聲明數(shù)組時(shí),也可以將兩個(gè)語句合并成一行,格式如下:
數(shù)據(jù)類型[]數(shù)組名= new 數(shù)據(jù)類型[個(gè)數(shù)];
利用這種格式在聲明數(shù)組的同時(shí),也分配一塊內(nèi)存供數(shù)組使用。如上面的例子可以寫成:
int[]x = new int [10];
等號(hào)左邊的int[]x相當(dāng)于定義了一個(gè)特殊的變量x,x的數(shù)據(jù)類型是一個(gè)對(duì)int型數(shù)組對(duì)象的引用,x就是一個(gè)數(shù)組的引用變量,其引用的數(shù)組元素個(gè)數(shù)不定。等號(hào)右邊的new int[10]就是在堆內(nèi)存中創(chuàng)建一個(gè)具有10個(gè)int型變量的數(shù)組對(duì)象。int[]x = new int [10];就是將右邊的數(shù)組對(duì)象賦值給左邊的數(shù)組引用變量。
二維數(shù)組
定義
前面介紹的數(shù)組只有一個(gè)下標(biāo),稱為一維數(shù)組, 其數(shù)組元素也稱為單下標(biāo)變量。在實(shí)際問題中有很多量是二維的或多維的, 因此C語言允許構(gòu)造多維數(shù)組。多維數(shù)組元素有多個(gè)下標(biāo), 以標(biāo)識(shí)它在數(shù)組中的位置,所以也稱為多下標(biāo)變量。本小節(jié)只介紹二維數(shù)組,多維數(shù)組可由二維數(shù)組類推而得到。二維數(shù)組類型說明的一般形式是:
類型說明符數(shù)組名[常量表達(dá)式1][常量表達(dá)式2]…;
其中常量表達(dá)式1表示第一維下標(biāo)的長度,常量表達(dá)式2 表示第二維下標(biāo)的長度。例如:
int a[3][4]; 說明了一個(gè)三行四列的數(shù)組,數(shù)組名為a,其下標(biāo)變量的類型為整型。該數(shù)組的下標(biāo)變量共有3×4個(gè),即:
a[0][0],a[0][1],a[0][2],a[0][3]
a[1][0],a[1][1],a[1][2],a[1][3]
a[2][0],a[2][1],a[2][2],a[2][3]
二維數(shù)組在概念上是二維的,即是說其下標(biāo)在兩個(gè)方向上變化, 下標(biāo)變量在數(shù)組中的位置也處于一個(gè)平面之中, 而不是象一維數(shù)組只是一個(gè)向量。但是,實(shí)際的硬件存儲(chǔ)器卻是連續(xù)編址的, 也就是說存儲(chǔ)器單元是按一維線性排列的。如何在一維存儲(chǔ)器中存放二維數(shù)組,可有兩種方式:一種是按行排列, 即放完一行之后順次放入第二行。另一種是按列排列, 即放完一列之后再順次放入第二列。在C語言中,二維數(shù)組是按行排列的。在如上中,按行順次存放,先存放a[0]行,再存放a[1]行,最后存放a[2]行。每行中有四個(gè)元素也是依次存放。由于數(shù)組a說明為
int類型,該類型占兩個(gè)字節(jié)的內(nèi)存空間,所以每個(gè)元素均占有兩個(gè) 字節(jié)(圖中每一格為一字節(jié))。
元素的表示方法
二維數(shù)組的元素也稱為雙下標(biāo)變量,其表示的形式為:數(shù)組名[下標(biāo)][下標(biāo)]
其中下標(biāo)應(yīng)為整型常量或整型表達(dá)式。例如:a[3][4] 表示a數(shù)組三行四列的元素。
下標(biāo)變量和數(shù)組說明在形式中有些相似,但這兩者具有完全不同的含義。數(shù)組說明的方括號(hào)中給出的是某一維的長度,即可取下標(biāo)的最大值; 而數(shù)組元素中的下標(biāo)是該元素在數(shù)組中的位置標(biāo)識(shí)。前者只能是常量, 后者可以是常量,變量或表達(dá)式。
一個(gè)學(xué)習(xí)小組有5個(gè)人,每個(gè)人有三門課的考試成績。求全組分科的平均成績和各科總平均成績。
課程 成績姓名Math C DBASE
張 80 75 92
王 61 65 71
李 59 63 70
趙 85 87 90
周 76 77 85
可設(shè)一個(gè)二維數(shù)組a[5][3]存放五個(gè)人三門課的成績。再設(shè)一個(gè)一維數(shù)組v[3]存放所求得各分科平均成績,設(shè)變量l為全組各科總平均成績。編程如下:
void main()
{
int i,j,s=0,l,v[3],a[5][3];
printf("input scoren");
for(i=0;i<3;i++){
for(j=0;j<5;j++)
{ scanf("%d",&a[j]);
s=s+a[j];}
v[i]=s/5;
s=0;
}
l=(v[0]+v[1]+v[2])/3;
printf("math:%dnc languag:%dndbase:%dn",v[0],v[1],v[2]);
printf("total:%dn",l);
} for(i=0;j<3;i++)
for(j=0;j<5;j++)
{ scanf("%d",&a[j]);
s=s+a[j];}
v=s/5;
s=0;
}
l=(v[0]+v[1]+v[2])/3;
程序中首先用了一個(gè)雙重循環(huán)。在內(nèi)循環(huán)中依次讀入某一門課程的各個(gè)學(xué)生的成績,并把這些成績累加起來, 退出內(nèi)循環(huán)后再把該累加成績除以5送入v之中,這就是該門課程的平均成績。外循環(huán)共循環(huán)三次,分別求出三門課各自的平均成績并存放在v數(shù)組之中。退出外循環(huán)之后,把v[0],v[1],v[2]相加除以3即得到各科總平均成績。最后按題意輸出各個(gè)成績。
初始化
二維數(shù)組初始化也是在類型說明時(shí)給各下標(biāo)變量賦以初值。二維數(shù)組可按行分段賦值,也可按行連續(xù)賦值。例如對(duì)數(shù)組a[5][3]:
1.按行分段賦值可寫為static int a[5][3]={ {80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85} };
2.按行連續(xù)賦值可寫為static int a[5][3]={ 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85 };
這兩種賦初值的結(jié)果是完全相同的。
void main()
{
int i,j,s=0,l,v[3];
static int a[5][3]={ {80,75,92},{61,65,71},{59,63,70},
{85,87,90},{76,77,85} };
for(i=0;i<3;i++)
{ for(j=0;j<5;j++)
s=s+a[j];
v=s/5;
s=0;
}
l=(v[0]+v[1]+v[2])/3;
printf("math:%dnc languag:%dndbase:%dn",v[0],v[1],v[2]);
printf("total:%dn",l);
}
初始化的額外說明
對(duì)于二維數(shù)組初始化賦值還有以下說明:
1.可以只對(duì)部分元素賦初值,未賦初值的元素自動(dòng)取0值。
例如:static int a[3][3]={,,}; 是對(duì)每一行的第一列元素賦值,未賦值的元素取0值。賦值后各元素的值為:1 0 02 0 03 0 0
static int a [3][3]={{0,1},{0,0,2},}; 賦值后的元素值為 0 1 00 0 23 0 0
2.如對(duì)全部元素賦初值,則第一維的長度可以不給出。
例如:static int a[3][3]={1,2,3,4,5,6,7,8,9}; 可以寫為:static int a[][3]={1,2,3,4,5,6,7,8,9};
分解
數(shù)組是一種構(gòu)造類型的數(shù)據(jù)。二維數(shù)組可以看作是由一維數(shù)組的嵌套而構(gòu)成的。設(shè)一維數(shù)組的每個(gè)元素都又是一個(gè)數(shù)組, 就組成了二維數(shù)組。當(dāng)然,前提是各元素類型必須相同。
根據(jù)這樣的分析,一個(gè)二維數(shù)組也可以分解為多個(gè)一維數(shù)組。C語言允許這種分解有二維數(shù)組a[3][4],可分解為三個(gè)一維數(shù)組,其數(shù)組名分別為a[0],a[1],a[2]。對(duì)這三個(gè)一維數(shù)組不需另作說明即可使用。這三個(gè)一維數(shù)組都有4個(gè)元素,例如:一維數(shù)組a[0]的元素為a[0][0],a[0][1],a[0][2],a[0][3]。最后必須強(qiáng)調(diào)的是,a[0],a[1],a[2]不能當(dāng)作下標(biāo)變量使用,它們是數(shù)組名,不是一個(gè)單純的下標(biāo)變量。
字符數(shù)組
用來存放字符量的數(shù)組稱為字符數(shù)組。
字符數(shù)組類型說明的形式與前面介紹的數(shù)值數(shù)組相同。例如:char c[10]; 由于字符型和整型通用,也可以定義為int c[10]但這時(shí)每個(gè)數(shù)組元素占2個(gè)字節(jié)的內(nèi)存單元。
字符數(shù)組也可以是二維或多維數(shù)組,例如:char c[5][10];即為二維字符數(shù)組。
字符數(shù)組也允許在類型說明時(shí)作初始化賦值。例如:static char c[10]={`c`,` `,`p`,`r`,o`,g`,r`,`a`,`m`};賦值后各元素的值為:數(shù)組C c[0]c[1]c[2]c[3]c[4]c [5]c[6]c[7]c[8]c[9]其中c[9]未賦值,由系統(tǒng)自動(dòng)賦予0值。
當(dāng)對(duì)全體元素賦初值時(shí)也可以省去長度說明。例如:static char c[]={`c`,` `,`p`,`r`,`o`,`g`,`r`,`a`,`m`};這時(shí)C數(shù)組的長度自動(dòng)定為9。
main()
{
int i,j;
char a[][5]={{'B','A','S','I','C',},{'d','B','A','S','E'}};
for(i=0;i<=1;i++)
{
for(j=0;j<=4;j++)
printf("%c",a[j]);
printf("n");
}
}
本例的二維字符數(shù)組由于在初始化時(shí)全部元素都賦以初值, 因此一維下標(biāo)的長度可以不加以說明。字符串在C語言中沒有專門的字符串變量, 通常用一個(gè)字符數(shù)組來存放一個(gè)字符串。在2.1.4節(jié)介紹字符串常量時(shí),已說明字符串總是以'