《C語言程序設(shè)計(jì)》 課件10 結(jié)構(gòu)體_第1頁(yè)
《C語言程序設(shè)計(jì)》 課件10 結(jié)構(gòu)體_第2頁(yè)
《C語言程序設(shè)計(jì)》 課件10 結(jié)構(gòu)體_第3頁(yè)
《C語言程序設(shè)計(jì)》 課件10 結(jié)構(gòu)體_第4頁(yè)
《C語言程序設(shè)計(jì)》 課件10 結(jié)構(gòu)體_第5頁(yè)
已閱讀5頁(yè),還剩62頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

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

2023翻轉(zhuǎn)課堂實(shí)用教程第10章

結(jié)構(gòu)體結(jié)構(gòu)體10.1結(jié)構(gòu)體數(shù)組10.2

結(jié)構(gòu)體指針10.3

鏈表10.410.1結(jié)構(gòu)體引入結(jié)構(gòu)體前面章節(jié)中學(xué)到的數(shù)組,用于存儲(chǔ)相同類型的數(shù)據(jù),如每位應(yīng)屆生的薪資。若保存每位應(yīng)屆生的個(gè)人信息,比如姓名、性別、年齡、畢業(yè)學(xué)校、畢業(yè)時(shí)間等,可以定義不同的變量,但體現(xiàn)不了他們同屬一個(gè)人的信息的內(nèi)在聯(lián)系。結(jié)構(gòu)體可用來存放一組不同類型的、具有內(nèi)在聯(lián)系的數(shù)據(jù)。姓名性別年齡畢業(yè)學(xué)校畢業(yè)時(shí)間123結(jié)構(gòu)體類型的定義結(jié)構(gòu)體變量的定義結(jié)構(gòu)體變量的初始化和使用知識(shí)點(diǎn)結(jié)構(gòu)體案例案例分析結(jié)構(gòu)體相關(guān)練習(xí)題練習(xí)題10.1.1結(jié)構(gòu)體知識(shí)點(diǎn)程序員自定義的構(gòu)造數(shù)據(jù)類型,“模板”,包含多個(gè)屬性,用變量來表示,每個(gè)變量稱為結(jié)構(gòu)體成員。struct,定義結(jié)構(gòu)體類型的關(guān)鍵字,不可省略1、結(jié)構(gòu)體類型的定義形式如下:struct結(jié)構(gòu)體名{

數(shù)據(jù)類型名

變量1;//又稱為結(jié)構(gòu)體成員1

數(shù)據(jù)類型名

變量2;//又稱為結(jié)構(gòu)體成員2…};//此處的分號(hào)不可以省略結(jié)構(gòu)體類型名為:struct結(jié)構(gòu)體名舉例1:定義一張桌子的結(jié)構(gòu)體類型,桌子包括長(zhǎng)、寬、高、價(jià)格、材質(zhì)這5個(gè)屬性。structdesk{ doublelength,width,height;//同類型的結(jié)構(gòu)體成員可用逗號(hào),隔開一起定義 doubleprice; charmaterial[6];//用字符串來保存材質(zhì),如木、鐵等。};代表著實(shí)際應(yīng)用中的桌子模板,5個(gè)結(jié)構(gòu)體成員,分別表示長(zhǎng)、寬、高、價(jià)格、材質(zhì)這5個(gè)屬性。1、結(jié)構(gòu)體類型的定義形式如下:10.1.1結(jié)構(gòu)體知識(shí)點(diǎn)舉例2:定義一個(gè)表示三維坐標(biāo)點(diǎn)的結(jié)構(gòu)體類型,坐標(biāo)點(diǎn)包含x,y,z三個(gè)坐標(biāo)值。structpoint{intx,y,z;};typedefstructpointPoint;//給structpoint起個(gè)短一些的別名Point雖然x,y,z都是整形,可以用數(shù)組來存儲(chǔ),但用結(jié)構(gòu)體來表示,更能體現(xiàn)x,y,z為同一個(gè)點(diǎn)的三個(gè)坐標(biāo),反應(yīng)三者的內(nèi)在聯(lián)系1、結(jié)構(gòu)體類型的定義形式如下:

10.1.1結(jié)構(gòu)體知識(shí)點(diǎn)舉例3:結(jié)構(gòu)體類型的嵌套定義structsize{ doublelength; doublewidth; doubleheight;};typedefstructsizeSize;//為structsize起的別名Size,后面用Size代替structsizestructdesk{ SizemySize;//成員變量也為一個(gè)結(jié)構(gòu)體類型 doubleprice; charmaterial[6];};1、結(jié)構(gòu)體類型的定義形式如下:10.1.1結(jié)構(gòu)體知識(shí)點(diǎn)10.1.1結(jié)構(gòu)體知識(shí)點(diǎn)2、結(jié)構(gòu)體變量的定義

:結(jié)構(gòu)體類型是一種構(gòu)造數(shù)據(jù)類型,定義好數(shù)據(jù)類型后,就可以定義該數(shù)據(jù)類型的變量了。三種結(jié)構(gòu)體變量的定義方式:(1)分開定義(2)同時(shí)定義(3)無類型定義

10.1.1結(jié)構(gòu)體知識(shí)點(diǎn)2、結(jié)構(gòu)體變量的定義

:(1)分開定義指先定義結(jié)構(gòu)體類型,再定義這種結(jié)構(gòu)體類型的變量,一般形式如下:struct結(jié)構(gòu)體名{ 數(shù)據(jù)類型名變量1;//又稱為結(jié)構(gòu)體成員1 數(shù)據(jù)類型名變量2;//又稱為結(jié)構(gòu)體成員2…};struct結(jié)構(gòu)體名結(jié)構(gòu)體變量名表;

10.1.1結(jié)構(gòu)體知識(shí)點(diǎn)2、結(jié)構(gòu)體變量的定義

:(1)分開定義例如:structdesk{doublelength,width,height;doubleprice;charmaterial[6];};

structdeskdesk1,desk2;

10.1.1結(jié)構(gòu)體知識(shí)點(diǎn)2、結(jié)構(gòu)體變量的定義

:(2)同時(shí)定義指在結(jié)構(gòu)體類型的定義最后定義變量,一般形式如下:struct結(jié)構(gòu)體名{ 數(shù)據(jù)類型名變量1;//又稱為結(jié)構(gòu)體成員1 數(shù)據(jù)類型名變量2;//又稱為結(jié)構(gòu)體成員2…}結(jié)構(gòu)體變量名表;//多個(gè)變量名之間用逗號(hào),隔開

10.1.1結(jié)構(gòu)體知識(shí)點(diǎn)2、結(jié)構(gòu)體變量的定義

:(2)同時(shí)定義例如:structdesk{doublelength,width,height;doubleprice;charmaterial[6];}desk1,desk2;

10.1.1結(jié)構(gòu)體知識(shí)點(diǎn)2、結(jié)構(gòu)體變量的定義

:(3)無類型定義是指采用同時(shí)定義的方式時(shí),省略結(jié)構(gòu)體類型名。struct{ 數(shù)據(jù)類型名變量1;//又稱為結(jié)構(gòu)體成員1 數(shù)據(jù)類型名變量2;//又稱為結(jié)構(gòu)體成員2…}結(jié)構(gòu)體變量名表;//多個(gè)變量名之間用逗號(hào),隔開

10.1.1結(jié)構(gòu)體知識(shí)點(diǎn)2、結(jié)構(gòu)體變量的定義

:(3)無類型定義例如:struct{doublelength,width,height;doubleprice;charmaterial[6];}desk1,desk2;

無類型名定義方式只適合于后續(xù)不再需要用該結(jié)構(gòu)體類型定義新變量的情況。10.1.1結(jié)構(gòu)體知識(shí)點(diǎn)2、結(jié)構(gòu)體變量的定義

:結(jié)構(gòu)體類型與結(jié)構(gòu)體變量的區(qū)別:

DeskSizepricemateriallengthwidthheight10.61.20.6150塑料2表頭/結(jié)構(gòu)體類型條目/結(jié)構(gòu)體變量系統(tǒng)不會(huì)為結(jié)構(gòu)體類型分配存儲(chǔ)空間,會(huì)為結(jié)構(gòu)體變量分配內(nèi)存空間。10.1.1結(jié)構(gòu)體知識(shí)點(diǎn)2、結(jié)構(gòu)體變量的定義

:舉例:結(jié)構(gòu)體變量占用內(nèi)存大小#include<stdio.h>structdesk{ doublelength;//8個(gè)字節(jié) doublewidth;//8個(gè)字節(jié) doubleheight;//8個(gè)字節(jié) doubleprice;//8個(gè)字節(jié) charmaterial[6];//6個(gè)字節(jié)};intmain(){ structdeskdesk1; printf("sizeofdesk1is%d",sizeof(structdesk)); return0;}運(yùn)行結(jié)果:在64位機(jī)器下運(yùn)行:sizeofdesk1is40為了提高存取效率,編譯器會(huì)自動(dòng)進(jìn)行內(nèi)存對(duì)齊,在64位機(jī)器中,默認(rèn)以8字節(jié)對(duì)齊。某個(gè)變量不足8個(gè)字節(jié),同樣分配8個(gè)字節(jié)。10.1.1結(jié)構(gòu)體知識(shí)點(diǎn)3、結(jié)構(gòu)體變量的初始化和使用

:(1)在定義結(jié)構(gòu)體變量時(shí)整體賦值(2)在定義結(jié)構(gòu)體變量后,逐個(gè)對(duì)單個(gè)成員進(jìn)行賦值。10.1.1結(jié)構(gòu)體知識(shí)點(diǎn)(1)定義時(shí)賦值struct結(jié)構(gòu)體名結(jié)構(gòu)體變量名={成員值表};或者struct結(jié)構(gòu)體名結(jié)構(gòu)體變量名=同類型結(jié)構(gòu)體變量;舉例:structdeskdesk1={2,0.75,0.75,1000,"木質(zhì)"};structdeskdesk2=desk1;

3、結(jié)構(gòu)體變量的初始化和使用

:10.1.1結(jié)構(gòu)體知識(shí)點(diǎn)(2)定義后,結(jié)構(gòu)體成員單獨(dú)賦值獲取結(jié)構(gòu)體成員的一般形式: 結(jié)構(gòu)體變量.成員名舉例:structdeskdesk1;desk1.length=2.0;desk1.width=0.75;desk1.height=0.75;desk1.price=1000;strcpy(desk1.material,"木質(zhì)");

3、結(jié)構(gòu)體變量的初始化和使用

:.成員運(yùn)算符10.1.2結(jié)構(gòu)體案例分析#include<stdio.h>intmain(){ inti;

structcomplex{ doublereal;//復(fù)數(shù)實(shí)部 doubleimag;//復(fù)數(shù)虛部 }num; printf("請(qǐng)輸入復(fù)數(shù)的實(shí)部和虛部,用空格隔開:\n"); scanf("%lf%lf",&num.real,&num.imag); printf("thecomplexnumis(%.2f+%.2fi)",num.real,num.imag); return0;}

案例10.1.1定義一個(gè)表示復(fù)數(shù)的結(jié)構(gòu)體,輸入一個(gè)復(fù)數(shù),并將該復(fù)數(shù)輸出出來。請(qǐng)輸入復(fù)數(shù)的實(shí)部和虛部,用空格隔開:3.25.1↙thecomplexnumis(3.20+5.10i)運(yùn)行結(jié)果10.1.2結(jié)構(gòu)體案例分析要求:輸入整數(shù)n,隨后輸入n個(gè)候選人信息,候選人信息包括:姓名、學(xué)號(hào)、班級(jí)、得票數(shù),并輸出得票數(shù)最多的學(xué)生會(huì)主席候選人信息。//姓名、學(xué)號(hào)、班級(jí)、得票數(shù)structcandidate{ charname[10];//姓名 intno;//學(xué)號(hào) chargrade[20];//班級(jí) intvotes;//得票數(shù)};typedefstructcandidateCandidata;

案例10.1.2學(xué)生會(huì)主席候選人信息統(tǒng)計(jì),以及最高票候選人信息輸出。

#include<stdio.h>//姓名、學(xué)號(hào)、班級(jí)、得票數(shù)structcandidate{ charname[10];//姓名 intno;//學(xué)號(hào) chargrade[20];//班級(jí) intvotes;//得票數(shù)};typedefstructcandidateCandidata;

intmain(){ Candidatamax,stu; inti,n;案例10.1.2程序代碼

printf("請(qǐng)輸入候選人的人數(shù):\n"); scanf("%d",&n); printf("請(qǐng)輸入候選人的信息:姓名、學(xué)號(hào)、班級(jí)和票數(shù):\n"); for(i=0;i<n;i++){ if(i==0){ scanf("%s%d%s%d",,&stu.no,stu.grade,&stu.votes); max=stu;//先假設(shè)第一個(gè)學(xué)生的投票數(shù)最多 }else{ scanf("%s%d%s%d",,&stu.no,stu.grade,&stu.votes); if(stu.votes>max.votes)max=stu; } } printf("得票最多的候選人:\n"); printf("%s%d%s%d",,stu.no,stu.grade,stu.votes); return0;}10.1.2結(jié)構(gòu)體案例分析請(qǐng)輸入候選人的人數(shù):3↙請(qǐng)輸入候選人的信息:姓名、學(xué)號(hào)、班級(jí)和票數(shù):Emily2023100023軟件工程28↙Peter2022103422信息安全30↙Eric2022202922會(huì)計(jì)42↙得票最多的候選人:Eric2022202922會(huì)計(jì)42運(yùn)行結(jié)果10.1.3結(jié)構(gòu)體課堂練習(xí)題課堂練習(xí)題10.1.1:寫出執(zhí)行下面程序后的輸出結(jié)果。#include<stdio.h>typedefstructdesk{ doublelength,width,height,price; charmaterial[6];}Desk;intmain(){ Deskdesk1={2,0.75,0.75,1000,"木質(zhì)"},desk2=desk1; desk2.price=1250; strcpy(desk2.material,"鐵質(zhì)"); printf("theinfomationofdesk1is%.2f,%.2f,%.2f,%.2f,%s\n", desk1.length,desk1.width,desk1.height,desk1.price,desk1.material); printf("theinfomationofdesk2is%.2f,%.2f,%.2f,%.2f,%s\n", desk2.length,desk2.width,desk2.height,desk2.price,desk2.material); return0;}

10.1.3結(jié)構(gòu)體課堂練習(xí)題課堂練習(xí)題10.1.2:在案例10.1.1的基礎(chǔ)上,輸入兩個(gè)復(fù)數(shù),并輸出這兩個(gè)復(fù)數(shù)的和與積。課堂練習(xí)題10.1.3:給定若干個(gè)二維坐標(biāo)中的點(diǎn),計(jì)算并輸出這些點(diǎn)離原點(diǎn)的距離。10.2結(jié)構(gòu)體數(shù)組123結(jié)構(gòu)體數(shù)組的定義結(jié)構(gòu)體數(shù)組的使用知識(shí)點(diǎn)結(jié)構(gòu)體數(shù)組案例分析案例分析結(jié)構(gòu)體數(shù)組相關(guān)練習(xí)題練習(xí)題結(jié)構(gòu)體數(shù)組,是指數(shù)組中每一個(gè)元素的類型都是結(jié)構(gòu)體類型。結(jié)構(gòu)體數(shù)組通常用來表示一組相同類型的實(shí)體,比如一個(gè)班級(jí)的學(xué)生。10.2.1結(jié)構(gòu)體數(shù)組知識(shí)點(diǎn)學(xué)號(hào)姓名C語言成績(jī)1、結(jié)構(gòu)體數(shù)組的定義形式如下:與定義結(jié)構(gòu)體變量的方式類似,有三種方式:分開定義、同時(shí)定義、無類型定義,只是在定義變量的位置替換成定義數(shù)組。10.2.1結(jié)構(gòu)體數(shù)組知識(shí)點(diǎn)

例如:結(jié)構(gòu)體數(shù)組也可以在定義的同時(shí)初始化。

structcandidate{ charname[10]; intno; chargrade[20]; intvotes; }stu[4]={//如果對(duì)數(shù)組中全部元素賦初值,也可以省略數(shù)組個(gè)數(shù)4 {"Emily",20231000,"23軟件工程",35}, {"Peter",20221022,"22網(wǎng)絡(luò)工程",12}, {"Eric",20221030,"22信息安全",49}, {"Paul",20211040,"21金融學(xué)",26} };namenogradevotesstu[0]Emily2023100023軟件工程35stu[1]Peter2022102222網(wǎng)絡(luò)工程12stu[2]Eric2022103022信息安全49stu[3]Paul2021104021金融學(xué)262、結(jié)構(gòu)體數(shù)組的使用

:結(jié)構(gòu)體數(shù)組名[下標(biāo)].結(jié)構(gòu)體成員名10.2.1結(jié)構(gòu)體數(shù)組知識(shí)點(diǎn)獲取上例中Eric這個(gè)候選人的得票數(shù):namenogradevotesstu[0]Emily2023100023軟件工程35stu[1]Peter2022102222網(wǎng)絡(luò)工程12stu[2]Eric2022103022信息安全49stu[3]Paul2021104021金融學(xué)26stu[2].votes先獲取下標(biāo)為2的候選人Eric的結(jié)構(gòu)體獲取候選人Eric的結(jié)構(gòu)體成員votes的值如何修改Emily的得票數(shù)為38stu[0].votes=38;Emily2023100023軟件工程35↙Peter2022102222網(wǎng)絡(luò)工程12↙Eric2022103022信息安全49↙Paul2021104021金融學(xué)26↙依次輸出所有候選人的信息:Emily2023100023軟件工程35Peter2022102222網(wǎng)絡(luò)工程12Eric2022103022信息安全49Paul2021104021金融學(xué)2610.2.2結(jié)構(gòu)體數(shù)組案例分析要求:編寫程序輸入所有候選人的信息,包括姓名、學(xué)號(hào)、年級(jí)和得票數(shù)。并按照輸入的順序輸出所有候候選人的信息。案例10.2.1統(tǒng)計(jì)所有學(xué)生會(huì)主席候選人的信息#include<stdio.h>#defineMAX4intmain(){ inti; structcandidate{ charname[10]; intno; chargrade[20]; intvotes; }stu[MAX]; for(i=0;i<MAX;i++){//輸入所有候選人的信息 scanf("%s%d%s%d",stu[i].name,&stu[i].no,stu[i].grade,&stu[i].votes); } printf("依次輸出所有候選人的信息:\n"); for(i=0;i<MAX;i++){ printf("%s%d%s%d\n",stu[i].name,stu[i].no,stu[i].grade,stu[i].votes); } return0;}運(yùn)行結(jié)果10.2.2結(jié)構(gòu)體數(shù)組案例分析要求:候選人的信息包括姓名、學(xué)號(hào)、班級(jí)和得票數(shù)。編寫程序按照得票數(shù)從高到低的順序輸出候選人的信息,只需要輸出候選人姓名:得票數(shù),案例10.2.2從高到底輸出各學(xué)生會(huì)主席侯選人的得票數(shù)#include<stdio.h>#defineMAX4intmain(){ inti,j; structcandidate{ charname[10]; intno; chargrade[20]; intvotes; }stu[MAX]={ {"Emily",20231000,"23軟件工程",35}, {"Peter",20221022,"22網(wǎng)絡(luò)工程",12}, {"Eric",20221030,"22信息安全",49}, {"Paul",20211040,"21金融學(xué)",26} };

10.2.2結(jié)構(gòu)體數(shù)組案例分析案例10.2.2從高到底輸出各學(xué)生會(huì)主席侯選人的得票數(shù) for(i=0;i<MAX-1;i++){//冒泡排序法進(jìn)行排序,從高到底 for(j=0;j<MAX-1-i;j++){ if(stu[j].votes<stu[j+1].votes){ structcandidatetmp=stu[j]; stu[j]=stu[j+1]; stu[j+1]=tmp; } } } for(i=0;i<MAX;i++){ printf("%s:%d",stu[i].name,stu[i].votes); } return0;}運(yùn)行結(jié)果Eric:49Emily:35Paul:26Peter:1210.2.3結(jié)構(gòu)體數(shù)組課堂練習(xí)題課堂練習(xí)題10.2.1:定義包含10個(gè)畢業(yè)生信息的結(jié)構(gòu)體數(shù)組,每個(gè)畢業(yè)生的信息包括編號(hào)、姓名、畢業(yè)院校、入職公司、薪資,計(jì)算這10個(gè)人的平均薪資。

課堂練習(xí)題10.2.2:在課堂練習(xí)題10.2.1基礎(chǔ)上,計(jì)算大于平均薪資的畢業(yè)生的信息。課堂練習(xí)題10.2.3:在課堂練習(xí)題10.1.3基礎(chǔ)上做擴(kuò)展,給定若干個(gè)二維坐標(biāo)中的點(diǎn),按照每個(gè)點(diǎn)距離原點(diǎn)的距離,從近到遠(yuǎn)的順序輸出每個(gè)點(diǎn)。10.3結(jié)構(gòu)體指針123結(jié)構(gòu)體指針的定義結(jié)構(gòu)體指針成員的訪問結(jié)構(gòu)體指針作為函數(shù)參數(shù)知識(shí)點(diǎn)結(jié)構(gòu)體指針案例分析案例分析結(jié)構(gòu)體指針相關(guān)練習(xí)題練習(xí)題結(jié)構(gòu)體指針是保存了一個(gè)結(jié)構(gòu)體變量地址的變量,即結(jié)構(gòu)體指針指向一個(gè)結(jié)構(gòu)體變量。1、結(jié)構(gòu)體指針定義方式如下:struct結(jié)構(gòu)體類型名*結(jié)構(gòu)體指針名;10.3.1結(jié)構(gòu)體指針知識(shí)點(diǎn)#include<stdio.h>intmain(){ structcandidate{ charname[10]; intno; chargrade[20]; intvotes;

}stu={"Eric",20221030,"22信息安全",49};

structcandidate*p=&stu; printf("%#X%#X\n",p,&()); return0;}運(yùn)行結(jié)果:0X62FDF00X62FDF0stustu.namestu.nostu.gradestu.votesp&stuEric2022103022信息安全49數(shù)組名:指針常量結(jié)構(gòu)體變量:代表了所有成員的一個(gè)集合,不是一個(gè)指針。&stu是地址。stustu.namestu.nostu.gradestu.votespEric&stu2022103022信息安全49當(dāng)一個(gè)結(jié)構(gòu)體指針指向一個(gè)具體的結(jié)構(gòu)體變量時(shí),通過結(jié)構(gòu)體指針也可以獲取結(jié)構(gòu)體成員。(1)用(*p)訪問結(jié)構(gòu)體成員(*p).no=20221031;

不可以寫成*p.no,’.’優(yōu)先級(jí)高于‘*’,*p.no等價(jià)于*(p.no),p是一個(gè)指針變量,沒有‘.’的運(yùn)算,這樣意義就不對(duì)了。(2)用指向運(yùn)算符“->”訪問指針指向的結(jié)構(gòu)體變量的成員p->no=20221031;10.3.1結(jié)構(gòu)體指針知識(shí)點(diǎn)2、結(jié)構(gòu)體指針成員的獲?。?、結(jié)構(gòu)體指針作為函數(shù)參數(shù):

結(jié)構(gòu)體變量作為函數(shù)的實(shí)參傳遞到函數(shù)中時(shí),傳遞的是所有成員變量的集合,當(dāng)成員變量比較多時(shí),傳遞的時(shí)間和消耗的內(nèi)存空間較大,會(huì)影響程序的執(zhí)行效率。此時(shí)實(shí)參改為只傳遞結(jié)構(gòu)體指針,從實(shí)參傳給形參的只是一個(gè)地址,就可以大大提高函數(shù)調(diào)用的效率。10.3.1結(jié)構(gòu)體指針知識(shí)點(diǎn)10.3.2結(jié)構(gòu)體指針案例分析案例10.3.1編寫程序輸入一名候選人的信息,并用指針的方式將其信息輸出。#include<stdio.h>typedefstructcandidate{ charname[10]; intno; chargrade[20]; intvotes;}Candidate;intmain(){ intn,i,no,votes; Candidatestu,*pStu; printf("請(qǐng)輸入候選人的信息:姓名、學(xué)號(hào)、班級(jí)和票數(shù):\n"); scanf("%s%d%s%d",,&stu.no,stu.grade,&stu.votes); pStu=&stu; printf("輸出候選人信息如下:\n"); printf("%s%d%s%d",pStu->name,pStu->no,(*pStu).grade,(*pStu).votes); return0;}請(qǐng)輸入候選人的信息:姓名、學(xué)號(hào)、班級(jí)和票數(shù):David2022102922會(huì)計(jì)37↙輸出候選人信息如下:David2022102922會(huì)計(jì)37運(yùn)行結(jié)果10.3.2結(jié)構(gòu)體指針案例分析案例10.3.2調(diào)用函數(shù),根據(jù)學(xué)號(hào),修改指定候選人的票數(shù)。#include<stdio.h>#defineMAX10structcandidate{ charname[10]; intno; chargrade[20]; intvotes;};typedefstructcandidateCandidate;intmodify(Candidate*stu,intn,intno,intvotes);intmain(){ intn,i,no,votes;intindex=-1;charname[20]={'\0'}; Candidatestu[MAX]; scanf("%d",&n); for(i=0;i<n;i++){ printf("請(qǐng)輸入候選人的信息:姓名、學(xué)號(hào)、班級(jí)和票數(shù):\n"); scanf("%s%d%s%d",stu[i].name,&stu[i].no,stu[i].grade,&stu[i].votes); } printf("請(qǐng)輸入擬修改候選人的信息:學(xué)號(hào)及票數(shù):");

scanf("%d%d",&no,&votes); index=modify(stu,n,no,votes); if(index==-1){ printf("這個(gè)候選人不存在!");

}else{//index中保存的是需要修改候選人的下標(biāo)

printf("修改后的候選人信息如下:\n"); printf("%s%d%s%d",stu[index].name,stu[index].no, stu[index].grade,stu[index].votes); } return0;}intmodify(Candidate*candi,intn,intno,intvotes){ inti,index=-1;//標(biāo)記找到的那個(gè)候選人的下標(biāo)

Candidate*p; for(p=candi,i=0;i<n;i++,p++){ if(p->no==no){ index=i; p->votes=votes; break; } } returnindex;}4↙請(qǐng)輸入候選人的信息:姓名、學(xué)號(hào)、班級(jí)和票數(shù):Emily2023100023軟件工程35↙請(qǐng)輸入候選人的信息:姓名、學(xué)號(hào)、班級(jí)和票數(shù):Peter2022102222網(wǎng)絡(luò)工程12↙請(qǐng)輸入候選人的信息:姓名、學(xué)號(hào)、班級(jí)和票數(shù):Eric2022103022信息安全49↙請(qǐng)輸入候選人的信息:姓名、學(xué)號(hào)、班級(jí)和票數(shù):Paul2021104021金融學(xué)26↙請(qǐng)輸入擬修改候選人的信息:學(xué)號(hào)及票數(shù):2023100050↙修改后的候選人信息如下:Emily2023100023軟件工程50運(yùn)行結(jié)果10.3.3結(jié)構(gòu)體指針課堂練習(xí)題課堂練習(xí)題10.3.1:查找下面程序中的3處錯(cuò)誤。編寫程序使用結(jié)構(gòu)體指針來操作結(jié)構(gòu)體變量中的成員。#include<stdio.h>intmain(){ structcandidate{ charname[10]; intno; chargrade[20]; intvotes; }stu={"Eric",20221030,"22信息安全",49}; structcandidate*p=&stu; p->no=20221033; *p.votes=46; strcpy(stu.grade,"23信息安全"); printf("theinfomationofstuis%s,%d,%s,%d", ,(*p).no,stu->grade,p->votes); return0;}10.3.3結(jié)構(gòu)體指針課堂練習(xí)題課堂練習(xí)題10.3.2編寫函數(shù)來計(jì)算兩個(gè)復(fù)數(shù)的和與積,將指向復(fù)數(shù)和與積的指針作為函數(shù)的參數(shù)。課堂練習(xí)題10.3.3:調(diào)用函數(shù),修改指定應(yīng)屆畢業(yè)生的薪資信息。輸入n個(gè)應(yīng)屆畢業(yè)生的信息,包括姓名、編號(hào)、畢業(yè)院校、入職公司、薪資,再輸入一個(gè)應(yīng)屆畢業(yè)生的編號(hào),編寫函數(shù)根據(jù)編號(hào)修改其薪資和入職公司?!疚⒁曨l】學(xué)生成績(jī)查詢與插入10.4鏈表123鏈表的鏈?zhǔn)酱鎯?chǔ)鏈表的節(jié)點(diǎn)鏈表的組織形式鏈表的基本操作知識(shí)點(diǎn)鏈表案例分析案例分析鏈表相關(guān)練習(xí)題練習(xí)題前面章節(jié)中,學(xué)生會(huì)候選人、應(yīng)屆畢業(yè)生的信息采用什么方式存儲(chǔ)?若進(jìn)行刪除、插入的操作,會(huì)涉及到非常多移動(dòng)的操作,降低了程序執(zhí)行的效率。C語言提供了一種采用動(dòng)態(tài)存儲(chǔ)分配的構(gòu)造數(shù)據(jù)類型——鏈表,大大提高了程序解決此類問題的時(shí)間效率。10.4.1鏈表知識(shí)點(diǎn)結(jié)構(gòu)體數(shù)組的存儲(chǔ)方式優(yōu)點(diǎn):便于對(duì)信息進(jìn)行查詢、修改、輸出操作。如何更好解決刪除、插入的問題?鏈條示意圖10.4.1鏈表知識(shí)點(diǎn)先看下鏈條:由多個(gè)金屬環(huán)串聯(lián)在一起的前一個(gè)金屬環(huán)扣住下一個(gè)金屬環(huán)。鏈表就是一種鏈?zhǔn)酱鎯?chǔ)的結(jié)構(gòu),由多個(gè)相同結(jié)構(gòu)體類型的節(jié)點(diǎn)串聯(lián)一起節(jié)點(diǎn)之間相互關(guān)聯(lián)鏈表分為單向鏈表和雙向鏈表,本節(jié)只講解單向鏈表。10.4.1鏈表知識(shí)點(diǎn)每個(gè)節(jié)點(diǎn)都是一個(gè)結(jié)構(gòu)體類型的變量,兩部分組成:①

節(jié)點(diǎn)本身的數(shù)據(jù)部分,稱為數(shù)據(jù)域;②

指向下一個(gè)節(jié)點(diǎn)的指針,稱為指針域。以保存29478490這4個(gè)數(shù)據(jù)為例。鏈表的組織形式——節(jié)點(diǎn)10.4.1鏈表知識(shí)點(diǎn)例如:定義structnode結(jié)構(gòu)體類型作為鏈表節(jié)點(diǎn)的類型名,定義如下:typedefstructnode{ intdata;//數(shù)據(jù)域的值 structnode*next;//指針域的值,next指向下一個(gè)鏈表節(jié)點(diǎn)}Node;typedef用法?next指針的類型?鏈表的組織形式——節(jié)點(diǎn)datanext10.4.1鏈表知識(shí)點(diǎn)(1)頭指針,鏈表一般使用頭指針head來表示,方便后續(xù)對(duì)鏈表的訪問和操作。(2)節(jié)點(diǎn),節(jié)點(diǎn)分為第一個(gè)節(jié)點(diǎn)和其他節(jié)點(diǎn)。無頭節(jié)點(diǎn)的單向鏈表:帶頭節(jié)點(diǎn)的單向鏈表:涉及的概念:第一個(gè)節(jié)點(diǎn),為頭結(jié)點(diǎn)。存儲(chǔ)第一個(gè)實(shí)際數(shù)據(jù)的節(jié)點(diǎn),為首元節(jié)點(diǎn)。最后一個(gè)節(jié)點(diǎn)稱為尾節(jié)點(diǎn),尾節(jié)點(diǎn)后續(xù)沒有節(jié)點(diǎn),其指針域的值為NULL。鏈表包括頭指針和節(jié)點(diǎn)10.4.1鏈表知識(shí)點(diǎn)(1)malloc和free函數(shù)鏈表中的節(jié)點(diǎn),邏輯上:連續(xù)的,

物理上:是隨機(jī)存放的。每個(gè)節(jié)點(diǎn)的內(nèi)存空間,通過動(dòng)態(tài)存儲(chǔ)分配的。使用stdlib.h頭文件中函數(shù)。malloc:動(dòng)態(tài)分配內(nèi)存空間free:釋放用malloc動(dòng)態(tài)分配的內(nèi)存空間鏈表的基本操作10.4.1鏈表知識(shí)點(diǎn)(1)malloc和free函數(shù)malloc函數(shù)原型如下: void*malloc(unsignedintsize);在動(dòng)態(tài)存儲(chǔ)區(qū)分配一個(gè)大小為size字節(jié)的連續(xù)空間。成功:返回分配好的存儲(chǔ)空間的首地址;失?。悍祷刂礜ULL 鏈表的基本操作舉例:double*pd=(double*)malloc(sizieof(double));1、增加程序可移植性2、強(qiáng)制轉(zhuǎn)化為需要的類型10.4.1鏈表知識(shí)點(diǎn)(1)malloc和free函數(shù)free函數(shù)原型如下: voidfree(void*p);釋放掉指針p指向的內(nèi)容空間。free函數(shù)要和malloc函數(shù)成對(duì)使用。

鏈表的基本操作舉例:structnode*curNode=(structnode*)malloc(sizieof(structnode));…free(curNode);maloc函數(shù)申請(qǐng)的空間,不會(huì)自動(dòng)釋放。必須由free函數(shù)來釋放。10.4.1鏈表知識(shí)點(diǎn)(2)單向鏈表的新建

鏈表的基本操作創(chuàng)建單鏈表,保存29478490這4個(gè)數(shù)據(jù)。頭結(jié)點(diǎn)headrear29首元結(jié)點(diǎn)curNoderear->next47rear->next10.4.1鏈表知識(shí)點(diǎn)//生成含頭節(jié)點(diǎn)的單向鏈表for(i=0;i<N;i++){//創(chuàng)建新節(jié)點(diǎn)curNode,為其動(dòng)態(tài)分配存儲(chǔ)空間Node*curNode=(Node*)malloc(sizeof(structnode));curNode->data=array[i];//此時(shí)rear指向當(dāng)前鏈表的尾節(jié)點(diǎn)rear->next=curNode;//將新節(jié)點(diǎn)curNode加入到鏈表中//curNode成為了新的尾節(jié)點(diǎn),更新rear指向curNoderear=curNode;}rear->next=NULL;returnhead;//將頭指針返回}typedefstructnode{ intdata;//存儲(chǔ)數(shù)據(jù)域的值 structnode*next;//存儲(chǔ)指針域的值,next指向下一個(gè)鏈表節(jié)點(diǎn)}Node;#defineN4Node*initLink(){inti=0;intarray[N]={29,47,84,90};//創(chuàng)建頭結(jié)點(diǎn)Node*head=(Node*)malloc(sizeof(structnode));//聲明一個(gè)rear指針,指向鏈表的尾節(jié)點(diǎn) Node*rear=head;(2)單向鏈表的新建,代碼段

10.4.1鏈表知識(shí)點(diǎn)(3)判斷單向鏈表是否為空帶頭結(jié)點(diǎn)單向鏈表只有頭節(jié)點(diǎn),沒有后續(xù)節(jié)點(diǎn)時(shí),被認(rèn)為單向鏈表為空

intemptyLink(Node*head){ return(head->next==NULL);}鏈表的基本操作NULLheaddatanext頭結(jié)點(diǎn)10.4.1鏈表知識(shí)點(diǎn)(4)單項(xiàng)鏈表的插入兩個(gè)節(jié)點(diǎn)A和B間插入一個(gè)新節(jié)點(diǎn)C時(shí),讓C與A和B分別建立邏輯聯(lián)系。

步驟如下:將C節(jié)點(diǎn)的next指針指向B節(jié)點(diǎn)將A節(jié)點(diǎn)的next指針指向C節(jié)點(diǎn)鏈表的基本操作head8429A結(jié)點(diǎn)9047頭結(jié)點(diǎn)B結(jié)點(diǎn)35C結(jié)點(diǎn)第一步第二步節(jié)點(diǎn)間是如何建立邏輯聯(lián)系?通過前節(jié)點(diǎn)next指針指向下一個(gè)節(jié)點(diǎn),建立邏輯聯(lián)系NULL10.4.1鏈表知識(shí)點(diǎn)//在第position個(gè)位置處插入數(shù)據(jù)newData,position從1開始計(jì)數(shù)Node*insertLink(Node*head,intnewData,intposition){ //因?yàn)椴迦霐?shù)據(jù)時(shí),需要知道插入位置的前一個(gè)節(jié)點(diǎn),定義p為前一個(gè)節(jié)點(diǎn)指針

Node*p=head,*newNode; inti=1; //先找到插入位置的前一個(gè)節(jié)點(diǎn)

while(i<position){ p=p->next;if(p==NULL){printf("插入位置無效\n");returnhead;}i++; } //找到插入位置,此時(shí)p為插入位置的前一個(gè)節(jié)點(diǎn)

newNode=(Node*)malloc(sizeof(structnode)); newNode->data=newData; newNode->next=p->next; p->next=newNode; returnhead;}(4)單向鏈表的插入,代碼段

頭節(jié)點(diǎn)的存在,不管新插入的節(jié)點(diǎn),是在首元節(jié)點(diǎn)前、還是中間的位置,還是在尾節(jié)點(diǎn)后,操作步驟都是一樣的。10.4.1鏈表知識(shí)點(diǎn)(5)單項(xiàng)鏈表的遍歷從鏈表頭開始,依次訪問單向鏈表中的每個(gè)節(jié)點(diǎn),并將節(jié)點(diǎn)的數(shù)據(jù)值輸出,直到鏈表尾。鏈表的基本操作head84299047NULLp

voiddisplayLink(Node*head){ Node*p=head->next;//p指向首元節(jié)點(diǎn)

while(p!=NULL){//當(dāng)p不為空,則沒有到達(dá)鏈表尾

printf("%d",p->data); p=p->next;

溫馨提示

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

評(píng)論

0/150

提交評(píng)論