電大C語言程序設(shè)計(jì)-第7章-結(jié)構(gòu)和聯(lián)合課件_第1頁
電大C語言程序設(shè)計(jì)-第7章-結(jié)構(gòu)和聯(lián)合課件_第2頁
電大C語言程序設(shè)計(jì)-第7章-結(jié)構(gòu)和聯(lián)合課件_第3頁
電大C語言程序設(shè)計(jì)-第7章-結(jié)構(gòu)和聯(lián)合課件_第4頁
電大C語言程序設(shè)計(jì)-第7章-結(jié)構(gòu)和聯(lián)合課件_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

《C語言程序設(shè)計(jì)》計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)本科第7章結(jié)構(gòu)和聯(lián)合

(一)教學(xué)內(nèi)容1.結(jié)構(gòu)的基本概念2.結(jié)構(gòu)的定義與初始化3.結(jié)構(gòu)成員的訪問和結(jié)構(gòu)變量的賦值4.結(jié)構(gòu)與數(shù)組5.結(jié)構(gòu)與函數(shù)6.結(jié)構(gòu)與鏈表7.聯(lián)合的定義與使用第7章結(jié)構(gòu)和聯(lián)合

(二)教學(xué)要求了解:結(jié)構(gòu)和聯(lián)合的有關(guān)概念;理解:結(jié)構(gòu)和聯(lián)合的定義格式,結(jié)構(gòu)和聯(lián)合成員的訪問,結(jié)構(gòu)作為函數(shù)參數(shù)的應(yīng)用,結(jié)構(gòu)作為鏈表中結(jié)點(diǎn)類型的應(yīng)用;應(yīng)用:會(huì)分析和編寫使用結(jié)構(gòu)的函數(shù)或程序第7章結(jié)構(gòu)和聯(lián)合7.1結(jié)構(gòu)的定義1.結(jié)構(gòu)的引入結(jié)構(gòu)的概念:結(jié)構(gòu)是用戶自定義的數(shù)據(jù)類型,在一個(gè)組合項(xiàng)中包含若干個(gè)類型不同的數(shù)據(jù)項(xiàng)的數(shù)據(jù)結(jié)構(gòu)。例:定義一個(gè)職工Employee結(jié)構(gòu)數(shù)據(jù)類型,它包括姓名,職工編號(hào),工資,地址,電話。structEmployee

{

charname[20];

longcode;

floatsalary;

charaddress[50];

charphone[11];

};//分號(hào)是必需的第7章結(jié)構(gòu)和聯(lián)合7.1結(jié)構(gòu)的定義2.結(jié)構(gòu)的定義格式格式:

struct

結(jié)構(gòu)類型名

{

成員定義1;

成員定義2;

……

成員定義n;

};第7章結(jié)構(gòu)和聯(lián)合7.1結(jié)構(gòu)的定義2.結(jié)構(gòu)的定義格式此類型一旦被定義后,可與int、float等基本數(shù)據(jù)類型同等看待。例如可用Employee類型定義結(jié)構(gòu)變量。定義一個(gè)結(jié)構(gòu)類型并不分配內(nèi)存,定義一個(gè)結(jié)構(gòu)變量時(shí)才分配內(nèi)存。第7章結(jié)構(gòu)和聯(lián)合7.1結(jié)構(gòu)的定義3.定義格式舉例structA{

int

a,b,c;

};

structB{

charch;

int

x,y;

doublez;

};structC{

char*cp;

inta[5];

};第7章結(jié)構(gòu)和聯(lián)合7.1結(jié)構(gòu)的定義3.定義格式舉例structD{

int*a;

int*ap;

int

maxsize;

};structE{

intd,*e;

structBb;

};structF{

doubledata;

structF*next;

};第7章結(jié)構(gòu)和聯(lián)合7.1結(jié)構(gòu)的定義4.結(jié)構(gòu)定義說明

