C語(yǔ)言程序設(shè)計(jì)結(jié)構(gòu)體共用體及位運(yùn)算_第1頁(yè)
C語(yǔ)言程序設(shè)計(jì)結(jié)構(gòu)體共用體及位運(yùn)算_第2頁(yè)
C語(yǔ)言程序設(shè)計(jì)結(jié)構(gòu)體共用體及位運(yùn)算_第3頁(yè)
C語(yǔ)言程序設(shè)計(jì)結(jié)構(gòu)體共用體及位運(yùn)算_第4頁(yè)
C語(yǔ)言程序設(shè)計(jì)結(jié)構(gòu)體共用體及位運(yùn)算_第5頁(yè)
已閱讀5頁(yè),還剩33頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

會(huì)計(jì)學(xué)1C語(yǔ)言程序設(shè)計(jì)結(jié)構(gòu)體共用體及位運(yùn)算12.1結(jié)構(gòu)變量“結(jié)構(gòu)”也叫做“結(jié)構(gòu)體”,它是由若干“成員”組成的。每一個(gè)成員可以是一個(gè)基本數(shù)據(jù)類(lèi)型,還可以是數(shù)組、指針,甚至可以為另一個(gè)構(gòu)造類(lèi)型(此時(shí),就組成了嵌套)。在說(shuō)明和使用之前必須先定義結(jié)構(gòu),就像在說(shuō)明和調(diào)用函數(shù)之前要先定義函數(shù)一樣。12.1.1結(jié)構(gòu)體的定義結(jié)構(gòu)體有以下幾種定義方法。第1頁(yè)/共38頁(yè)1不帶變量名的定義定義一個(gè)結(jié)構(gòu)體的一般形式為:

struct結(jié)構(gòu)名

{

數(shù)據(jù)類(lèi)型成員名1;

數(shù)據(jù)類(lèi)型成員名2;

數(shù)據(jù)類(lèi)型成員名3;...

數(shù)據(jù)類(lèi)型成員名n;};

成員名的命名應(yīng)符合標(biāo)識(shí)符的規(guī)定。成員名可與程序中其它變量同名,互不干擾。注意不要忘記成員名后面的逗號(hào),也不要忘記結(jié)構(gòu)結(jié)束時(shí)}后的逗號(hào)。第2頁(yè)/共38頁(yè)2帶變量名的定義另外一種定義為:

struct結(jié)構(gòu)名

{

數(shù)據(jù)類(lèi)型成員名1;

數(shù)據(jù)類(lèi)型成員名2;

數(shù)據(jù)類(lèi)型成員名3;...

數(shù)據(jù)類(lèi)型成員名n;}變量名列表;

【例12-1】(見(jiàn)課本)第3頁(yè)/共38頁(yè)12.1.2結(jié)構(gòu)類(lèi)型變量的說(shuō)明說(shuō)明結(jié)構(gòu)變量有以下幾種方法。1先定義結(jié)構(gòu),再說(shuō)明結(jié)構(gòu)變量說(shuō)明的格式為:存儲(chǔ)類(lèi)型struct結(jié)構(gòu)名結(jié)構(gòu)變量名1[,結(jié)構(gòu)變量名2,...結(jié)構(gòu)變量名n];

【例12-2】(見(jiàn)課本)2定義結(jié)構(gòu)類(lèi)型并說(shuō)明結(jié)構(gòu)變量如上所說(shuō),采用第二種格式,可以在定義結(jié)構(gòu)類(lèi)型的同時(shí)說(shuō)明結(jié)構(gòu)變量。第4頁(yè)/共38頁(yè)12.1.3結(jié)構(gòu)變量成員的表示方法在程序中使用結(jié)構(gòu)變量時(shí),往往使用它的單個(gè)成員,而不使用整個(gè)結(jié)構(gòu)。成員可以在程序中單獨(dú)使用,與普通變量完全相同。表示結(jié)構(gòu)變量成員的一般形式是:結(jié)構(gòu)變量名.成員名例如:

