第十一章 結(jié)構(gòu)體_第1頁
第十一章 結(jié)構(gòu)體_第2頁
第十一章 結(jié)構(gòu)體_第3頁
第十一章 結(jié)構(gòu)體_第4頁
第十一章 結(jié)構(gòu)體_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第十一章 結(jié)構(gòu)體 1、用戶定義類型(、用戶定義類型(typedef)形式:形式: typedef 類型名類型名 標(biāo)識符;標(biāo)識符;例:typedef int zhengxing;解釋:解釋:1、typedef是用戶定義類型的關(guān)鍵字 2、類型名:是在定義以前必須存在的數(shù)據(jù)類型(一般是c語言已經(jīng) 規(guī)定好的數(shù)據(jù)類型) 3、用戶定義類型的含義就是把已經(jīng)存在的數(shù)據(jù)類型更改個名字, 更改后的數(shù)據(jù)類型的功能與原來的數(shù)據(jù)類型保持一致。列:Typedef int zhengMain() zheng a=8; printf(“%d”,a);第十一章 結(jié)構(gòu)體Tpyedef 除了可以定義除了可以定義c語言已經(jīng)存在的數(shù)據(jù)

2、類型外還可以再次定義我們語言已經(jīng)存在的數(shù)據(jù)類型外還可以再次定義我們自己定義的數(shù)據(jù)類型。自己定義的數(shù)據(jù)類型。列:Typedef int zhengMain() typedef zheng b; b a=8; printf(“%d”,a);Typedef一般在程序開始時定義,而且它一般只用來定義一些比較不好記一般在程序開始時定義,而且它一般只用來定義一些比較不好記憶或太長的數(shù)據(jù)類型比如憶或太長的數(shù)據(jù)類型比如 unsinged int 、unsinged short int 等等。等等。第十一章 結(jié)構(gòu)體 在實際問題中,一組數(shù)據(jù)往往具有不同的數(shù)據(jù)類型。例如, 在學(xué)生登記表中,姓名應(yīng)為字符型;學(xué)號可為整

3、型或字符型; 年齡應(yīng)為整型;性別應(yīng)為字符型;成績可為整型或?qū)嵭汀?顯然不能用一個數(shù)組來存放這一組數(shù)據(jù)。 因為數(shù)組中各元素的類型和長度都必須一致,以便于編譯系統(tǒng)處理。為了解決這個問題,語言中給出了另一種構(gòu)造數(shù)據(jù)類型“結(jié)構(gòu)”。 “結(jié)構(gòu)結(jié)構(gòu)”是一種構(gòu)造類型,是一種構(gòu)造類型,它是由若干“成員成員”組成的。 每一個成員可以是一個基本數(shù)據(jù)類型或者又是一個構(gòu)造類型。 結(jié)構(gòu)既是一種“構(gòu)造”而成的數(shù)據(jù)類型, 那么在說明和使用之前必須先定義它,也就是構(gòu)那么在說明和使用之前必須先定義它,也就是構(gòu)造它造它。如同在說明和調(diào)用函數(shù)之前要先定義函數(shù)一樣。第十一章 結(jié)構(gòu)體 2、結(jié)構(gòu)的聲名、結(jié)構(gòu)的聲名聲明一個結(jié)構(gòu)的一般形式為:

4、 struct 結(jié)構(gòu)名結(jié)構(gòu)名 成員表列成員表列 ;成員表由若干個成員組成, 每個成員都是該結(jié)構(gòu)的一個組成部分。對每個成員也必須作類型說明,其形式為:類型說明符 成員名; 成員名的命名應(yīng)符合標(biāo)識符的書寫規(guī)定。例如: 第十一章 結(jié)構(gòu)體 struct stuint num;char name20;char sex;float score; 解釋:1、struct是結(jié)構(gòu)體的關(guān)鍵字不可省略。 2、不可省略。 3、注意在結(jié)構(gòu)體結(jié)束后要用“;”結(jié)束,不可省略 4、一個結(jié)構(gòu)體中可以包含若干個成員,成員可以是變量、指針、 數(shù)組。第十一章 結(jié)構(gòu)體 3、由結(jié)構(gòu)結(jié)構(gòu)體定義出對象、由結(jié)構(gòu)結(jié)構(gòu)體定義出對象當(dāng)一個結(jié)構(gòu)體已經(jīng)