(1)若在定義結(jié)構(gòu)AA時(shí)需要結(jié)構(gòu)BB,而定義結(jié)構(gòu)BB時(shí)又需要AA,方法是先給出一個(gè)結(jié)構(gòu)的不完整定義。structBB;structAA{

chara;

structBB*b;

};structBB{

intb;

structAAa;

};第7章結(jié)構(gòu)和聯(lián)合7.1結(jié)構(gòu)的定義4.結(jié)構(gòu)定義說明

(2)一種結(jié)構(gòu)類型的長(zhǎng)度等于其所包含的每個(gè)數(shù)據(jù)成員長(zhǎng)度之和。如上例中A,B,C,D,E,F(xiàn)的長(zhǎng)度分別為12,17,24,12,25,12。

(3)使用結(jié)構(gòu)類型定義對(duì)象時(shí),保留字struct不能省略,為簡(jiǎn)便起見可通過typedef語句定義結(jié)構(gòu)類型的別名,從而省略了保留字struct。如:

typedef

structPersonPerson;

Persona={“xxk”,’m’,52,5230};第7章結(jié)構(gòu)和聯(lián)合7.2結(jié)構(gòu)變量的定義和初始化結(jié)構(gòu)變量定義方法有三種。1.先定義結(jié)構(gòu)類型,再定義變量struct

結(jié)構(gòu)類型名

{

成員定義1;

成員定義2;

……

成員定義n;

};

結(jié)構(gòu)類型名變量名列表;

第7章結(jié)構(gòu)和聯(lián)合7.2結(jié)構(gòu)變量的定義和初始化結(jié)構(gòu)變量定義方法有三種。1.先定義結(jié)構(gòu)類型,再定義變量struct

Arith

{

charop;

int

a,b;

};

intxx=40;

(1)structArith

x,y;

(2)structArithz1={'+',10,xx},z2={'*',60},z3=z1;

(3)structArith*d=&z1;

(4)structAritha[4]={{'+',3,7},{'-',10,5},{'*',6,4},{'/',8,5}};

(5)structArith*b[]={&z1,&z2,a+2,&a[3]};第7章結(jié)構(gòu)和聯(lián)合7.2結(jié)構(gòu)變量的定義和初始化1.先定義結(jié)構(gòu)類型,再定義變量通過malloc()等函數(shù)創(chuàng)建一個(gè)動(dòng)態(tài)結(jié)構(gòu)變量或結(jié)構(gòu)數(shù)組后返回的同樣是對(duì)應(yīng)的存儲(chǔ)空間的首地址,把這個(gè)首地址賦給一個(gè)結(jié)構(gòu)指針后,就可以利用這個(gè)指針訪問所指向的動(dòng)態(tài)結(jié)構(gòu)變量或數(shù)組。例如:struct

Arith*p=malloc(sizeof(struct

Arith));

struct

Arith*a=calloc(n,sizeof(struct

Arith));

free(p);

free(a);第7章結(jié)構(gòu)和聯(lián)合7.2結(jié)構(gòu)變量的定義和初始化2.在定義結(jié)構(gòu)類型的同時(shí)定義變量

struct

結(jié)構(gòu)類型名

{

成員定義1;

成員定義2;

……

成員定義n;

}變量名列表;

第7章結(jié)構(gòu)和聯(lián)合7.2結(jié)構(gòu)變量的定義和初始化2.在定義結(jié)構(gòu)類型的同時(shí)定義變量

structAAA{

chars[20];

inttop;

}a1={"Microsoft",0},a2=a1,a3,*ap;第7章結(jié)構(gòu)和聯(lián)合7.2結(jié)構(gòu)變量的定義和初始化3.定義無名結(jié)構(gòu)類型的同時(shí)定義變量

struct

{

成員定義1;

成員定義2;

……

成員定義n;

}變量名列表;

第7章結(jié)構(gòu)和聯(lián)合7.2結(jié)構(gòu)變量的定義和初始化3.定義無名結(jié)構(gòu)類型的同時(shí)定義變量