jilu1.bianhao/*記錄1的編號(hào)*/jilu2.xingbie/*記錄2的性別*/

這有點(diǎn)像數(shù)據(jù)庫(kù)中的字段。第5頁(yè)/共38頁(yè)12.1.4結(jié)構(gòu)變量的賦值結(jié)構(gòu)變量的賦值就是給各成員賦值??捎幂斎胝Z(yǔ)句或賦值語(yǔ)句來(lái)完成。

【例12-3】(見(jiàn)課本)12.1.5結(jié)構(gòu)變量的初始化如果結(jié)構(gòu)變量是全局變量或?yàn)殪o態(tài)變量,則可對(duì)它作初始化賦值。對(duì)局部或自動(dòng)結(jié)構(gòu)變量不能作初始化賦值。

【例12-4】(見(jiàn)課本)

【例12-5】(見(jiàn)課本)第6頁(yè)/共38頁(yè)12.2結(jié)構(gòu)數(shù)組12.2.1結(jié)構(gòu)數(shù)組概述我們知道,具有相同數(shù)據(jù)類(lèi)型的變量可以組成數(shù)組。同樣,具有相同結(jié)構(gòu)的結(jié)構(gòu)變量我們知道,具有相同數(shù)據(jù)類(lèi)型的變量可以組成數(shù)組。同樣,具有相同結(jié)構(gòu)的結(jié)構(gòu)變量也可以組成數(shù)組。這樣組成的數(shù)組叫做“結(jié)構(gòu)數(shù)組”。結(jié)構(gòu)數(shù)組的每一個(gè)元素都是具有相同結(jié)構(gòu)類(lèi)型的結(jié)構(gòu)變量。結(jié)構(gòu)數(shù)組的定義方法和結(jié)構(gòu)變量相似,只需說(shuō)明它為數(shù)組類(lèi)型即可。說(shuō)明格式如下:

[存儲(chǔ)類(lèi)型]struct結(jié)構(gòu)名結(jié)構(gòu)數(shù)組名[元素個(gè)數(shù)];

例如:

structrecordjilu[3];

也可以在定義時(shí)說(shuō)明,如下例所示。

【例12-6】(見(jiàn)課本)第7頁(yè)/共38頁(yè)12.2.2結(jié)構(gòu)數(shù)組的初始化對(duì)外部結(jié)構(gòu)數(shù)組或靜態(tài)結(jié)構(gòu)數(shù)組可以作初始化賦值,例如:

【例12-7】(見(jiàn)課本)當(dāng)對(duì)全部元素作初始化賦值時(shí),也可不給出數(shù)組長(zhǎng)度。請(qǐng)看下例。

【例12-8】(見(jiàn)課本)第8頁(yè)/共38頁(yè)12.3結(jié)構(gòu)指針變量12.3.1結(jié)構(gòu)指針變量概述當(dāng)把一個(gè)指針變量指向一個(gè)結(jié)構(gòu)變量時(shí),這個(gè)指針變量就成為了結(jié)構(gòu)指針變量。結(jié)構(gòu)指針變量指向結(jié)構(gòu)變量的首地址。通過(guò)結(jié)構(gòu)指針即可訪(fǎng)問(wèn)該結(jié)構(gòu)變量,這與數(shù)組指針和函數(shù)指針的情況相同。結(jié)構(gòu)指針變量說(shuō)明的一般形式為:

struct結(jié)構(gòu)名*結(jié)構(gòu)指針變量名

第9頁(yè)/共38頁(yè)

例如:

structrecord*pstu;

也可在定義stu結(jié)構(gòu)時(shí)同時(shí)說(shuō)明pstu。結(jié)構(gòu)指針變量也必須要先賦值后才能使用。賦值是把結(jié)構(gòu)變量的首地址賦予該指針變量,不能把結(jié)構(gòu)名賦予該指針變量。結(jié)合上述例子,可以如下賦值:

pstu=&jilu

而如下賦值是錯(cuò)誤的:

pstu=&record

結(jié)構(gòu)名與結(jié)構(gòu)變量的區(qū)別是:結(jié)構(gòu)名只表示一個(gè)結(jié)構(gòu)形式,編譯系統(tǒng)并不對(duì)它分配內(nèi)存空間。而變量分配存儲(chǔ)空間。因此上面&record是錯(cuò)誤的,不可能去取一個(gè)結(jié)構(gòu)名的首地址。

第10頁(yè)/共38頁(yè)12.3.2結(jié)構(gòu)變量的使用有了結(jié)構(gòu)指針變量,就能更方便地訪(fǎng)問(wèn)結(jié)構(gòu)變量的各個(gè)成員。其訪(fǎng)問(wèn)的一般形式為:

(*結(jié)構(gòu)指針變量).成員名

或?yàn)椋?/p>

結(jié)構(gòu)指針變量->成員名

例如:

(*pstu).bianhao

或者:

pstu->bianhao

應(yīng)該注意(*pstu)兩側(cè)的括號(hào)不可少,因?yàn)槌蓡T符“.”的優(yōu)先級(jí)高于“*”。以下三種用于表示結(jié)構(gòu)成員的形式是完全等效:結(jié)構(gòu)變量.成員名

(*結(jié)構(gòu)指針變量).成員名結(jié)構(gòu)指針變量->成員名【例12-9】(見(jiàn)課本)【例12-10】(見(jiàn)課本)第11頁(yè)/共38頁(yè)12.4聯(lián)合類(lèi)型的定義和聯(lián)合變量的說(shuō)明“聯(lián)合體”也叫做“聯(lián)合”,它也是一種由不同類(lèi)型數(shù)據(jù)組成的復(fù)合數(shù)據(jù)類(lèi)型。在一個(gè)“聯(lián)合”內(nèi)可以定義多種不同的數(shù)據(jù)類(lèi)型,一個(gè)被說(shuō)明為該“聯(lián)合”類(lèi)型的變量中,允許裝入該“聯(lián)合”所定義的任何一種數(shù)據(jù)。這在前面的各種數(shù)據(jù)類(lèi)型中都是辦不到的。例如,定義為整型的變量只能裝入整型數(shù)據(jù),定義為實(shí)型的變量只能賦予實(shí)型數(shù)據(jù)。第12頁(yè)/共38頁(yè)“聯(lián)合”與“結(jié)構(gòu)”有一些相似之處,也有本質(zhì)上的不同。第一點(diǎn)不同在于存儲(chǔ)空間的分配:在結(jié)構(gòu)中各成員有各自的內(nèi)存空間,一個(gè)結(jié)構(gòu)變量的總長(zhǎng)度是各成員長(zhǎng)度之和。而在“聯(lián)合”中,各成員共享一段內(nèi)存空間,一個(gè)聯(lián)合變量的長(zhǎng)度等于各成員中最長(zhǎng)成員的長(zhǎng)度??梢允褂靡韵峦ㄋ椎乇扔鳎航Y(jié)構(gòu)好比每人都有自己的衣服,并且為“量體裁衣、度身定做”;而聯(lián)合則是按照個(gè)子最大的人作衣服,大家都可穿這個(gè)“大”衣服。所以,從這個(gè)意義上,聯(lián)合體也叫做“共同體”或“共用體”。這樣,聯(lián)合可以覆蓋地使用內(nèi)存,極大地提高了內(nèi)存的使用效率??傊?,聯(lián)合對(duì)內(nèi)存的使用可以說(shuō)是“取長(zhǎng)補(bǔ)短”。第二點(diǎn)不同在于變量的使用:聯(lián)合變量可被賦予任一成員值,但每次只能賦一種值,賦入新值則沖去舊值。但是結(jié)構(gòu)的變量則不可這樣使用。正是這樣特點(diǎn),使聯(lián)合比結(jié)構(gòu)靈活。聯(lián)合類(lèi)型的定義和聯(lián)合變量說(shuō)明的格式與結(jié)構(gòu)非常相似,只是把struct改為union而已。第13頁(yè)/共38頁(yè)12.4.1聯(lián)合的定義定義聯(lián)合體有以下幾種方式。1不帶變量名的定義使用此方法定義一個(gè)聯(lián)合的一般形式為:

unoin聯(lián)合名

{

數(shù)據(jù)類(lèi)型成員名1;

數(shù)據(jù)類(lèi)型成員名2;

數(shù)據(jù)類(lèi)型成員名3;...

數(shù)據(jù)類(lèi)型成員n;};

第14頁(yè)/共38頁(yè)2帶變量名的定義使用此方法定義一個(gè)聯(lián)合的一般形式為:

unoin聯(lián)合名

{

數(shù)據(jù)類(lèi)型成員名1;

數(shù)據(jù)類(lèi)型成員名2;

數(shù)據(jù)類(lèi)型成員名3;...

數(shù)據(jù)類(lèi)型成員n;}變量名列表;

【例12-11】(見(jiàn)課本)第15頁(yè)/共38頁(yè)12.4.2聯(lián)合變量的說(shuō)明一個(gè)聯(lián)合類(lèi)型必須經(jīng)過(guò)定義之后,才能把變量說(shuō)明為該聯(lián)合類(lèi)型。聯(lián)合變量的說(shuō)明和結(jié)構(gòu)變量的說(shuō)明方式相同,也有三種形式。即先定義,再說(shuō)明;定義同時(shí)說(shuō)明和直接說(shuō)明。

【例12-12】(見(jiàn)課本)

【例12-13】(見(jiàn)課本)

【例12-14】(見(jiàn)課本)第16頁(yè)/共38頁(yè)12.5聯(lián)合變量的賦值和使用12.5.1賦值對(duì)聯(lián)合變量的賦值、使用都只能是對(duì)變量的成員進(jìn)行。聯(lián)合變量的成員表示為:聯(lián)合變量名.成員名

例如,a被說(shuō)明為uarea類(lèi)型的變量之后,可使用:

a.c_dataa.s_data

不允許只用聯(lián)合變量名作賦值或其它操作。也不允許對(duì)聯(lián)合變量作初始化賦值,賦值只能在程序中進(jìn)行。還要再?gòu)?qiáng)調(diào)說(shuō)明的是,一個(gè)聯(lián)合變量,每次只能賦予一個(gè)成員值。換句話(huà)說(shuō),一個(gè)聯(lián)合變量的值就是聯(lián)合變員的某一個(gè)成員值。

