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

下載本文檔

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

文檔簡介

1、2021-10-279.1 9.1 結(jié)構(gòu)體概念結(jié)構(gòu)體概念9.2 9.2 結(jié)構(gòu)數(shù)組結(jié)構(gòu)數(shù)組9.3 9.3 結(jié)構(gòu)體指針結(jié)構(gòu)體指針* *9.4 9.4 單向單向鏈表鏈表如何定義結(jié)構(gòu)體類型如何定義結(jié)構(gòu)體類型理解結(jié)構(gòu)體與數(shù)組、指針理解結(jié)構(gòu)體與數(shù)組、指針和函數(shù)間的關(guān)系和函數(shù)間的關(guān)系結(jié)構(gòu)體在程序中的結(jié)構(gòu)體在程序中的應(yīng)用應(yīng)用2021-10-27關(guān)鍵字關(guān)鍵字合法標示符合法標示符struct student int number; char name10; char sex; int age; char address50; float score3; ; 成員成員把把不同類型不同類型的數(shù)據(jù)的數(shù)據(jù)組合成一個整體組

2、合成一個整體以分號結(jié)尾以分號結(jié)尾結(jié)構(gòu)體是一種構(gòu)造的(自定義)數(shù)據(jù)類型struct student stu1,stu2; /定義結(jié)構(gòu)變量定義結(jié)構(gòu)變量2021-10-27struct student int number; char name10; char sex; int age; char address50; float score3; ; struct date int year; int month; int day;struct date birth;成員的類型可以是成員的類型可以是基本基本類型類型也可以是也可以是構(gòu)造類型構(gòu)造類型2021-10-27struct student in

3、t number; char name10; char sex; int age; char address50; float score3; ; struct student stu1,stu2; 定義了結(jié)構(gòu)變量,才會定義了結(jié)構(gòu)變量,才會為該變量為該變量分配內(nèi)存。分配內(nèi)存。結(jié)構(gòu)類型結(jié)構(gòu)類型定義僅描述了結(jié)構(gòu)定義僅描述了結(jié)構(gòu)的組織形式的組織形式, 并不分配內(nèi)存并不分配內(nèi)存address變量變量stu1的內(nèi)存分配的內(nèi)存分配情況:情況:22ff1f22ff10 numberage22ff14score22ff55namesex22ff1e22ff23nameaddressscorestruct da

4、te birth;2021-10-27struct student int number; char name10; char sex; int age; char address50; float score3; ; struct student stu1; struct student int number; char name10; char sex; int age; char address50; float score3; stu1; struct int number; char name10; char sex; int age; char address50; float s

5、core3; stu1; 結(jié)構(gòu)定義的同時定義變量省略結(jié)構(gòu)名稱先定義結(jié)構(gòu),再定義變量無名結(jié)構(gòu)體2021-10-27struct student2 char name10; int age; float score5,ave; zhang=zhangsan, 20,78,92,83,75,69; 變量變量zhang的的內(nèi)存分配內(nèi)存分配情況:情況:20*ageave7892837569namescorezhangsan在屏幕上輸出該變量所有成員的值在屏幕上輸出該變量所有成員的值printf(“”, zhang);printf(“%sn”, );printf(“%dn”, zhan

6、g.age);for(i=0;i5;i+) printf(“%.1fn”, zhang.scorei);printf(“%.2fn”, zhang.ave);2021-10-27struct student2 char name10; int age; float score5,ave; li,zhang=zhangsan, 20,78,92,83,75,69;結(jié)構(gòu)變量可以結(jié)構(gòu)變量可以作為一個整體作為一個整體賦值給賦值給同類型同類型的結(jié)構(gòu)變量,的結(jié)構(gòu)變量,即把它各成員的值分別賦值即把它各成員的值分別賦值給同類型變量的相應(yīng)成員。給同類型變量的相應(yīng)成員。li=zhang;li=lisi, 21,8