structBBB{

charname[10];

struct{//無名結(jié)構(gòu)

int

yy,mm,dd;

}birth;

}bx={"xxk",{55,3,27}};第7章結(jié)構(gòu)和聯(lián)合7.3結(jié)構(gòu)成員的訪問1.訪問結(jié)構(gòu)成員:通過點(diǎn)操作符“.”進(jìn)行。

例:person.code//訪問code成員

person.salary//訪問salary成員2.同類型的結(jié)構(gòu)變量可相互賦值。

structperson

{

charname[20];

unsignedlongid;

floatsalary;

};

personpr1={“Frankvoltaire”,12345678,3.35};

personpr2;

pr2=pr1;//同類型的結(jié)構(gòu)變量可相互賦值第7章結(jié)構(gòu)和聯(lián)合7.3結(jié)構(gòu)成員的訪問3.可將結(jié)構(gòu)變量的地址賦給結(jié)構(gòu)變量,結(jié)構(gòu)指針通過箭頭操作符“->”可訪問結(jié)構(gòu)成員。例:structperson

{

charname[20];

unsignedlongid;

floatsalary;

};

personpr1;

person*prptr=&pr1;

點(diǎn)運(yùn)算訪問結(jié)構(gòu)成員:、pr1.id、pr1.salary

箭頭運(yùn)算訪問結(jié)構(gòu)成員:prptr->name、prptr->id、prptr->salary

點(diǎn)運(yùn)算訪問結(jié)構(gòu)成員:(*prptr).name、(*prptr).id、(*prptr).salary

第7章結(jié)構(gòu)和聯(lián)合7.4使用結(jié)構(gòu)的程序舉例程序7_1程序7_2程序7_37.5結(jié)構(gòu)與函數(shù)結(jié)構(gòu)變量作為函數(shù)形參,結(jié)構(gòu)可作為函數(shù)的返回值類型。例7_1從Student結(jié)構(gòu)數(shù)組中查找某一給定學(xué)號(hào)的記錄,若能夠找到,則表明查找成功,返回元素下標(biāo),否則返回-1,表示查找失敗。第7章結(jié)構(gòu)和聯(lián)合7.5結(jié)構(gòu)與函數(shù)例7_2從Student結(jié)構(gòu)數(shù)組中更新某一給定學(xué)號(hào)的記錄,若更新成功則返回1,否則將新記錄插入到數(shù)組末尾,并修改數(shù)組長(zhǎng)度為已有長(zhǎng)度加1,同時(shí)返回0表示完成插入。7.6結(jié)構(gòu)與鏈表1.鏈表的定義第7章結(jié)構(gòu)和聯(lián)合7.6結(jié)構(gòu)與鏈表1.鏈表的定義結(jié)構(gòu)成員不能是自身的結(jié)構(gòu)變量;但可以是本結(jié)構(gòu)的指針變量。例:structlist

{

charname[20];

list*pn;//ok,pn是本結(jié)構(gòu)的指針變量

listm;//error,m非本結(jié)構(gòu)的指針變量

};

第7章結(jié)構(gòu)和聯(lián)合7.6結(jié)構(gòu)與鏈表1.鏈表的定義若結(jié)構(gòu)中含有指向本結(jié)構(gòu)的指針成員,則該結(jié)構(gòu)可構(gòu)成鏈表。例:struct

IntNode

{

intdata;//結(jié)點(diǎn)值域

struct

IntNode*next;//結(jié)點(diǎn)指針域

};