【例12-15】(見(jiàn)課本)第17頁(yè)/共38頁(yè)12.5.2使用聯(lián)合應(yīng)注意的問(wèn)題1內(nèi)存覆蓋盡管在聯(lián)合所使用的內(nèi)存中可以存儲(chǔ)不同的成員,也就是可以存儲(chǔ)不同類(lèi)型的數(shù)據(jù)。但每一時(shí)刻只能存儲(chǔ)一個(gè)成員。通俗地說(shuō),只有一套衣服,一次只能由一個(gè)演員來(lái)穿。2以新替舊聯(lián)合體變量存儲(chǔ)的是最后一次存儲(chǔ)的成員的內(nèi)容。換言之,變量存儲(chǔ)了新成員,則自動(dòng)替換了老成員。3地址唯一聯(lián)合體變量和各個(gè)成員擁有同一地址。第18頁(yè)/共38頁(yè)4變量不可賦值不能給聯(lián)合體的變量名賦值,也不能對(duì)聯(lián)合體的變量名初始化,也不能引用聯(lián)合體的變量名。使用的都是聯(lián)合體變量的成員。5嵌套聯(lián)合與結(jié)構(gòu)可以互相嵌套。數(shù)組也可以作為聯(lián)合體的成員,也可以定義聯(lián)合體數(shù)組。6不能用作函數(shù)不能把聯(lián)合體變量作為函數(shù)的參數(shù),也不能使函數(shù)帶回聯(lián)合體變量。但是,可以使用聯(lián)合體變量的指針。第19頁(yè)/共38頁(yè)12.6位運(yùn)算符12.6.1幾個(gè)基本概念1字節(jié)與位字節(jié)(英文為byte)是計(jì)算機(jī)中的存儲(chǔ)單元。一個(gè)字節(jié)可以存放一個(gè)英文字母或符號(hào),一個(gè)漢字通常要用兩個(gè)字節(jié)來(lái)存儲(chǔ)。每一個(gè)字節(jié)都有自己的編號(hào),叫做“地址”。一個(gè)字節(jié)由若干位(位的英文是bit)組成。至于一個(gè)字節(jié)由幾個(gè)位組成,取決于計(jì)算機(jī)的硬件系統(tǒng)。一般由8位、16位或32位組成,所對(duì)應(yīng)的計(jì)算機(jī)也被稱(chēng)為“8位機(jī)、16位機(jī)或32位機(jī)”。目前微機(jī)以16位機(jī)或32位機(jī)為主。但在本書(shū)中作為原理講述的是8位機(jī)。我們把若干字節(jié)組成一個(gè)單元,叫做“字”(英文為word)。一個(gè)字可以存放一個(gè)數(shù)據(jù)或指令。第20頁(yè)/共38頁(yè)2原碼我們知道,計(jì)算機(jī)使用的是二進(jìn)制數(shù)。但這些數(shù)據(jù)有不同的編碼方式,分別有原碼、反碼和補(bǔ)碼。以8位計(jì)算機(jī)系統(tǒng)為例,我們把最高位(即最左面的一位)留做表示符號(hào),其他7位表示二進(jìn)制數(shù),這種編碼方式叫做原碼。最高位為“0”表示正數(shù),為“1”表示負(fù)數(shù)。例如,00000011表示+3,10000011表示-3。顯然,這樣可以表示的數(shù)值范圍在+127到-127之間。這種表示方法有一個(gè)缺陷,數(shù)值0會(huì)出現(xiàn)歧義:00000000表示+0,10000000表示-0。第21頁(yè)/共38頁(yè)3反碼對(duì)于正數(shù),反碼與原碼相同。例如,00000011表示+3。所謂“反碼”是指與“原碼”在表示負(fù)數(shù)時(shí)相反:符號(hào)位(最高位)為“1”表示負(fù)數(shù)。但其余位的值相反。例如,11111100表示-3。顯然,這樣可以表示的數(shù)值范圍在+127到-127之間。這種表示方法仍然有一個(gè)缺陷,數(shù)值0會(huì)出現(xiàn)歧義:00000000表示+0,11111111表示-0。4補(bǔ)碼對(duì)于正數(shù),補(bǔ)碼與原碼相同。

0的補(bǔ)碼為00000000。這樣,0的表示唯一。對(duì)于負(fù)數(shù),可以從原碼得到補(bǔ)碼,步驟如下:把符號(hào)位不變,為1;首先,把其余各位取反。即0變?yōu)?,1變?yōu)?;其次,對(duì)整個(gè)數(shù)加1。計(jì)算機(jī)中的數(shù)據(jù)都采用補(bǔ)碼。這樣做的好處是,減法可以用加法來(lái)實(shí)現(xiàn)。如-3+4可以變成-3的補(bǔ)碼與+4的補(bǔ)碼相加。第22頁(yè)/共38頁(yè)12.6.2位運(yùn)算符位運(yùn)算是對(duì)二進(jìn)制的運(yùn)算。也就是說(shuō),其操作數(shù)是二進(jìn)制數(shù)。這是與其他運(yùn)算的主要不同。以下逐一講述一些主要的位運(yùn)算符。1按位取反功能:把操作對(duì)象二進(jìn)制數(shù)的每一位取反,0變成1,1變成0。運(yùn)算符:~

