C語言程序設(shè)計(jì)教程(第4版)-第9章-結(jié)構(gòu)_第1頁
C語言程序設(shè)計(jì)教程(第4版)-第9章-結(jié)構(gòu)_第2頁
C語言程序設(shè)計(jì)教程(第4版)-第9章-結(jié)構(gòu)_第3頁
C語言程序設(shè)計(jì)教程(第4版)-第9章-結(jié)構(gòu)_第4頁
C語言程序設(shè)計(jì)教程(第4版)-第9章-結(jié)構(gòu)_第5頁
已閱讀5頁,還剩34頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

C語言程序設(shè)計(jì)教程

(第4版)第9章結(jié)構(gòu)李麗娟2013年2月第9章結(jié)構(gòu)本章主要內(nèi)容1.了解結(jié)構(gòu)數(shù)據(jù)類型的定義及使用。2.了解結(jié)構(gòu)數(shù)據(jù)類型的意義及作用。3.了解結(jié)構(gòu)變量與函數(shù)的關(guān)系。4.掌握鏈表的作用及操作。5.了解聯(lián)合數(shù)據(jù)類型的定義及使用。6.了解枚舉類型的定義及使用。第9章結(jié)構(gòu)結(jié)構(gòu)體數(shù)據(jù)類型:一種自定義的數(shù)據(jù)類型。由不同數(shù)據(jù)類型的數(shù)據(jù)組合而成的數(shù)據(jù)整體。結(jié)構(gòu)體中所包含的數(shù)據(jù)元素稱之為成員。如:“職員”——→一種結(jié)構(gòu)體描述職員的信息有:編號(hào)、姓名、年齡、性別、身份證號(hào)碼、民族、文化程度、職務(wù)、住址、聯(lián)系電話等。9.1

結(jié)構(gòu)體數(shù)據(jù)類型9.1.1結(jié)構(gòu)體的定義結(jié)構(gòu)類型的定義形式:

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

成員項(xiàng)表列; };成員項(xiàng)表列同簡單變量的定義形式相同。例如:對“職員”數(shù)據(jù),可以定義如下的結(jié)構(gòu)體類型:structperson{longno;

/*職員號(hào)*/charname[12];

/*姓名*/intage;

/*年齡*/charsex;

/*性別*/longindentityNo;

/*身份證號(hào)*/chareducation[12];

/*學(xué)歷*/charaddr[40];

/*住址*/longtelno;

/*電話號(hào)碼*/};9.1

結(jié)構(gòu)體數(shù)據(jù)類型9.1.2結(jié)構(gòu)體變量的定義定義了結(jié)構(gòu)體之后,就可以定義結(jié)構(gòu)體變量。結(jié)構(gòu)變量的定義形式。(1)類型標(biāo)識(shí)符

<變量名列表>;例如:

struct

person

stu,worker;(2)在定義一個(gè)結(jié)構(gòu)體類型的同時(shí)定義結(jié)構(gòu)體類型變量:

struct<結(jié)構(gòu)體名> {

成員項(xiàng)列表; }<變量名列表>;(3)直接定義結(jié)構(gòu)體類型的變量:

struct

{

成員項(xiàng)列表;

}<變量名列表>;9.1

結(jié)構(gòu)體數(shù)據(jù)類型9.1.3結(jié)構(gòu)體變量的初始化

(略)9.1.4結(jié)構(gòu)體變量成員的引用(1)引用結(jié)構(gòu)體變量中的成員。

引用格式:<結(jié)構(gòu)變量名>.<成員名>例如:

stu.no、

stu.age、

[0]等。成員名不能單獨(dú)代表變量,不能直接使用結(jié)構(gòu)中的成員名。若結(jié)構(gòu)體類型中含有另一個(gè)結(jié)構(gòu)類型,訪問該成員時(shí),應(yīng)采取逐級(jí)訪問的方法。(2)將結(jié)構(gòu)體變量作為一個(gè)整體來使用。結(jié)構(gòu)體變量可以相互賦值。

(條件是這兩個(gè)變量必須具有相同的結(jié)構(gòu)體類型。)9.1