5、定義好后我們可以應(yīng)用此結(jié)構(gòu)體定義出對象。它一共有3種方式,3-1:聲明時直接定義:聲明時直接定義 struct student int age; char * sex; int height; zhang,* wang; 3-2:省略結(jié)構(gòu)體名省略結(jié)構(gòu)體名 struct int age; char * sex; int height; zhang,wang ; 第十一章 結(jié)構(gòu)體3-3:使用使用typedef說明一個結(jié)構(gòu)體類型名,再用新類型名來定義變量說明一個結(jié)構(gòu)體類型名,再用新類型名來定義變量typedef struct int age; char * sex; int height; stud

6、ent ; student zhang;student * wang;3-4:先聲明再定義:先聲明再定義struct struct int age; char * sex; int height; student ; struct student zhang, * wang;第十一章 結(jié)構(gòu)體4、結(jié)構(gòu)體的賦值、結(jié)構(gòu)體的賦值和一般的變量和數(shù)組一樣,結(jié)構(gòu)體也可以在定義時賦值。struct student int age; char * sex; int height; wang=15,”wang”,100; 結(jié)構(gòu)體數(shù)組賦值結(jié)構(gòu)體數(shù)組賦值struct student int age; char * s

7、ex; int height; people3=25,”wang”,100,25,”zhang”,120,24.”li”,140; 第十一章 結(jié)構(gòu)體 在定義后再賦值在定義后再賦值 struct student int age; char * sex; int height; ;struct student wang;wang=10,”wang”,40; 結(jié)構(gòu)體中的數(shù)組成員的賦值結(jié)構(gòu)體中的數(shù)組成員的賦值 struct student int age; char * sex; int height3; wang=15,”wang”,100,120,130; 第十一章 結(jié)構(gòu)體結(jié)構(gòu)體中的結(jié)構(gòu)體成員的賦

8、值結(jié)構(gòu)體中的結(jié)構(gòu)體成員的賦值 struct date int year; int mouth; int day; ;struct student int age; char * name; struct date brithday;wang=25,”wang”,1980,2,20;第十一章 結(jié)構(gòu)體 5、使用結(jié)構(gòu)體中的數(shù)據(jù)、使用結(jié)構(gòu)體中的數(shù)據(jù)根據(jù)定義的對象不同我們可以使用根據(jù)定義的對象不同我們可以使用3種方式來使用結(jié)構(gòu)體的數(shù)據(jù)種方式來使用結(jié)構(gòu)體的數(shù)據(jù)(1)如果被定義的對象為普通類型)如果被定義的對象為普通類型 對象對象.結(jié)構(gòu)體成員結(jié)構(gòu)體成員(2)如果被定義的對象為指針類型)如果被定義的對象為指針

9、類型 對象對象-結(jié)構(gòu)體成員結(jié)構(gòu)體成員 (*對象)對象). 結(jié)構(gòu)體成員結(jié)構(gòu)體成員例:例:struct student char * name;int age;int height;wang,* wang1;wang1=&wang;wang.age=12;wang1-age=12;(*wang1).age=12;第十一章 結(jié)構(gòu)體6、結(jié)構(gòu)體舉例、結(jié)構(gòu)體舉例1、制作結(jié)構(gòu)student ,里面有2項分別存放學(xué)生的年齡和姓名,在程序中象年齡和姓名中輸入數(shù)據(jù),并顯示。Struct student char * name; int age;main() struct student a1; scanf

10、(“%s”,); scanf(“%d”,&a1.age); printf(“student name( %s)n”,); printf(“student age(%d)”,a1.age); 第十一章 結(jié)構(gòu)體 2、編寫程序,把、編寫程序,把5位學(xué)生的姓名,年齡,位學(xué)生的姓名,年齡,4項成績以及平均成績放在一個項成績以及平均成績放在一個結(jié)構(gòu)體數(shù)組中,學(xué)生的姓名,年齡,結(jié)構(gòu)體數(shù)組中,學(xué)生的姓名,年齡,4項成績由鍵盤輸入,平均成績由程項成績由鍵盤輸入,平均成績由程序自己計算。序自己計算。第十一章 結(jié)構(gòu)體 函數(shù)之間結(jié)構(gòu)體變量的數(shù)據(jù)傳遞函數(shù)之間結(jié)構(gòu)體變量的數(shù)據(jù)傳遞1、傳