示例:如x=01010011,y=~x,則y=10101100。2左位移功能:把操作對(duì)象二進(jìn)制數(shù)的向左移動(dòng)指定的位,并在右面補(bǔ)上相應(yīng)的0。格式:要位移的數(shù)據(jù)<<要位移的位數(shù)示例:如x=01010011,y=x<<2,則y=10110000。注意,左移會(huì)引起數(shù)據(jù)的變化,具體說(shuō),左移一位相當(dāng)于對(duì)原來(lái)的數(shù)值乘以2。左移n位相當(dāng)于對(duì)原來(lái)的數(shù)值乘以2n。第23頁(yè)/共38頁(yè)3右位移功能:把操作對(duì)象二進(jìn)制數(shù)的向右移動(dòng)指定的位,并在左面補(bǔ)上相應(yīng)的0。格式:要位移的數(shù)據(jù)>>要位移的位數(shù)示例:如x=01010011,y=x>>2,則y=00010100。注意,左移會(huì)引起數(shù)據(jù)的變化,具體說(shuō),左移一位相當(dāng)于對(duì)原來(lái)的數(shù)值除以2。左移n位相當(dāng)于對(duì)原來(lái)的數(shù)值除以2n。4按位與功能:當(dāng)兩個(gè)操作對(duì)象二進(jìn)制數(shù)的相同位都為1時(shí),結(jié)果數(shù)值的相應(yīng)位為1,否則為相應(yīng)位是0。運(yùn)算符:&

格式:數(shù)據(jù)1&數(shù)據(jù)2

示例:如x=10010010,y=11011110,z=x&y,則z=10000010。第24頁(yè)/共38頁(yè)5按位或功能:當(dāng)兩個(gè)操作對(duì)象二進(jìn)制數(shù)的相同位都為0時(shí),結(jié)果數(shù)值的相應(yīng)位為0,否則為相應(yīng)位是1。運(yùn)算符:|

格式:數(shù)據(jù)1|數(shù)據(jù)2

示例:如x=10010010,y=11011110,z=x|y,則z=11111110。6按位異或功能:當(dāng)兩個(gè)操作對(duì)象二進(jìn)制數(shù)的相同位的值相同時(shí),結(jié)果數(shù)值的相應(yīng)位為0,否則為相應(yīng)位是1。運(yùn)算符:^

格式:數(shù)據(jù)1^數(shù)據(jù)2

示例:如x=10010010,y=11011110,z=x^y,則z=01101100。第25頁(yè)/共38頁(yè)12.7鏈表12.7.1鏈表概述根據(jù)前面講述的知識(shí),要存放較為大量的數(shù)據(jù),可以使用數(shù)組。但是,使用數(shù)組也有一些弊端:其一,數(shù)組的大小不能變化。例如,某大學(xué)有十個(gè)系,其中計(jì)算機(jī)系的學(xué)生數(shù)最多,為800人;社會(huì)科學(xué)系的學(xué)生數(shù)最少,為300人。我們要用一個(gè)數(shù)組來(lái)存放各個(gè)系學(xué)生的相關(guān)數(shù)據(jù),則只能按計(jì)算機(jī)系的學(xué)生數(shù)建立一個(gè)有800個(gè)元素的數(shù)組。這樣一來(lái),當(dāng)存放社會(huì)科學(xué)系的學(xué)生數(shù)據(jù)時(shí),就有500個(gè)元素是空的、沒(méi)用。但仍然占據(jù)了內(nèi)存空間,造成了計(jì)算機(jī)資源浪費(fèi);其二,當(dāng)某個(gè)系的某一學(xué)生轉(zhuǎn)系、退學(xué)而需要對(duì)數(shù)組中的對(duì)應(yīng)數(shù)據(jù)增加或刪除時(shí),數(shù)組不便操作,比較麻煩,要對(duì)大量的數(shù)據(jù)進(jìn)行移動(dòng)。第26頁(yè)/共38頁(yè)