結(jié)構(gòu)體數(shù)據(jù)類型例1:閱讀程序example9_1.c,了解結(jié)構(gòu)體成員的使用方法。9.1.5結(jié)構(gòu)體變量成員的輸入/輸出只允許對結(jié)構(gòu)變量的成員進(jìn)行輸入輸出。不允許將結(jié)構(gòu)體變量作為整體進(jìn)行輸入或輸出操作。9.2結(jié)構(gòu)體數(shù)組9.2.1結(jié)構(gòu)體數(shù)組的定義結(jié)構(gòu)體數(shù)組的定義:(1)先定義結(jié)構(gòu)體,再定義結(jié)構(gòu)體數(shù)組。

struct<結(jié)構(gòu)體名> { <成員項(xiàng)表列> };

struct<結(jié)構(gòu)體名>

<數(shù)組名>[<數(shù)組大小>];(2)在定義結(jié)構(gòu)體的同時(shí),定義結(jié)構(gòu)體數(shù)組。

struct<結(jié)構(gòu)體名> { <成員項(xiàng)表列> }<數(shù)組名>[<數(shù)組大小>];9.2結(jié)構(gòu)體數(shù)組(3)直接定義結(jié)構(gòu)體變量而不定義結(jié)構(gòu)體名。 struct { <成員項(xiàng)表列> }<數(shù)組名>[<數(shù)組大小>];9.2.2結(jié)構(gòu)體數(shù)組成員的初始化和引用

(略)9.3結(jié)構(gòu)體變量與函數(shù)9.3.1函數(shù)的形參與實(shí)參為結(jié)構(gòu)體作用:傳值例2:閱讀程序example9_2.c,了解結(jié)構(gòu)變量作為函數(shù)參數(shù)的作用。9.3.2函數(shù)的返回值類型為結(jié)構(gòu)體新的C標(biāo)準(zhǔn)中允許函數(shù)的返回值為結(jié)構(gòu)體類型的值。例3:修改例9-2所示的程序,將“輸入購書信息”模塊的返回值修改成結(jié)構(gòu)類型。9.4聯(lián)合體數(shù)據(jù)類型9.4聯(lián)合體數(shù)據(jù)類型聯(lián)合體又稱為共用體。聯(lián)合體類型與結(jié)構(gòu)體類型的同異:相同之處:定義形式與結(jié)構(gòu)體類型的定義形式相同。

不同之處:①關(guān)鍵字不同,共用體的關(guān)鍵字為union。

②占用的內(nèi)存單元不同。特點(diǎn):

不同類型的數(shù)組項(xiàng)在內(nèi)存中所占用的起始單元是相同的。提示:

注意聯(lián)合類型變量的使用特點(diǎn)。9.4聯(lián)合體數(shù)據(jù)類型比較結(jié)構(gòu)類型變量和聯(lián)合類型變量占用的內(nèi)存情況:結(jié)構(gòu)類型:structmemb{floatv;intn;charc;}stag;聯(lián)合類型:unionmemb{floatv;intn;charc;}utag;stag占用內(nèi)存單元utag占用內(nèi)存單元9.4聯(lián)合體數(shù)據(jù)類型例4:閱讀程序example9_4.c,分析和了解聯(lián)合體變量成員的取值情況。例5:閱讀程序example9_5.c,了解聯(lián)合體類型變量的賦值情況。9.5枚舉數(shù)據(jù)類型枚舉數(shù)據(jù)類型:用標(biāo)識(shí)符表示的整數(shù)常量的集合。枚舉類型定義的一般形式:

enum<枚舉類型名>{標(biāo)識(shí)符1,標(biāo)識(shí)符2,……,標(biāo)識(shí)符n};枚舉常量的起始值為0。例如:

enummonths{JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC};標(biāo)識(shí)符的值被依次自動(dòng)設(shè)置為整數(shù)0~11。可以改變標(biāo)識(shí)符的取值,例如:

enummonths{JAN=1,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC};標(biāo)識(shí)符的值被依次自動(dòng)設(shè)置為整數(shù)1~12。9.5枚舉數(shù)據(jù)類型幾點(diǎn)說明:枚舉類型定義中的標(biāo)識(shí)符必須是唯一的。可以在枚舉類型定義時(shí)為每一個(gè)枚舉常量指定不同的值。也可以對中間的某個(gè)枚舉常量指定不同的值。例如:

enumclolor{red,blue,green,yellow=5,black,white};由于只指定了yellow的值,則枚舉常量的取值情況為: red=0,blue=1,green=2, yellow=5,black=6,while=7。枚舉常量的值不可更改,但可以作為整型數(shù)使用。9.5枚舉數(shù)據(jù)類型枚舉變量的定義形式:

enum<枚舉類型名>變量名1,變量名2,……變量名n;例如:

enummonthwork_day,rest_day;也可以在定義枚舉類型的同時(shí)定義枚舉變量。例如:

enumcolor{red,yellow,green}

light;枚舉常量標(biāo)識(shí)符是不能直接輸入/輸出的,要通過其他方式來輸出枚舉常量標(biāo)識(shí)符。9.5枚舉數(shù)據(jù)類型例6:閱讀程序example9_6.c,了解枚舉變量的輸出方式。9.6鏈表的概念基本概念:①鏈表指的是將若干個(gè)數(shù)據(jù)項(xiàng)按一定的規(guī)則連接起來的表。②鏈表中的數(shù)據(jù)項(xiàng)稱為結(jié)點(diǎn)。③鏈表中每一個(gè)結(jié)點(diǎn)的數(shù)據(jù)類型都有一個(gè)自引用結(jié)構(gòu)④自引用結(jié)構(gòu)就是結(jié)構(gòu)成員中包含一個(gè)指針成員,該指針指向與自身同一個(gè)類型的結(jié)構(gòu)。例如:

structnode {intdata;

structnode*nextPtr; };9.6鏈表的概念鏈表是用鏈節(jié)指針連接在一起的結(jié)點(diǎn)的線性集合。其結(jié)構(gòu)如圖所示:自引用結(jié)構(gòu)成員的變量通常是指針型的。結(jié)構(gòu)成員的引用與成員的類型相關(guān)。假如有:

structnode {

intdata;

structnode*nextPtr; };定義結(jié)構(gòu)變量:

structnode*pt;結(jié)構(gòu)成員的引用:

pt->data; pt->nextptr;或:

(*pt).data; (*pt).nextptr;9.6鏈表的概念鏈表可以組成較為復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。根據(jù)數(shù)據(jù)之間的相互關(guān)系,鏈表又可分為單鏈表、循環(huán)鏈表、雙向鏈表等。鏈表的可以建立動(dòng)態(tài)的數(shù)據(jù)結(jié)構(gòu),可以將不連續(xù)的內(nèi)存數(shù)據(jù)連接起來。本章重點(diǎn):單鏈表。其他鏈表參見“數(shù)據(jù)結(jié)構(gòu)”等教程。9.6鏈表的概念9.6.1動(dòng)態(tài)分配內(nèi)存動(dòng)態(tài)分配內(nèi)存空間的系統(tǒng)函數(shù):

malloc()和free()函數(shù)以及sizeof運(yùn)算符的配合使用

(注:

malloc()和free()函數(shù)在頭文件stdlib.h或alloc.h)。函數(shù)原型及功能如下。1.函數(shù)原型:void*malloc(unsignedsize)功能:從內(nèi)存分配一個(gè)大小為size個(gè)字節(jié)的內(nèi)存空間。若成功,返回新分配內(nèi)存的首地址;若沒有足夠的內(nèi)存分配,則返回NULL。通常函數(shù)malloc()通常和運(yùn)算符sizeof一起使用。9.6鏈表的概念例如:

int*p;

p=malloc(20*sizeof(int));/*分配20個(gè)整型數(shù)所需的內(nèi)存空間*/系統(tǒng)分配能存放20個(gè)整型數(shù)連續(xù)空間,

p指向該存儲(chǔ)空間的首地址。例如: structstudent {intno;

intscore;

structstudent*next; }; structstudent*stu; stu=malloc(sizeof(structstudent));通過sizeof計(jì)算structstudent的字節(jié)數(shù),分配sizeof(structstudent)個(gè)字節(jié)數(shù)的內(nèi)存空間,