11、遞結(jié)構(gòu)體的地址、傳遞結(jié)構(gòu)體的地址typedef struct char s10; int t;st;getdata(st * p) scanf(“%s %d”,p-s,&p-t );main() st a; getdata(&a); printf(“%s,%dn”,a.s,a.t);第十一章 結(jié)構(gòu)體 2、函數(shù)的返回值是結(jié)構(gòu)體類型、函數(shù)的返回值是結(jié)構(gòu)體類型typedef struct char a; int t;st;st fun(st x) x.a=99;x.b=s;,return x;main() st y; y.a=0;y.b=a; printf(“y.a=%d y.b=%

12、cn”,y.a,y.b); y=fun(y); printf(“y.a=%d y.b=%cn”,y.a,y.b);第十一章 結(jié)構(gòu)體 3、通過函數(shù)的返回值返回指向結(jié)構(gòu)體變量的指針、通過函數(shù)的返回值返回指向結(jié)構(gòu)體變量的指針typedef struct char a; int t;st;st * fun(st * x) st * px ;(*x).a=99;(*x).b=s;px=x;,return px;main() st y, *p ; y.a=0;y.b=a; printf(“y.a=%d y.b=%cn”,y.a,y.b); p=fun(&y); printf(“(*p).a=%d

13、(*p).b=%cn”,(*p).a,p-b);第十一章 結(jié)構(gòu)體 利用結(jié)構(gòu)體變量構(gòu)成鏈表利用結(jié)構(gòu)體變量構(gòu)成鏈表1、結(jié)構(gòu)體中含有可以指向本結(jié)構(gòu)體的成員、結(jié)構(gòu)體中含有可以指向本結(jié)構(gòu)體的成員當(dāng)一個結(jié)構(gòu)體中有一個或多個成員指向本結(jié)構(gòu)體,則稱當(dāng)一個結(jié)構(gòu)體中有一個或多個成員指向本結(jié)構(gòu)體,則稱 引用自身的結(jié)構(gòu)引用自身的結(jié)構(gòu)體。體。struct link char ch; struct link *p;a;由于由于p是一個指向是一個指向struct link類型的指針,因此類型的指針,因此a.p=&a是合法的是合法的a.cha.p第十一章 結(jié)構(gòu)體 一個簡單的鏈表一個簡單的鏈表struct node i

14、nt data; struct node * next;typedef struct node NODETYPEmain() NODETYPE a,b,c,*h,*p; a.data=10;b.data=20;c.data=30; h=&a; a.next=&b; c.next=&c; c.next=0; p=h; while(p) printf(“%d”,p-data); p=p-next; printf(“n”);h=&aa.dataa.next=&bb.datab.next=&cc.datac.next=null第十一章 結(jié)構(gòu)體 其中a b

15、 c稱為結(jié)點,它們都是通過定義由系統(tǒng)在內(nèi)存中開辟的固定的互不連續(xù)的存儲單元。在程序運行過程中不可人為的,再生成新的存儲單元也不可使開辟的存儲單元消失。因此這種鏈表叫做“靜態(tài)鏈表”,而我們經(jīng)常使用的是動態(tài)鏈表。動態(tài)鏈表:動態(tài)鏈表:在c語言中使用數(shù)組有一定局限性,使用動態(tài)分配雖然可以隨時開辟存儲單元但,但動態(tài)存儲的單元是不連續(xù),用鏈表可以解決上述問題,鏈表中的結(jié)點除了可以存放數(shù)據(jù)外還可以存放一個指針,用此指針來指向下一個結(jié)點的地址,這樣就可以把各結(jié)點連接起來,由于各存儲單元都是動態(tài)分配的所以稱此鏈表為 動態(tài)鏈表。注意:在動態(tài)鏈表中,每個結(jié)點元素都沒有自己的名字,只能靠指針維系結(jié)點元素之間的連續(xù)關(guān)系