第7章結(jié)構(gòu)和聯(lián)合7.6結(jié)構(gòu)與鏈表1.鏈表的定義數(shù)組是長(zhǎng)度固定的數(shù)據(jù)結(jié)構(gòu),數(shù)組元素順序、連續(xù)地存放在固定大小的內(nèi)存空間中。鏈表是由節(jié)點(diǎn)組成的非連續(xù)的動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu),鏈表中的節(jié)點(diǎn)在需要時(shí)可由new運(yùn)算動(dòng)態(tài)地創(chuàng)建并加入到鏈表中。數(shù)組具有隨機(jī)存取特性;鏈表具有順序存取特性。第7章結(jié)構(gòu)和聯(lián)合7.6結(jié)構(gòu)與鏈表1.鏈表的定義鏈表經(jīng)常用來存儲(chǔ)需要?jiǎng)討B(tài)變化的數(shù)據(jù),因?yàn)殒湵淼牟迦牒蛣h除操作是比較方便的。鏈表中結(jié)點(diǎn)的存儲(chǔ)空間通常是調(diào)用動(dòng)態(tài)存儲(chǔ)分配函數(shù)得到的,若不通過free()函數(shù)及時(shí)回收結(jié)點(diǎn),則動(dòng)態(tài)分配的結(jié)點(diǎn)空間會(huì)一直持續(xù)到程序運(yùn)行結(jié)束。一個(gè)鏈表結(jié)構(gòu)的示意圖如下:

485672830fdatanext第7章結(jié)構(gòu)和聯(lián)合7.6結(jié)構(gòu)與鏈表2.鏈表的建立操作下例的createList函數(shù)可以從鍵盤上輸入的n個(gè)整數(shù)建立一個(gè)具有n個(gè)結(jié)點(diǎn),每個(gè)結(jié)點(diǎn)為IntNode類型的鏈表,f為表頭指針。參見program7_4.cpp。3.鏈表的遍歷操作下例的traversalList函數(shù)是一個(gè)遍歷鏈表的算法,從表頭指針指向的表頭結(jié)點(diǎn)開始,順序訪問每個(gè)結(jié)點(diǎn),直到結(jié)點(diǎn)的指針域?yàn)榭諘r(shí)止。參見program7_4.cpp。4.使用鏈表的程序舉例,參見program7_4.cpp。第7章結(jié)構(gòu)和聯(lián)合7.7聯(lián)合1.聯(lián)合的定義聯(lián)合也是一種用戶定義的數(shù)據(jù)類型,由若干個(gè)數(shù)據(jù)成員組成。和結(jié)構(gòu)的差別是:任一時(shí)刻,結(jié)構(gòu)中的所有成員都是課訪問的,而聯(lián)合中只有一個(gè)成員是可訪問的,其余所有成員都是不可訪問的。聯(lián)合和結(jié)構(gòu)存儲(chǔ)的差別:每個(gè)結(jié)構(gòu)對(duì)象包含有全部數(shù)據(jù)成員的存儲(chǔ)空間,它所占用的存儲(chǔ)空間的大小等于所有數(shù)據(jù)成員占有的存儲(chǔ)空間大小的總和;每個(gè)聯(lián)合對(duì)象所占用存儲(chǔ)空間的大小等于所有數(shù)據(jù)成員中占有的存儲(chǔ)空間的最大值。第7章結(jié)構(gòu)和聯(lián)合7.7聯(lián)合1.聯(lián)合的定義結(jié)構(gòu)和聯(lián)合的例子structstype{ charch; intgr; int*pt; doubledb;};unionutype{ charch; intgr; int*pt; doubledb;};第7章結(jié)構(gòu)和聯(lián)合7.7聯(lián)合2.聯(lián)合對(duì)象的存儲(chǔ)空間分配假定有:struct

stypex;

struct

utypey;結(jié)構(gòu)對(duì)象x的大小等于所有4個(gè)數(shù)據(jù)成員的大小之和,即1+4+4+8=17。聯(lián)合對(duì)象y的大小等于所有4個(gè)數(shù)據(jù)成員的大小的最大值,即max(1,4,4,8)=8。第7章結(jié)構(gòu)和聯(lián)合7.7聯(lián)合3.使用聯(lián)合的幾點(diǎn)說明(1)結(jié)構(gòu)和聯(lián)合在初始化的方法上不同。系統(tǒng)允許對(duì)結(jié)構(gòu)中的每個(gè)數(shù)據(jù)成員按照定義的次序

溫馨提示

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

評(píng)論

0/150

提交評(píng)論