C語言程序設(shè)計-第11章-結(jié)構(gòu)體和共用體_第1頁
C語言程序設(shè)計-第11章-結(jié)構(gòu)體和共用體_第2頁
C語言程序設(shè)計-第11章-結(jié)構(gòu)體和共用體_第3頁
C語言程序設(shè)計-第11章-結(jié)構(gòu)體和共用體_第4頁
C語言程序設(shè)計-第11章-結(jié)構(gòu)體和共用體_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

結(jié)構(gòu)體和共用體第11章本章內(nèi)容概述定義結(jié)構(gòu)體類型變量的方法結(jié)構(gòu)體變量的引用結(jié)構(gòu)體變量的引用和初始化結(jié)構(gòu)體數(shù)組指向結(jié)構(gòu)體類型數(shù)據(jù)的指針用指針處理鏈表共用體枚舉類型用typedef定義類型11.1概述定義一個組合項中包含若干個類型不同(或相同)的數(shù)據(jù)項,這樣的數(shù)據(jù)結(jié)構(gòu)稱為結(jié)構(gòu)體。 例如:numnamesexageaddr

structstudent {

intnum; charname[20]; charsex;

intage; charaddr[30];};聲明結(jié)構(gòu)體類型的一般形式

struct

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

{成員表列};"成員表列"稱為"域表"。每個成員稱為結(jié)構(gòu)體中的一個域,對各成員(域)的定義形式如下: 類型名成員名;11.2定義結(jié)構(gòu)體類型變量的方法三種方法:先聲明結(jié)構(gòu)體類型,再定義變量名。在定義類型的同時定義變量。直接定義結(jié)構(gòu)類型變量。方法一:假設(shè)有如下定義:

structstudent {

intnum; charname[20]; charsex;

intage; floatscore; charaddr[30]; };

structstudentstud1,stud2;11.2定義結(jié)構(gòu)體類型變量的方法方法二:

struct

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

{

成員表列

}變量名表列;方法三:

struct

{

成員表列

}變量名表列;對結(jié)構(gòu)體類型的幾點(diǎn)說明類型與變量是不同的概念。在編譯時,對類型是不分配空間的,只對變量分配空間。結(jié)構(gòu)體中的成員可以單獨(dú)引用。成員也可以是一個結(jié)構(gòu)體變量。(P283)成員名可以與程序中的變量名相同。11.3結(jié)構(gòu)體變量的引用四項原則不能整體輸入輸出,只能對各個成員分別引用。

結(jié)構(gòu)體變量名.成員名

(成員運(yùn)算符".")如果成員本身又屬于一個結(jié)構(gòu)體類型,則用多個成員運(yùn)算符,一級一級地找到最低一級的成員,只能對最低一級的成員進(jìn)行賦值、存取及運(yùn)算。 例如:structdate{

intmonth;

intday;

intyear;};

structstudent{charname[20];charsex;

intage;

structdatebirthday;};stu1,stu2;

stu1.birthday.month=1;11.3結(jié)構(gòu)體變量的引用對成員變量可以像普通變量一樣進(jìn)行各種運(yùn)算。例如:

stu1.num++;可以引用成員的地址,也可以應(yīng)用結(jié)構(gòu)體變量的地址。 例如:

scanf("%d",&stu1.num);

printf("%o",&stu1);

但不能用以下語句整體讀入結(jié)構(gòu)體變量, 例如:

scanf(“%s,%c,%d,”,&stu1);//錯誤11.4結(jié)構(gòu)體變量的初始化結(jié)構(gòu)體變量和其它類型變量一樣,可以在定義時指定初始值。 例11.1:對結(jié)構(gòu)體變量的初始化。

#include<stdio.h> voidmain() {

structstudent { charname[20]; charsex;

intage; }a={"LiLin",'M',23};