16、,一旦某個元素的指針斷開,后續(xù)元素就無法找尋。第十一章 結(jié)構(gòu)體 每個鏈表都有一個頭結(jié)點,里面只存放一個頭指針(head)。此指針里存放鏈表中的第一個結(jié)點地址。鏈表中最后一個結(jié)點指針中不存放任何地址只存放”0”值。標(biāo)志斂表結(jié)束。以上鏈表每個結(jié)點都只有一個指針,存放下一個結(jié)點的地址,因此,鏈表只能從當(dāng)前結(jié)點找到后續(xù)結(jié)點。故稱單單項鏈表項鏈表建立帶頭結(jié)點的單項鏈表建立帶頭結(jié)點的單項鏈表步驟:讀取數(shù)據(jù),生成新結(jié)點,將數(shù)據(jù)存入結(jié)點的成員變量中,將新接點步驟:讀取數(shù)據(jù),生成新結(jié)點,將數(shù)據(jù)存入結(jié)點的成員變量中,將新接點插入掉鏈表。插入掉鏈表。例:編寫函數(shù)例:編寫函數(shù) c_slist1,建立帶有頭結(jié)點的單項鏈

17、表,結(jié)點數(shù)據(jù)中的數(shù)值,建立帶有頭結(jié)點的單項鏈表,結(jié)點數(shù)據(jù)中的數(shù)值從鍵盤輸入,以從鍵盤輸入,以-1作為結(jié)束標(biāo)志,鏈表的頭結(jié)點的地址由函數(shù)值返回作為結(jié)束標(biāo)志,鏈表的頭結(jié)點的地址由函數(shù)值返回。struct slist int data; struct slist * next;typedef struct slist SLIST;第十一章 結(jié)構(gòu)體 SLIST * c_slist() int c; SLIST *h,*s,*r; h=(SLIST*)malloc(sizeof(SLIST); r=h; scanf(“%d”,&c); whlie(c!=-1) s=(SLIST *)malloc

18、(sizeof(SLIST); s-data=c; r-next=s; r=s; scanf(“%d”,&c); r-next=0; return h;指針h用于存放頭結(jié)點的地址。指針s用于用來指向新生成的結(jié)點指針r總是指向鏈表中的尾結(jié)點。生成頭結(jié)點生成頭結(jié)點讀入數(shù)據(jù)讀入數(shù)據(jù)未讀到數(shù)據(jù)結(jié)束標(biāo)志時進入循環(huán)未讀到數(shù)據(jù)結(jié)束標(biāo)志時進入循環(huán)生成一個新結(jié)點生成一個新結(jié)點讀入的數(shù)據(jù)存放到新結(jié)點的讀入的數(shù)據(jù)存放到新結(jié)點的data中中新結(jié)點連到表尾新結(jié)點連到表尾r指向當(dāng)前表尾指向當(dāng)前表尾讀入數(shù)據(jù)讀入數(shù)據(jù)設(shè)置表尾結(jié)束符設(shè)置表尾結(jié)束符返回表頭指針。返回表頭指針。第十一章 結(jié)構(gòu)體 順序訪問鏈表中的各數(shù)據(jù)域順序

19、訪問鏈表中的各數(shù)據(jù)域利用一個工作指針從頭到尾依次指向鏈表中的每個結(jié)點。利用一個工作指針從頭到尾依次指向鏈表中的每個結(jié)點。Void print_slist SLIST * p; p=head-next; p指向頭結(jié)點后的第一個結(jié)點指向頭結(jié)點后的第一個結(jié)點 if(p=0) printf(“is null”) 鏈表為空時鏈表為空時 else printf(“head”); do printf(“%d”,p-data); 輸出當(dāng)前結(jié)點中的數(shù)據(jù)中的值輸出當(dāng)前結(jié)點中的數(shù)據(jù)中的值 p=p=next; p指向下一個結(jié)點指向下一個結(jié)點 while(p!=0); printf(“-endn”) 第十一章 結(jié)構(gòu)體 共同體共同體共同體和結(jié)構(gòu)體的類型說明和變量的定義完全相同,不用的是共同的里所共同體和結(jié)構(gòu)體的類型說明和變量的定義完全相同,不用的是共同的里所有成員占用同一塊存儲空間。有成員占用同一塊存儲空間。格式:除了把關(guān)鍵字換成格式:除了把關(guān)鍵字換成union外其他與結(jié)構(gòu)體相同。外其他與結(jié)構(gòu)體相同。變量的定義與結(jié)構(gòu)體相同也有變量的定義與結(jié)構(gòu)體相同也有4種方式種方式例:例:union un1 int I;

溫馨提示

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

評論

0/150

提交評論