7、0,75,89,65,82;問:以上兩種賦值語句正確嗎?問:以上兩種賦值語句正確嗎?必須逐個數(shù)據(jù)賦值給相應(yīng)的成員struct student li=“l(fā)isi”,20,80,75,89,65,82; 2021-10-278stu1=101,“Wan Lin”,M,19,87.5,“DaLian”; printf(“%d,%s,%c,%d,%f,%sn”,stu1);if(stu1=stu2) struct student int num; char name20; char sex; int age; float score; char addr30;stu1, stu2; 結(jié)構(gòu)變量的整體引用

8、,結(jié)構(gòu)變量的整體引用,只能用于只能用于同類型同類型的的結(jié)構(gòu)變量相互賦值。結(jié)構(gòu)變量相互賦值。2021-10-27引用方式引用方式 結(jié)構(gòu)結(jié)構(gòu)變量名變量名. 成員成員名名stu1.num = 10;stu1.score = 85.5;stu1.score += stu2.score;stu1.age +;struct student int num; char name20; char sex; int age; float score; char addr30;stu1, stu2; 成員引用符成員引用符成員運算符“.”的優(yōu)先級為最高??梢园选敖Y(jié)構(gòu)變量名.成員名”作為一個整體看待。其性質(zhì)等同于:同

9、類型的普通變量2021-10-27嵌套結(jié)構(gòu)中的成員引用嵌套結(jié)構(gòu)中的成員引用 通過通過成員運算符成員運算符 “.” 逐級引用逐級引用,直到找到最低一級成員,直到找到最低一級成員。struct date int year,month,day; ;struct student4 char number8; char name10; struct date bir, rx; / bir、rx為為data類型類型li;li.bir.year=1998; / 表示表示li的出生年份為的出生年份為1998年年 li.rx.year=2016; / 表示表示li的入學(xué)年份為的入學(xué)年份為2016年年 2021-

10、10-27#include main() struct a1 char c4,*s; s1=abc, def; struct a2 char *cp; struct a1 ss1; s2=ghi, jkl, mno; printf(%c,%cn, s1.c0, *s1.s); printf(%s,%sn, s1.c, s1.s); printf(%s,%sn, s2.cp, s2.ss1.s); printf(%s,%sn, +s2.cp, +s2.ss1.s);寫出程序運行結(jié)果2021-10-27void main() struct comp s1,s2; double compare (s

11、truct comp, struct comp);/? scanf(%lf%lf%lf%lf,&s1.x, &s1.y,&s2.x, &s2.y); if (compare(s1,s2)=0) / 結(jié)構(gòu)變量作為實參調(diào)用函數(shù)結(jié)構(gòu)變量作為實參調(diào)用函數(shù) printf(Equaln); else printf(Unequaln);double compare(struct comp a ,struct comp b)/函數(shù)定義函數(shù)定義 a.m=sqrt(a.x*a.x+a.y*a.y); b.m=sqrt(b.x*b.x+b.y*b.y); return (a.m-b.

12、m); / 返回返回0表示相等;非表示相等;非0表示不相等表示不相等傳遞數(shù)值傳遞數(shù)值a=s1;b=s2;struct comp double x,y; double m; ;2021-10-27? add( ?) ?例:求兩個復(fù)數(shù)的和例:求兩個復(fù)數(shù)的和void main() struct comp s1,s2,z; struct comp add(struct comp, struct comp); /函數(shù)聲明函數(shù)聲明 scanf(%lf%lf%lf%lf,&s1.x, &s1.y,&s2.x, &s2.y); z=add(s1,s2); / 調(diào)用函數(shù)求復(fù)數(shù)調(diào)用