printf("name:%s\n

sex:%c\n

age:%d\n",,a.sex,a.gae); } 11.5結(jié)構(gòu)體數(shù)組定義結(jié)構(gòu)體數(shù)組 只要說明該結(jié)構(gòu)體變量為數(shù)組類型,則每個數(shù)組元素都是一個結(jié)構(gòu)體類型數(shù)據(jù)。 例如:

structstudent { charname[20]; charsex;

intage; };/*stu[3]*/

structstudentstu[3];11.5結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組的初始化一般形式:

在定義數(shù)組的后面加上:={初值表列};定義數(shù)組時,元素個數(shù)可以不指定,編譯時系統(tǒng)會根據(jù)給出初值的結(jié)構(gòu)體常量的個數(shù)來確定數(shù)組元素的個數(shù)。structstudent{charname[20];charsex;

intage;}stu[3]={{"LiLin",'M',23},{"Wangnan",'F',21},{"LiuLi",'F',22}};11.5結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組應(yīng)用舉例 例11.2:對候選人得票的統(tǒng)計程序。設(shè)有3個候選人,每次輸入一個得票的候選人的名字,要求最后輸出各人得票結(jié)果。(P287)structperson{charname[20];

intcount;}leader[3]={"Li",0,"Zhang",0,"Fun",0};11.5結(jié)構(gòu)體數(shù)組voidmain(){

inti,j;charleader_name[20];

for(i=1;i<=10;i++){

scanf("%s",leader_name);

for(j=0;j<3;j++)

if(!strcmp(leader_name,leader[j].name))leader[j].count++;}

printf("\n");

for(i=0;i<3;i++)

printf("%s:%d\n",leader[i].name,leader[i].count);}11.6指向結(jié)構(gòu)體類型數(shù)據(jù)的指針指向結(jié)構(gòu)體變量的指針一個結(jié)構(gòu)體變量的指針就是該變量所占據(jù)的內(nèi)存段的起始地址。 例11.3:指向結(jié)構(gòu)體變量的指針的應(yīng)用。(P289)

structstudentstu_1;

structstudent*p=&stu_1;

printf("%f",(*p).score);指向運(yùn)算符"->"

printf("%f",p->score);引用結(jié)構(gòu)體成員的三種方法結(jié)構(gòu)體變量名.成員名(*指針變量名).成員名指針變量名->成員名11.6指向結(jié)構(gòu)體類型數(shù)據(jù)的指針指向結(jié)構(gòu)體數(shù)組的指針例11.4:指向結(jié)構(gòu)體數(shù)組的指針的應(yīng)用。(P290)…structstudentstu[3]={{101,"Li",'M',18},{102,"Liu",'M',19},{103,"Wu",'F',20}};voidmain(){

structstudent*p

for(p=stu;p<stu+3;p++)printf("%5d%-20s%2c%4d\n",p->num,p->name,p->sex,p->age);}11.6指向結(jié)構(gòu)體類型數(shù)據(jù)的指針20FWu10319MLiu10218MLi101stu[0]stu[1]stu[2]p11.7用指針處理鏈表用指向結(jié)構(gòu)體的指針作函數(shù)的參數(shù)將一個結(jié)構(gòu)體變量的值傳遞給另一個函數(shù)的方法有三種:用結(jié)構(gòu)體變量的成員作參數(shù),同普通變量。用結(jié)構(gòu)體變量作實參,形參也必須是同類型的結(jié)構(gòu)體變量,順序傳遞全部內(nèi)容。用指向結(jié)構(gòu)體變量(或數(shù)組)的指針作實參,傳遞結(jié)構(gòu)體變量(或數(shù)組)的地址給形參。例11.5例11.611.7用指針處理鏈表鏈表的基本概念鏈表是一種常見的重要的數(shù)據(jù)結(jié)構(gòu),它動態(tài)地進(jìn)行存儲分配。存儲特點(diǎn):用一組任意的存儲單元存儲一組數(shù)據(jù)元素。(這組存儲單元可以是連續(xù)的,也可以是不連續(xù)的。)結(jié)點(diǎn):鏈表中的每一個元素稱為"結(jié)點(diǎn)",包括兩個域:數(shù)據(jù)域:存儲數(shù)據(jù)元素。指針域:存儲下一結(jié)點(diǎn)的地址。(直接后繼存儲位置。)頭指針:指示鏈表中第一個結(jié)點(diǎn)的存儲位置。鏈表中最后一個元素的指針域為"空"(NULL)。一個指針類型的成員既可以指向基他類型的結(jié)構(gòu)體數(shù)據(jù),也可以指向自己所在的結(jié)構(gòu)體類型的數(shù)據(jù)。

1249headA13561249B14751356C10211475DNULL102111.7用指針處理鏈表簡單鏈表 例11.7:建立一個簡單鏈表,它由3個學(xué)生數(shù)據(jù)的結(jié)點(diǎn)組成。輸出各結(jié)點(diǎn)中的數(shù)據(jù)。

#include<stdio.h> #defineNULL0

structstudent { longnum; floatscore;

structstudent*next; };11.7用指針處理鏈表voidmain(){

structstudenta,b,c,*head,*p;a.num=10101;a.score=89.5;b.num=10103;b.score=90;c.num=10107;c.score=85;head=&a;

a.next=&b;

b.next=&c;

c.next=NULL;p=head;

while(p!=NULL){

printf("%ld%5.1f\n",p->num,p->score);p=p->next;}}11.7用指針處理鏈表處理動態(tài)鏈表所需的函數(shù)malloc函數(shù)函數(shù)原型:void*malloc(unsigned

intsize);功能:在內(nèi)存的動態(tài)存儲區(qū)中分配一個長度為size的連續(xù)空間。函數(shù)返回值:是一個指向分配域起始地址的指針(類型為void)。若函數(shù)執(zhí)行失敗,則返回NULL。calloc函數(shù)函數(shù)原型:

void*calloc(unsigned

intn,unsignedintsize);功能:在內(nèi)存的動態(tài)存儲區(qū)中分配n個長度為size的連續(xù)空間。為一維數(shù)組分配動態(tài)存儲空間。free函數(shù)函數(shù)原型:voidfree(void*p);功能:釋放由p指向的內(nèi)存區(qū),使這部分內(nèi)存區(qū)能被其他變量使用。11.7用指針處理鏈表建立動態(tài)鏈表建立動態(tài)鏈表:指在程序執(zhí)行過程中從無到有建立起一個鏈表。包括:開辟結(jié)點(diǎn),輸入結(jié)點(diǎn)數(shù)據(jù),勾鏈。 例11.8:寫一函數(shù)建立一個有3名學(xué)生數(shù)據(jù)的單向動態(tài)鏈表。P29711.7用指針處理鏈表輸出鏈表思路:已知鏈表第一個結(jié)點(diǎn)地址(head)。設(shè)指針變量p,先指向第一個結(jié)點(diǎn),輸出所指結(jié)點(diǎn)。使p后移一個結(jié)點(diǎn),再輸出,直到鏈表尾。 例11.9:編寫一個輸出鏈表的函數(shù)print。P300

對鏈表的刪除操作ABCDEABCDE11.7用指針處理鏈表 例11.10:寫一函數(shù)以刪除動態(tài)鏈表中指定的結(jié)點(diǎn)。(P301)思路:鏈表為空。鏈表不為空。查找要刪除結(jié)點(diǎn)。要刪的是第一個結(jié)點(diǎn)。要刪的不是第一個結(jié)點(diǎn)。脫鏈。對鏈表的插入操作對鏈表的插入是指將一個結(jié)點(diǎn)插入到一個已有的鏈表中。問題:怎樣找到插入的位置;怎樣實現(xiàn)不同位置的插入。插入過程:P304圖11-22

例11.11插入結(jié)點(diǎn)的函數(shù)insert11.7用指針處理鏈表對鏈表的綜合操作將對鏈表進(jìn)行建立、輸出、刪除、插入的函數(shù)組織在一個C程序中。只刪除一個結(jié)點(diǎn),插入一個結(jié)點(diǎn)。(P306)刪除多個結(jié)點(diǎn),插入多個結(jié)點(diǎn)。(P307)11.8共用體共用體的概念使幾個不同類型的變量共占同一段內(nèi)存的結(jié)構(gòu)稱"共用體"類型的結(jié)構(gòu)。定義形式

union共用體名

{

成員表列

}變量表列; 例如:

uniondata {

inti; chach; floatf; }; uniondataa,b,c;共用體變量的引用方式 只能引用共用體變量的成員,不能引用共用體變量。f

chi100011.8共用體共用體類型數(shù)據(jù)的特點(diǎn)某一瞬間只有一個成員起作用。起作用的是最后一次存放的成員。共用體變量的地址及各成員的地址為同一地址。不能對共用體變量名賦值。如:a=1;不能企圖引用變量名來得到一個值。如:m=a;不能在定義時賦初值。如:共用體變量不能作函數(shù)的參數(shù),不能使函數(shù)帶回共用體變量,但可以使用指向共用體變量的指針。共用體類型可出現(xiàn)在結(jié)構(gòu)體類型定義中,也可以定義共用體數(shù)組。反之,結(jié)構(gòu)體也可以出現(xiàn)在共用體類型定義中,數(shù)組也可以作為共用體的成員。例11.12:(P311)union{

inti;chach;floatf;}a={1,'a',1.5};a.i=1;a.c='a';a.f=1.5;11.9枚舉類型枚舉枚舉指將變量的值一一列舉出來,變量的值只限于列舉出來的值的范圍內(nèi)。如果一個變量只有幾種可能的值,可以定義為枚舉類型。枚舉類型的聲明

enum

變量名{value1,value2,…};

例如:

enum

weekday{sun,mon,tue,wed,thu,fri,sat};

聲明變量:

enumweekdayworkday,week-end;

或者:

enum

weekday{sun,mon,tue,wed,thu,fri,sat}workday,week-end;11.9枚舉類型說明在C編譯中,對枚舉元素按常量處理,稱為枚舉常量。不能對其賦值,如:sun=0;mon=1;枚舉元素作為常量,C語言編譯按定義時的順序使它們的值為0,1,2…。例如:

enumweekdayworkday;workday=mon;

printf("%d",workday);

/*輸出1*/

也可以在定義時改變枚舉元素的值,例如:enum

weekday{sun=7,mon=1,tue,wed,thu,fri,sat}workday,week_end;枚舉值可用來作判斷比較。例如:

if(workday==mon)…一個整數(shù)不能直接賦給一個枚舉變量。例如:

workday=2; //error workday=(enumweekday)2;

相當(dāng)于:wrokday

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論