stu指向該存儲(chǔ)空間的首地址。9.6鏈表的概念2.函數(shù)原型:voidfree(void*p)功能:釋放由malloc函數(shù)所分配的內(nèi)存塊,無返回值。例如:free(stu);作用:將stu所指的內(nèi)存空間釋放。幾點(diǎn)注意:①結(jié)構(gòu)類型占用的內(nèi)存空間不一定是連續(xù)的,因此,應(yīng)該用sizeof運(yùn)算符來確定結(jié)構(gòu)類型占用內(nèi)存空間的大小。②使用malloc()函數(shù)時(shí),應(yīng)對其返回值進(jìn)行檢測是否為NULL,以確保程序的正確。③要及時(shí)地使用free()函數(shù)釋放不再需要的內(nèi)存空間,避免系統(tǒng)資源過早地用光。④不要引用已經(jīng)釋放的內(nèi)存空間。9.6鏈表的概念9.6.2單鏈表的建立鏈表:通過自引用結(jié)構(gòu)的指針域,將各節(jié)點(diǎn)相互連接。關(guān)于鏈表的基本概念:(1)鏈表的第一個(gè)結(jié)點(diǎn)稱頭指針或頭結(jié)點(diǎn),它指向鏈表在內(nèi)存中的首地址,(2)其后的結(jié)點(diǎn)是通過結(jié)點(diǎn)中的鏈節(jié)指針成員訪問的。(3)鏈表的最后一個(gè)結(jié)點(diǎn)稱為尾節(jié)點(diǎn)。尾節(jié)點(diǎn)的指針域通常被設(shè)置成NULL。(4)鏈表中的每一個(gè)結(jié)點(diǎn)是在需要的時(shí)候建立的。(5)各結(jié)點(diǎn)在內(nèi)存中的存儲(chǔ)地址不一定是連續(xù)的,由系統(tǒng)自動(dòng)分配的,即有可能是連續(xù)分配內(nèi)存空間,也有可能是跳躍式的不連續(xù)分配內(nèi)存空間。9.6鏈表的概念建立單鏈表的主要步驟:①定義單鏈表的數(shù)據(jù)結(jié)構(gòu)(定義自引用結(jié)構(gòu))。②建立表頭(建立一個(gè)空表)。③利用malloc函數(shù)向系統(tǒng)申請分配一個(gè)結(jié)點(diǎn)空間。④將新結(jié)點(diǎn)的指針成員的值賦為空(NULL),若是空表,將新結(jié)點(diǎn)連接到表頭;若非空表,則將新結(jié)點(diǎn)連接到表尾。⑤若有后續(xù)結(jié)點(diǎn)要接入鏈表,則轉(zhuǎn)到③,否則結(jié)束。輸出一個(gè)單鏈表的主要步驟:①找出表頭結(jié)束,結(jié)點(diǎn)指針P指向頭結(jié)點(diǎn)。②若P非空,循環(huán)執(zhí)行下列操作。{

輸出結(jié)點(diǎn)值;P指向下一結(jié)點(diǎn);}9.6鏈表的概念例7:編寫程序,創(chuàng)建一個(gè)鏈表,該鏈表可以存放從鍵盤輸入的任意長度的字符串,以按下回車鍵作為輸入的結(jié)束。統(tǒng)計(jì)輸入的字符個(gè)數(shù)并將其字符串輸出。程序:example9_7.c例8:編寫程序,用鏈表的結(jié)構(gòu)建立一條公交線路的站點(diǎn)信息,從鍵盤依次輸入從起點(diǎn)到終點(diǎn)的各站站名,以單個(gè)“#”字符作為輸入結(jié)束,統(tǒng)計(jì)站的數(shù)量并輸出這些站點(diǎn)。分析:站點(diǎn)信息結(jié)構(gòu)設(shè)計(jì)如下:

structstation { charname[8]; structstation*nextSta; };設(shè)計(jì)函數(shù):structstation*creat_sta(structstation*h);

/*將鍵盤輸入的站點(diǎn)名依次插入到鏈表h中*/程序:example9_8.c9.6鏈表的概念9.6.3從單鏈表中刪除結(jié)點(diǎn)在鏈表中刪去一個(gè)結(jié)點(diǎn),不允許破壞原鏈表的結(jié)構(gòu)。例如,對于這樣的自引用結(jié)構(gòu):

structnode {intn;

structnode*next; };假定已建好鏈表:刪除s節(jié)點(diǎn)后的鏈表:9.6鏈表的概念刪除節(jié)點(diǎn)方法:修改指針域的值。根據(jù)被刪節(jié)點(diǎn)的位置,修改指針域的方法要分3種不同情況:①s結(jié)點(diǎn)在表的中間(即不在表頭,也不在表尾):

