2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩42頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第十一章 結(jié)構(gòu)體 11.1 概述 在實(shí)際應(yīng)用中,有不少應(yīng)用問題如果只采用已學(xué)的變量和數(shù)組作為數(shù)據(jù)結(jié)構(gòu)顯得很不方便。 例:輸入100個學(xué)生的學(xué)號、姓名和考試成績,編寫程序找出高分者和低分者。 用變量和數(shù)組作數(shù)據(jù)結(jié)構(gòu)可編寫程序如下:,main(){ int i, num, maxnum, minnum; char name[20], maxname[20], minname[20];

2、 int score, maxscore, minscore; maxscore=0; minscore=100; for(i=1; imaxscore) { maxscore=score; maxnum=num; strcpy(maxname,name); } if(score<minscore) {minscore=score; minnum=num; strcp

3、y(minname,name);} } 輸出},明顯缺點(diǎn): ①變量過多,同一學(xué)生的各個數(shù)據(jù)無聯(lián)系,沒有整體概念,不便管理。 ②操作不便(如更新過程)。 顯然,選用一種能把一個學(xué)生的數(shù)據(jù)構(gòu)造成一個整體的構(gòu)造型數(shù)據(jù)結(jié)構(gòu)更合適,但不能是數(shù)組。 對于這種情況,可以將一個學(xué)生的數(shù)據(jù)定義為一個結(jié)構(gòu)體類型:,struct student 類型名{

4、 int num; 成員表 char name[20]; int score;}; 定義了一個結(jié)構(gòu)體類型,它包含三個成員。,11.2 定義結(jié)構(gòu)體類型變量的方法 前面定義的結(jié)構(gòu)體類型只是一種“模型”,還必須定義結(jié)構(gòu)體變量后才能存放數(shù)據(jù)。 定義結(jié)構(gòu)體變量有三種方法:,,,,,1、先定義結(jié)構(gòu)體類型再定義結(jié)構(gòu)體變

5、量 先定義結(jié)構(gòu)體類型,后定義結(jié)構(gòu)體變量:struct student 類型名{ int num; 成員表 char name[20]; int score;}; struct student st, stmax, stmin; 類型符 變量名

6、 定義了三個結(jié)構(gòu)體變量,每個變量包含三個成員,每個變量可存放一個學(xué)生的數(shù)據(jù)。,,,2、在定義結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體變量 struct student { int num; char name[20]; int score; }st, stmax, stmin;,,3、直接定義結(jié)構(gòu)體類型變量 struct

7、 不出現(xiàn)類型名 { int num; char name[20]; int score; }st, stmax, stmin; 常用第一種方法,說明:①類型與變量的區(qū)別: 只對變量分配空間與操作。②對成員可以單獨(dú)使用,相當(dāng)于普通變量。 ③成員也可以是一個結(jié)構(gòu)體變量。 struct date struct student {

8、 int month; { int num; int day; char name[20]; int year; struct date birthday; }; }st1, st2;④成員名可以與程序中的變量名相同,兩者代表不同的對象

9、。,11.3 結(jié)構(gòu)體變量的引用 ■成員引用 可以對成員單獨(dú)引用,形式為: 結(jié)構(gòu)體變量名 . 成員名 成員運(yùn)算符st.num=1001;st.score=90;strcpy(st.name,”Li”);scanf (“%d%s%d”,&st.num,st.name,&st.score);printf(“%d%s%d”,st.

10、num,st.name,st.score) ; 可以引用成員的地址,,如果成員本身又屬一個結(jié)構(gòu)體類型,則要用若干個成員運(yùn)算符,一級一級地找到最低一級的成員,只能對最低級的成員進(jìn)行存取與運(yùn)算。 st1.birthday.year=1960; st1.birthday.month=5; st1.birthday.day=15;,■整體引用 可以對結(jié)構(gòu)體變量進(jìn)行整體賦值: stmax=st;