由此可見(jiàn),為了程序設(shè)計(jì)的方便,我們需要這樣一種數(shù)據(jù)結(jié)構(gòu):可以方便地對(duì)其中的元素增加或減少;當(dāng)元素增加時(shí)占用的存儲(chǔ)空間也相應(yīng)增加,當(dāng)元素減少時(shí)占用的存儲(chǔ)空間也相應(yīng)減少,存儲(chǔ)元素的空間不要有浪費(fèi)。在C語(yǔ)言中,這樣的數(shù)據(jù)結(jié)構(gòu)可以用鏈表來(lái)實(shí)現(xiàn)。鏈表上的每一個(gè)連結(jié)點(diǎn)叫做“結(jié)點(diǎn)”。每一個(gè)結(jié)點(diǎn)包括兩部分:其一是本結(jié)點(diǎn)要存儲(chǔ)的數(shù)據(jù),其二是下一個(gè)結(jié)點(diǎn)的“地址”。在整個(gè)鏈表中,有兩個(gè)特殊的結(jié)點(diǎn):鏈表的第一個(gè)元素被稱(chēng)為“首結(jié)點(diǎn)”,特點(diǎn)是用特殊的指針指向它,而不是由其它的結(jié)點(diǎn)指向它;鏈表的最后一個(gè)元素被稱(chēng)為“尾結(jié)點(diǎn)”,特點(diǎn)是它不指向其它結(jié)點(diǎn)。實(shí)際上它指向其它結(jié)點(diǎn)的地址是“NULL”(表示“空”)。所以,一個(gè)鏈表就像一個(gè)班的戰(zhàn)士組成的隊(duì)伍,排在最前面的是班長(zhǎng),依此是一個(gè)又一個(gè)的戰(zhàn)士,排在最后的是副班長(zhǎng)。由于鏈表中的結(jié)點(diǎn)要有指向其它結(jié)點(diǎn)的地址,所以必須使用指針。第27頁(yè)/共38頁(yè)

由于鏈表中的結(jié)點(diǎn)要有指向其它結(jié)點(diǎn)的地址,所以必須使用指針。因?yàn)殒湵碇薪Y(jié)點(diǎn)的數(shù)據(jù)類(lèi)型可能是包括數(shù)值類(lèi)型、字符類(lèi)型、數(shù)組類(lèi)型與指針類(lèi)型。因此,使用結(jié)構(gòu)體十分合適。所以鏈表中通常使用結(jié)構(gòu)體。這就是為什么我們要在學(xué)習(xí)了結(jié)構(gòu)體和指針之后才學(xué)習(xí)鏈表的原因。我們可以采用如下形式的結(jié)構(gòu)體來(lái)說(shuō)明結(jié)點(diǎn)的數(shù)據(jù)類(lèi)型:

structnode{charname/*說(shuō)明學(xué)生的姓名*/intnumber/*說(shuō)明學(xué)生的房間號(hào)*/floatscore/*說(shuō)明學(xué)生的分?jǐn)?shù)*/structnode*link/*指向下一個(gè)結(jié)點(diǎn)的指針*/}

鏈表中的數(shù)據(jù)是按照一定的邏輯關(guān)系存儲(chǔ)的,并不要求必須占據(jù)連續(xù)的內(nèi)存空間,因?yàn)榭梢酝ㄟ^(guò)指針來(lái)訪(fǎng)問(wèn)。第28頁(yè)/共38頁(yè)12.7.2鏈表的建立1定義指針要建立鏈表,必須建立以下三個(gè)指針:指向鏈表首結(jié)點(diǎn)的指針。比如使用:phead;指向鏈表尾結(jié)點(diǎn)的指針。比如使用:pend;指向鏈表中新插入結(jié)點(diǎn)的指針。比如使用:pnew;當(dāng)然,指針的名字可以隨意起,但其作用就是這三種。用以下語(yǔ)句說(shuō)明這三個(gè)指針:

structnode*phead,*pend,*pnew;第29頁(yè)/共38頁(yè)2建立首結(jié)點(diǎn)

(1)malloc()函數(shù)建立首結(jié)點(diǎn)要使用malloc()函數(shù)。以下先對(duì)這一函數(shù)作簡(jiǎn)單的介紹。這一函數(shù)的作用是在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)域中分配出一段連續(xù)的存儲(chǔ)空間。其返回值是一個(gè)指針,該指針指向這個(gè)存儲(chǔ)空間起始地址。如果分配內(nèi)存空間失敗,則返回空指針(NULL)。其使用格式為:

void*malloc(unsignedintsize)

其中,size指定了使用內(nèi)存空間的長(zhǎng)度。第30頁(yè)/共38頁(yè)(2)建立首結(jié)點(diǎn)使用如下語(yǔ)句建立首結(jié)點(diǎn):phead=(structnode*)malloc(sizeof(structnode));pend=phead;/*初始時(shí),末尾結(jié)點(diǎn)等于首結(jié)點(diǎn)*/pnew=phead;/*初始時(shí),新結(jié)點(diǎn)等于首結(jié)點(diǎn)*/3向首結(jié)點(diǎn)輸入數(shù)據(jù)可以通過(guò)得到字符的方式向首結(jié)點(diǎn)輸入數(shù)據(jù),如:gets(pnew->name);也可使用輸入語(yǔ)句來(lái)輸入數(shù)據(jù),如:scanf(“%d,%f”,&pnew->number,&pnew->score);使用如下語(yǔ)句給link賦予NULL:pnew->link=NULL;第31頁(yè)/共38頁(yè)4建立其他結(jié)點(diǎn)使用以下語(yǔ)句給結(jié)點(diǎn)分配空間:

pnew=(structnode*)malloc(sizeof(structnode));

使用如下語(yǔ)句向新的結(jié)點(diǎn)賦予數(shù)據(jù):

gets(pnew->name);scanf(“%d,%f”,&pnew->number,&pnew->score);pnew->link=NULL;

把新的結(jié)點(diǎn)鏈接在鏈表上:

pend->link=pnew;

調(diào)整鏈表尾指針:

pend=pnew;

如果有多個(gè)結(jié)點(diǎn),可以重復(fù)2.4節(jié)的方法直到建立了全部結(jié)點(diǎn)。在實(shí)際編寫(xiě)程序中,往往使用循環(huán)語(yǔ)句。

【例12-16】(見(jiàn)課本)第32頁(yè)/共38頁(yè)12.7.3鏈表的遍歷鏈表的遍歷體現(xiàn)了對(duì)鏈表的查詢(xún)。如果我們可以把鏈表中的每一個(gè)個(gè)結(jié)點(diǎn)都經(jīng)歷一遍,當(dāng)然就可以查詢(xún)?nèi)魏我粋€(gè)結(jié)點(diǎn)了。鏈表的遍歷的基本思想是:首先找到鏈表的首結(jié)點(diǎn)。然后借助一個(gè)指針變量p。首先把鏈表首結(jié)點(diǎn)的地址賦予變量p,輸出變量p所指結(jié)點(diǎn)的數(shù)據(jù);然后把此結(jié)點(diǎn)數(shù)據(jù)中的指針(即下一個(gè)結(jié)點(diǎn)的地址)賦予變量p;如果不是尾結(jié)點(diǎn),則輸入此結(jié)點(diǎn)的數(shù)據(jù);然后繼續(xù)移動(dòng),直到尾結(jié)點(diǎn)的數(shù)據(jù)輸出后結(jié)束。

【例12-17】(見(jiàn)課本)第33頁(yè)/共38頁(yè)12.7.4刪除結(jié)點(diǎn)要?jiǎng)h除鏈表中的一個(gè)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論