p->next=s->next;②s結(jié)點(diǎn)位于表頭:

head=s->next;③s結(jié)點(diǎn)位于表尾:

p->next=NULL;結(jié)點(diǎn)刪除后,用free()函數(shù)釋放被刪除結(jié)點(diǎn)所占用的內(nèi)存空間。例如:free(s);

/*釋放了節(jié)點(diǎn)s所占用的空間。*/9.6鏈表的概念例9:修改例9-8的程序,再從鍵盤輸入一個(gè)要?jiǎng)h除的站點(diǎn)名,并將刪除后的站點(diǎn)依次輸出。分析:在例9-8程序的基礎(chǔ)上增加一個(gè)刪除節(jié)點(diǎn)的函數(shù):

structstation*del_sta(structstation*h,

char*str);函數(shù)功能:

在h所指的鏈表中,刪除結(jié)點(diǎn)值為str所指字符串的結(jié)點(diǎn)。程序:

example9_9.c請分析函數(shù):

structstation*del_sta(structstation*h,char*str);的算法。思考程序中存在的問題,怎樣處理可以使程序更加完善?9.6鏈表的概念9.6.4向鏈表中插入結(jié)點(diǎn)插入節(jié)點(diǎn)方法:修改指針域的值。根據(jù)節(jié)點(diǎn)插入的位置,修改指針域的方法要分3種不同情況:①s結(jié)點(diǎn)插入到表中(即不在表頭,也不在表尾)修改指針:

s->next=t; p->next=s;9.6鏈表的概念②s結(jié)點(diǎn)插入到表頭。圖(a)所示為插入前的鏈表,圖(b)所示為插入后的鏈表。修改指針:

s->next=t; head=s;9.6鏈表的概念②s結(jié)點(diǎn)插入到表尾。圖(a)所示為插入前的鏈表,圖(b)所示為插入后的鏈表。修改指針:

p->next=s; s->next=NULL;9.6鏈表的概念例10:修改例9-8的程序,從鍵盤輸入一個(gè)要加入的站點(diǎn)名,并將加入后的站點(diǎn)依次輸出。分析:可以在例9-8程序的基礎(chǔ)上增加一個(gè)增加節(jié)點(diǎn)的函數(shù):structstation*add_sta(structstation*h,char*stradd,char*strafter);函數(shù)功能:將stradd所指的站點(diǎn)插入到h鏈表中站點(diǎn)原有的站點(diǎn)strafter的后面。程序:example9_10.c9.7程序范例例11:編寫程序,從鍵盤輸入一個(gè)矩形的左下角和右上角的坐標(biāo),輸出該矩形的中心點(diǎn)坐標(biāo)值,再輸入任意一個(gè)點(diǎn)的坐標(biāo),判斷該點(diǎn)是否在矩形內(nèi)。分析:用xd、yd代表矩形的左下角坐標(biāo);用xu、yu代表矩形的右上角坐標(biāo);用xm、ym代表矩形的中點(diǎn)坐標(biāo);設(shè)計(jì)函數(shù):intptin(structpointp,structrectr),用于判斷輸入的點(diǎn)p是否在矩形r的內(nèi)部。程序:example9_11.c9.7程序范例例12:改進(jìn)例8-25的程序。采用結(jié)構(gòu),設(shè)計(jì)一個(gè)洗牌和發(fā)牌的程序,用H代表紅桃,D代表方片,C代表梅花,S代表黑桃,用1~13代表每一種花色的面值。分析:可用結(jié)構(gòu)類型來表示撲克牌的花色和面值:

structcard{ char*face;/*撲克牌的面值*/ char*suit;

/*撲克牌的花色*/ };設(shè)計(jì)函數(shù):voidshuffle(Card*)完成對撲克牌洗牌。程序:example9_12.c9.7程序范例例13:修改例9-12,用位段結(jié)構(gòu)成員表示一副牌,發(fā)牌時(shí)顯示每張牌的顏色。分析:因?yàn)榕频拿嬷抵挥?3種,牌的花色只有4種,牌的顏色只有2種,因此,可用一個(gè)位段結(jié)構(gòu)來表示一副牌:struc

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論