11、將st中的所有內(nèi)容賦值給stmax。 對結(jié)構(gòu)體變量的整體操作只限于賦值操作和參數(shù)傳遞,而且要求類型一致。不能對結(jié)構(gòu)體變量進(jìn)行整體輸入輸出。,結(jié)構(gòu)體應(yīng)用舉例: 編寫程序輸入100個學(xué)生的學(xué)號、姓名和考試成績,找出高分者和低分者。 struct student { int num; char name[20]; int score; };,main()

12、 { int i; struct student st,stmax,stmin; stmax.score=0; stmin.score=100; for(i=1;istmax.score) stmax=st; if(st.score<stmin.score) stmin=st; } printf(“\n%5d%15s%5d”,stmax.num,stma

13、x.name, stmax.score); printf(“\n%5d%15s%5d”,stmin.num,stmin.name, stmin.score); }例T11-1.c,11.4 結(jié)構(gòu)體變量的初始化 對

14、結(jié)構(gòu)體變量可以在定義時指定初始值 struct student { int num; char name[20]; int score; }st={1001,”wang”,95};,11.5 結(jié)構(gòu)體數(shù)組 可以定義結(jié)構(gòu)體數(shù)組來存放批量數(shù)據(jù)。 ■結(jié)構(gòu)體數(shù)組的定義 struct student { int

15、 num; char name[20]; int score; };struct student a[100]; 定義a數(shù)組,可以存放100個學(xué)生的數(shù)據(jù)。 a數(shù)組的每個元素又是一個結(jié)構(gòu)體變量。,■結(jié)構(gòu)體數(shù)組的初始化 在定義結(jié)構(gòu)體數(shù)組的同時指定初值。 struct student { int num; char name[20];

16、 int score; }; struct student a[2]= {{1001,”LiLi”,85},{1002,”wang”,90}};,或: struct student { int num; char name[20]; int score; } a[2]= {{1001,”LiL

17、i”,85},{1002,”wang”,90}};,■結(jié)構(gòu)體數(shù)組元素的引用 成員引用: a[0].num=1001; strcpy(a[0].name,”wang”); a[0].score=85; 整體引用: a[1]=a[0]; 與普通數(shù)組元素的引用相同,■結(jié)構(gòu)體數(shù)組的應(yīng)用 輸入100個學(xué)生的學(xué)號、姓名和考試成績,然后按從高分到低分的順序排列后輸出。,struct student