13、函數(shù)求復(fù)數(shù)s1、s2之和之和 printf(%.2f%+.2fin,z.x,z.y);struct comp add(struct comp a ,struct comp b) struct comp c; c.x=a.x+b.x; c.y=a.y+b.y; return c ; 2021-10-27void fun( int *a, int n) int i; for(i=0; in-1; i+) ai+=i; void main() int i; struct st s=10,2,3,1,6,8,7,5,4,10,9; fun(s.a, s.n); for(i=0; inum=12注意:成

14、員運算符“.”優(yōu)先于間接引用間接引用運算符運算符“*”若寫成*結(jié)構(gòu)指針名結(jié)構(gòu)指針名.成員名成員名,則等價于*(結(jié)構(gòu)指針名結(jié)構(gòu)指針名.成員名成員名)2021-10-27struct s int a; float b; char *c;main() struct s x=19, 83.5, zhang; struct s *px=&x; printf(%d,%.1f,%sn, x.a, x.b, x.c); printf(%d,%.1f,%sn, px-a, (*px).b, px-c); printf(%c,%sn, *px-c, &px-c1); printf(%d,%dn,

15、px-a+, +px-a); printf(“%dn”, x.a);問題:閱讀程序,寫出結(jié)果問題:閱讀程序,寫出結(jié)果+(px-a)(px-a)+-的優(yōu)先級的優(yōu)先級高于高于+,所以所以+的運算的運算對象是對象是 px-a 在在C中為了直觀與使用方便,中為了直觀與使用方便, 通常通常用用 p-num 來代替來代替 (*p).num2021-10-27struct aa int a; int *p;void main() int x=1, y=2, z=3; struct aa s=4, &x, 5, &y, 6, &z; struct aa *q=s+1; printf(%

16、dn, *(q-p);A. 1 B. 2 C. 3 D. 42021-10-27#includestruct man char name20; int age; person3=Anna, 18, David, 25, Mary, 20;void main() struct man *p,*q; int old=0; q=p=person; for( ; (1) ; p+) if(old age) (2) ; old=p-age; printf(年齡最大的是年齡最大的是%s, 年齡是年齡是%dn, (3) );程序功能:現(xiàn)有程序功能:現(xiàn)有3 3人的姓名和年齡,人的姓名和年齡,輸出輸出3 3人中

17、最年長者的姓名和年齡人中最年長者的姓名和年齡。pname, q-age2021-10-27struct data int a, b, c; ;void func(struct data *parm) parm-a=18; parm-b=5; parm-c=parm-a*parm-b; printf(1: %d, %d, %dn,parm-a,parm-b,parm-c);main() struct data arg; arg.a=27; arg.b=3; arg.c=arg.a+arg.b; printf(“2: %d, %d, %dn, arg.a,arg.b,arg.c); func(&a

18、mp;arg); printf(“3: %d, %d, %dn, arg.a,arg.b,arg.c);arga :27b: 3c :30(main)a :18b: 5c :90(func) parm&arg傳遞結(jié)構(gòu)變量的地址傳遞結(jié)構(gòu)變量的地址2021-10-27例例:編寫:編寫復(fù)數(shù)的排序復(fù)數(shù)的排序函數(shù)函數(shù)( (按復(fù)數(shù)模排序)。按復(fù)數(shù)模排序)。void main() int i; struct comp a6; /定義結(jié)構(gòu)數(shù)組定義結(jié)構(gòu)數(shù)組 void sort(struct comp *, int); /聲明聲明sort函數(shù)函數(shù) for(i=0;i6;i+) scanf(“%lf%lf”

19、,&ai.x,&ai.y); /輸入實部虛部輸入實部虛部 ai.m=sqrt(ai.x*ai.x+ai.y*ai.y);/計算計算復(fù)數(shù)模復(fù)數(shù)模 sort(a,N); / 調(diào)用排序函數(shù)調(diào)用排序函數(shù) for(i=0;iN;i+) printf(%.1f%+.1fi,ai.x,ai.y); void sort(struct comp *pa, int n) int i,j,k; struct comp temp; for(i=0;in-1;i+) k=i; for(j=i+1;jm(pa+j)-m) / pa+k為指向為指向pak的指的指針針 k=j; temp=*(pa+i); *

20、(pa+i)=*(pa+k); *(pa+k)=temp; struct comp double x,y; double m; ;2021-10-27鏈表的鏈表的概念概念:若干個數(shù)據(jù)組若干個數(shù)據(jù)組(節(jié)(節(jié)點點)按按一定的規(guī)則一定的規(guī)則連接起來連接起來?!具B接原則連接原則】前一個結(jié)點指向下一個結(jié)點,只有通前一個結(jié)點指向下一個結(jié)點,只有通過前一個結(jié)點才能找到下一個結(jié)點過前一個結(jié)點才能找到下一個結(jié)點0 x22a124head0 x22ff10 0 x22ff10數(shù)據(jù)數(shù)據(jù)A0 x22a124數(shù)據(jù)數(shù)據(jù)B0 x22a4f0數(shù)據(jù)數(shù)據(jù)C0 x22a4f00 x2f51a40 x2f51a4數(shù)據(jù)數(shù)據(jù)DNULL鏈

21、表中有一個鏈表中有一個頭指針頭指針變量變量(headhead),它,它僅僅存放存放一個一個地址地址,該該地址指向一地址指向一個個節(jié)節(jié)點點每個每個節(jié)節(jié)點點都應(yīng)包含兩部分:數(shù)據(jù)都應(yīng)包含兩部分:數(shù)據(jù)部分、指向下一結(jié)點的地址部分、指向下一結(jié)點的地址最后一最后一個個節(jié)節(jié)點點稱為表尾稱為表尾,地址部分地址部分為為NULLNULL(表示(表示空地址空地址)鏈表中各元素在內(nèi)存中可以鏈表中各元素在內(nèi)存中可以不連續(xù)不連續(xù)存放存放。2021-10-27鏈表鏈表元素元素定義的一般形式為定義的一般形式為:struct 結(jié)構(gòu)類型名結(jié)構(gòu)類型名 結(jié)構(gòu)結(jié)構(gòu)成員定義成員定義; struct 結(jié)構(gòu)結(jié)構(gòu)類型名類型名 *變量名;變量名

22、;0 x22a1240 x22ff10 0 x22ff10數(shù)據(jù)數(shù)據(jù)A0 x22a124數(shù)據(jù)數(shù)據(jù)B0 x22a4f0數(shù)據(jù)數(shù)據(jù)C0 x22a4f00 x2f51a40 x2f51a4數(shù)據(jù)數(shù)據(jù)DNULL數(shù)據(jù)部分數(shù)據(jù)部分指向指向下下一一節(jié)節(jié)點的點的指針指針2021-10-27設(shè)計設(shè)計一個鏈表,每一個節(jié)點可以存放一個鏈表,每一個節(jié)點可以存放學(xué)生姓名學(xué)生姓名及及成績成績,則其結(jié)構(gòu)數(shù)據(jù)類型如下:,則其結(jié)構(gòu)數(shù)據(jù)類型如下: struct student char name10; float score; struct student *next; ; 只是只是定義了一個數(shù)據(jù)類型定義了一個數(shù)據(jù)類型, ,并未實際分

23、配并未實際分配存儲空間存儲空間。 鏈表結(jié)構(gòu)是動態(tài)分配存儲的,即在使用時才開辟一個結(jié)點鏈表結(jié)構(gòu)是動態(tài)分配存儲的,即在使用時才開辟一個結(jié)點的的存儲單元存儲單元。2021-10-27mallocmalloc函數(shù):函數(shù):void * malloc(unsigned int size在內(nèi)存的動態(tài)存儲區(qū)中分配一個長度為在內(nèi)存的動態(tài)存儲區(qū)中分配一個長度為size的連續(xù)的連續(xù)空間,函數(shù)的返回值為分配到空間的起始地址空間,函數(shù)的返回值為分配到空間的起始地址。例例: char *x; / 此時此時x的指向不確定的指向不確定x=(char *)malloc(10); /x指向了包含指向了包含10個字符單元的存儲空間

24、個字符單元的存儲空間2021-10-27calloccalloc函數(shù):函數(shù):void * calloc(unsigned int num,unsigned int size)在內(nèi)存的動態(tài)存儲區(qū)中分配在內(nèi)存的動態(tài)存儲區(qū)中分配n個長度為個長度為size的連續(xù)空的連續(xù)空間,函數(shù)返回分配間,函數(shù)返回分配區(qū)區(qū)間的起始地址間的起始地址。例例: float *p; p = (float*)calloc(10,sizeof(float); /p指向了包含指向了包含10個個float類型類型單元的存儲空間單元的存儲空間2021-10-27freefree函數(shù):函數(shù):void free(void *p)釋放釋放p

25、所指向的內(nèi)存空間,使得系統(tǒng)可將該內(nèi)存區(qū)分所指向的內(nèi)存空間,使得系統(tǒng)可將該內(nèi)存區(qū)分配給其他變量使用配給其他變量使用。2021-10-27建立鏈表建立鏈表:從無到有:從無到有地建立起一個鏈表,即一個一個地建立起一個鏈表,即一個一個地輸入地輸入各各節(jié)節(jié)點點數(shù)據(jù),并建立起前后相鏈的關(guān)系。數(shù)據(jù),并建立起前后相鏈的關(guān)系。例:例:struct student char name10; float score; student *next; *head, *pnew, *ptail;1)建立建立頭節(jié)點頭節(jié)點head = (struct student*)malloc(sizeof(struct student

26、); pnew = head; scanf (“%s%d”, head-name, &head-score);數(shù)據(jù)數(shù)據(jù) ?headpnew2021-10-272)在在現(xiàn)有鏈表中添加現(xiàn)有鏈表中添加新新節(jié)點節(jié)點:pnew = (struct student*)malloc(sizeof(struct student);scanf (%s%f, pnew-name, &pnew-score);新數(shù)據(jù)新數(shù)據(jù) ?pnew3)與與上上一一節(jié)節(jié)點點鏈接:鏈接:ptail-next=pnew; ptail=pnew;數(shù)據(jù)數(shù)據(jù)數(shù)據(jù)數(shù)據(jù)數(shù)據(jù)數(shù)據(jù) ?headptail新數(shù)據(jù)新數(shù)據(jù) ?pnew數(shù)據(jù)數(shù)據(jù)

27、數(shù)據(jù)數(shù)據(jù)數(shù)據(jù)數(shù)據(jù)headptail新數(shù)據(jù)新數(shù)據(jù) ?4)將將末末節(jié)節(jié)點點指向下指向下一一節(jié)節(jié)點點的成員賦值為的成員賦值為NULL。ptail-next=NULL; NULL2021-10-27定義創(chuàng)建鏈表函數(shù)定義創(chuàng)建鏈表函數(shù)createcreate,建立一個有,建立一個有n n個節(jié)點的單向個節(jié)點的單向鏈表鏈表。struct student *create(int n) struct student *head,*pnew,*ptail; int i; pnew=(struct student *)malloc(sizeof(struct student); scanf(%s%f,pnew-nam

28、e,&pnew-score); head=ptail=pnew; / 建立頭節(jié)點建立頭節(jié)點 for(i=1;iname,&pnew-score); ptail-next=pnew; ptail=pnew; ptail-next=NULL; return head; /返回鏈表頭指針返回鏈表頭指針2021-10-27從從鏈表的頭指針出發(fā),訪問鏈表的每一鏈表的頭指針出發(fā),訪問鏈表的每一個個節(jié)點節(jié)點。數(shù)據(jù)數(shù)據(jù)數(shù)據(jù)數(shù)據(jù)數(shù)據(jù)數(shù)據(jù)head數(shù)據(jù)數(shù)據(jù) NULLp/定義定義遍歷鏈表函數(shù)遍歷鏈表函數(shù)printprint,輸出鏈表的,輸出鏈表的所有所有節(jié)點節(jié)點信息信息。void print(struct student *head) struct student *p

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論