18、 { int num; char name[20]; int score; };main(){ int i, j; struct student a[100], t; for(i=0;i<100;i++) scanf(“%d%s%d”,&a[i].num, a[i].name,

19、 &a[i].score);,for(i=0;i<99;i++) for(j=i+1; j<100; j++) if(a[i].score<a[j].score) {t=a[i]; a[i]=a[j]; a[j]=t;} 整體引用 for(i=0;i<100;i++) printf((“\n%5d%15s%5d”,a[i]

20、.num, a[i].name,a[i].score); }例T11-2.c,例:(p266例11.2) 對候選人得票的統(tǒng)計程序。設(shè)有三個候選人,每次輸入一個得票候選人的名字,要求最后輸出各候選人的得票結(jié)果。#include “string.h”struct person{ char name[20]; int count; }

21、leader[3]={“Li”,0,”zhang”,0,”wang”,0};,main(){ int i, j ; char leader_name[20]; for(i=1;i<=100;i++) { scanf(“%s”,leader_name); for(j=0;j<3;j++) if(strcmp(leader_name,leader[

22、j].name)==0) leader[j].count++; } printf(“\n”); for(i=0;i<3;i++) printf(“\n%15s%5d”, leader[i].name,leader[i].count); }例T11-3.c,11.6 指向結(jié)構(gòu)體類型數(shù)據(jù)的指針 ■指向結(jié)構(gòu)體類型變量的

23、指針 struct student st, st1; struct student *p; p=&st;,定義指向結(jié)構(gòu)體類型數(shù)據(jù)的指針變量p,,通過指針變量引用結(jié)構(gòu)體變量: p=&st; ①成員引用(*p).num=1001; 或 p->num=1001;(*p).score=85; 或 p->score=8

24、5;strcpy((*p).name,”wang”); 或 strcpy(p->name,”wang”); ②整體引用 st1=*p; 等效于 st1=st;,■指向結(jié)構(gòu)體數(shù)組的指針 struct student a[100]; struct student *p; p=a; 通過指針變量引用結(jié)構(gòu)

25、體數(shù)組元素: ①成員引用 (*p).num=1001; 或 p->num=1001; (*p).score=85; 或 p->score=85; strcpy((*p).name,”wang”); 或strcpy(p->name,”wang”);,對于第i個結(jié)構(gòu)體元素:(*(p+i)).num=1001; 或 (p+i)->num=1001;(*

26、(p+i)).score=85; 或 (p+i)->score=85;strcpy((*(p+i)).name,”wang”); 或 strcpy((p+i)->name,”wang”);也可以用下標(biāo)法:p[i].num=1001; ②整體引用*(p+1)=*(p+0); 或 p[1]=p[0];,■用結(jié)構(gòu)體變量和指向結(jié)構(gòu)體的指針作函數(shù)參數(shù) 用結(jié)構(gòu)體變量作函數(shù)參數(shù)時,對應(yīng)的實(shí)參

27、應(yīng)該是同類型的結(jié)構(gòu)體變量(或數(shù)組元素),參數(shù)傳遞是“值傳遞”。 用指向結(jié)構(gòu)體的指針作函數(shù)參數(shù)時,對應(yīng)的實(shí)參應(yīng)該是同類型的結(jié)構(gòu)體變量的地址(或數(shù)組的地址),參數(shù)傳遞是“地址傳遞”。,main(){ struct student st={1001,”LiLi”,70}; f(st); printf(“\n %5d%10s%5d”, st.num,st.name,st.score);

28、}void f(struct student a){ a.score=90; printf(“\n %5d%10s%5d”, a.num,a.name,a.score);}例T11-4-1.c,1001LiLi70,st,1001LiLi70,a,,90,main(){ struct student st={1001,”LiLi”,70}; f(&st); pr

29、intf(“\n %5d%10s%5d”,st.num,st.name,st.score);} f(struct student *a){ a->score=90; printf(“\n%5d%10s%5d”,a->num,a->name,a>score);}通過指針變量a可以訪問它所指向的結(jié)構(gòu)體。例T11-4-2.c,1001LiLi70,,,st,2000,2000,a,,90,11.7

30、 用指針處理鏈表 ■鏈表概述 鏈表是一種重要的數(shù)據(jù)結(jié)構(gòu)─動態(tài)數(shù)據(jù)結(jié)構(gòu)。 以具體例子來說明鏈表的概念及其應(yīng)用:例:選擇合適的數(shù)據(jù)結(jié)構(gòu)來存放一批學(xué)生的學(xué)號及考試成績,以便進(jìn)一步處理。 由于學(xué)生人數(shù)未知,用靜態(tài)數(shù)據(jù)結(jié)構(gòu)不合適。用鏈表處理較恰當(dāng)。,用鏈表處理該問題的基本思路: 將各學(xué)生的數(shù)據(jù)進(jìn)行離散存放,來一個學(xué)生就分配一小塊內(nèi)存(結(jié)點(diǎn))。并將各結(jié)點(diǎn)用指針依次連接起來─鏈表。 每結(jié)點(diǎn)應(yīng)包含下一結(jié)點(diǎn)的開始地

31、址。 最后一個結(jié)點(diǎn)中的指針為空。 鏈頭指針指向第一個結(jié)點(diǎn),是訪問鏈表的重要依據(jù)。 這樣的鏈表稱單向鏈表。,head,學(xué)號成績指針,學(xué)號成績指針,學(xué)號成績指針,學(xué)號成績指針,學(xué)號成績NULL,,,,,,,,,,,,,,,一個結(jié)點(diǎn)可用如下結(jié)構(gòu)體描述:typedef struct student { int num; 學(xué)號 int score;

32、 成績 struct student *next; 下一結(jié)點(diǎn)的首地址} STU; typedef : 自定義類型符(見P316),■單向鏈表的建立 ①輸入一個學(xué)生的數(shù)據(jù)。 ②分配結(jié)點(diǎn)空間,數(shù)據(jù)存入。 ③將該結(jié)點(diǎn)的首地址賦給上一結(jié)點(diǎn)的next,若該結(jié)點(diǎn)是第一個結(jié)點(diǎn),則賦給頭指針。 ④將該結(jié)點(diǎn)的next置為空,表示該結(jié)點(diǎn)為當(dāng)前的最后結(jié)點(diǎn)。,head,學(xué)號成績next,學(xué)號成績n

33、ext,學(xué)號成績next,學(xué)號成績next,學(xué)號成績NULL,,,,,,,,,,,,,,STU *creat(){ STU st,*p0=NULL,*p,*head=NULL; while(1) { scanf("%d%d",&st.num,&st.score); if(st.num<0) break;

34、學(xué)號小于0終止 p=malloc(sizeof(STU)); *p=st; (*p).next=NULL; if(p0==NULL) head=p; p是該鏈表的第一個結(jié)點(diǎn) else (*p0).next=p; p0=p; } return head; },head,學(xué)號

35、成績next,學(xué)號成績next,學(xué)號成績NULL,,,,,,,,,,■單向鏈表的訪問 以輸出為例 ①通過頭指針找到第一個結(jié)點(diǎn). ②輸出當(dāng)前結(jié)點(diǎn)的內(nèi)容,并通過next找到后繼結(jié)點(diǎn),┄┄,直到next為空.,void output(STU *head){ STU *p=head; while(p) { printf("\n %d %d",(*p).num

36、,(*p).score); p=(*p).next; }},head,學(xué)號成績next,學(xué)號成績next,學(xué)號成績NULL,學(xué)號成績next,,,,,,,,,,,■刪除結(jié)點(diǎn)操作 ①按鏈表的訪問方法找到相應(yīng)結(jié)點(diǎn)。 ②若該結(jié)點(diǎn)是第一個結(jié)點(diǎn),則將后繼結(jié)點(diǎn)指針賦給頭指針。 若該結(jié)點(diǎn)是最后一個結(jié)點(diǎn),則將前綴結(jié)點(diǎn)的next置為空。 若該結(jié)點(diǎn)是中間結(jié)點(diǎn),則將后繼結(jié)點(diǎn)指針賦給前綴結(jié)點(diǎn)的ne

37、xt。 ③釋放該結(jié)點(diǎn)所占的內(nèi)存單元。,head,學(xué)號成績next,學(xué)號成績next,學(xué)號成績NULL,,,,,,,,STU *delete(STU *head,int number){ STU *p =head,*p0=NULL; while(p) { if((*p).num==number) { if(p==head) head=(*p).next;

38、 else if((*p).next==NULL) (*p0).next=NULL; else (*p0).next=(*p).next; free(p); break; } else {p0=p; p=(*p).next;} } return head;},假定要刪除某一指定學(xué)號的結(jié)點(diǎn),■插入操作 假定將結(jié)點(diǎn)p 插入到結(jié)點(diǎn)p0的后面

39、, 則插入操作的關(guān)鍵為: p->next=p0->next; p0->next=p;,head,學(xué)號成績next,學(xué)號成績next,學(xué)號成績next,學(xué)號成績NULL,,,,,,,,,,,,,STU *insert(STU *head,STU *stud){STU *p0,*p1,*p2;p1=head;p0=stud; //p1指向第一個結(jié)點(diǎn), p0指向要插入的結(jié)點(diǎn)if(hea

40、d==NULL)//原來是空表{ head=p0;p0->next=NULL; } // p0作為第一個結(jié)點(diǎn)else{ while((p0->num > p1->num)&&(p1->next != NULL)) { p2=p1; p1=p1->next;} //尋找插入位置 if(p0->numnum)

41、 //p0插入p1之前 { if(head==p1) head=p0; //p1就是之前的headelse p2->next=p0; //p0要插入p2之后,p1之前p0->next=p1;} else // p1在鏈表的最后 , p0插入p1之后 { p1->next=p0; p0->next=NUL

42、L;}}return head;},void main() 例T11-5.c{STU *stud_head,*student;int number,score,i;stud_head=creat(); //創(chuàng)建鏈表output(stud_head); //輸出鏈表for(i=0;inum=number;student->score=score;stud_head=

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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

提交評論