




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
程序設計基礎——C語言程序設計
2023翻轉課堂實用教程第10章
結構體結構體10.1結構體數組10.2
結構體指針10.3
鏈表10.410.1結構體引入結構體前面章節中學到的數組,用于存儲相同類型的數據,如每位應屆生的薪資。若保存每位應屆生的個人信息,比如姓名、性別、年齡、畢業學校、畢業時間等,可以定義不同的變量,但體現不了他們同屬一個人的信息的內在聯系。結構體可用來存放一組不同類型的、具有內在聯系的數據。姓名性別年齡畢業學校畢業時間123結構體類型的定義結構體變量的定義結構體變量的初始化和使用知識點結構體案例案例分析結構體相關練習題練習題10.1.1結構體知識點程序員自定義的構造數據類型,“模板”,包含多個屬性,用變量來表示,每個變量稱為結構體成員。struct,定義結構體類型的關鍵字,不可省略1、結構體類型的定義形式如下:struct結構體名{
數據類型名
變量1;//又稱為結構體成員1
數據類型名
變量2;//又稱為結構體成員2…};//此處的分號不可以省略結構體類型名為:struct結構體名舉例1:定義一張桌子的結構體類型,桌子包括長、寬、高、價格、材質這5個屬性。structdesk{ doublelength,width,height;//同類型的結構體成員可用逗號,隔開一起定義 doubleprice; charmaterial[6];//用字符串來保存材質,如木、鐵等。};代表著實際應用中的桌子模板,5個結構體成員,分別表示長、寬、高、價格、材質這5個屬性。1、結構體類型的定義形式如下:10.1.1結構體知識點舉例2:定義一個表示三維坐標點的結構體類型,坐標點包含x,y,z三個坐標值。structpoint{intx,y,z;};typedefstructpointPoint;//給structpoint起個短一些的別名Point雖然x,y,z都是整形,可以用數組來存儲,但用結構體來表示,更能體現x,y,z為同一個點的三個坐標,反應三者的內在聯系1、結構體類型的定義形式如下:
10.1.1結構體知識點舉例3:結構體類型的嵌套定義structsize{ doublelength; doublewidth; doubleheight;};typedefstructsizeSize;//為structsize起的別名Size,后面用Size代替structsizestructdesk{ SizemySize;//成員變量也為一個結構體類型 doubleprice; charmaterial[6];};1、結構體類型的定義形式如下:10.1.1結構體知識點10.1.1結構體知識點2、結構體變量的定義
:結構體類型是一種構造數據類型,定義好數據類型后,就可以定義該數據類型的變量了。三種結構體變量的定義方式:(1)分開定義(2)同時定義(3)無類型定義
10.1.1結構體知識點2、結構體變量的定義
:(1)分開定義指先定義結構體類型,再定義這種結構體類型的變量,一般形式如下:struct結構體名{ 數據類型名變量1;//又稱為結構體成員1 數據類型名變量2;//又稱為結構體成員2…};struct結構體名結構體變量名表;
10.1.1結構體知識點2、結構體變量的定義
:(1)分開定義例如:structdesk{doublelength,width,height;doubleprice;charmaterial[6];};
structdeskdesk1,desk2;
10.1.1結構體知識點2、結構體變量的定義
:(2)同時定義指在結構體類型的定義最后定義變量,一般形式如下:struct結構體名{ 數據類型名變量1;//又稱為結構體成員1 數據類型名變量2;//又稱為結構體成員2…}結構體變量名表;//多個變量名之間用逗號,隔開
10.1.1結構體知識點2、結構體變量的定義
:(2)同時定義例如:structdesk{doublelength,width,height;doubleprice;charmaterial[6];}desk1,desk2;
10.1.1結構體知識點2、結構體變量的定義
:(3)無類型定義是指采用同時定義的方式時,省略結構體類型名。struct{ 數據類型名變量1;//又稱為結構體成員1 數據類型名變量2;//又稱為結構體成員2…}結構體變量名表;//多個變量名之間用逗號,隔開
10.1.1結構體知識點2、結構體變量的定義
:(3)無類型定義例如:struct{doublelength,width,height;doubleprice;charmaterial[6];}desk1,desk2;
無類型名定義方式只適合于后續不再需要用該結構體類型定義新變量的情況。10.1.1結構體知識點2、結構體變量的定義
:結構體類型與結構體變量的區別:
DeskSizepricemateriallengthwidthheight10.61.20.6150塑料2表頭/結構體類型條目/結構體變量系統不會為結構體類型分配存儲空間,會為結構體變量分配內存空間。10.1.1結構體知識點2、結構體變量的定義
:舉例:結構體變量占用內存大小#include<stdio.h>structdesk{ doublelength;//8個字節 doublewidth;//8個字節 doubleheight;//8個字節 doubleprice;//8個字節 charmaterial[6];//6個字節};intmain(){ structdeskdesk1; printf("sizeofdesk1is%d",sizeof(structdesk)); return0;}運行結果:在64位機器下運行:sizeofdesk1is40為了提高存取效率,編譯器會自動進行內存對齊,在64位機器中,默認以8字節對齊。某個變量不足8個字節,同樣分配8個字節。10.1.1結構體知識點3、結構體變量的初始化和使用
:(1)在定義結構體變量時整體賦值(2)在定義結構體變量后,逐個對單個成員進行賦值。10.1.1結構體知識點(1)定義時賦值struct結構體名結構體變量名={成員值表};或者struct結構體名結構體變量名=同類型結構體變量;舉例:structdeskdesk1={2,0.75,0.75,1000,"木質"};structdeskdesk2=desk1;
3、結構體變量的初始化和使用
:10.1.1結構體知識點(2)定義后,結構體成員單獨賦值獲取結構體成員的一般形式: 結構體變量.成員名舉例:structdeskdesk1;desk1.length=2.0;desk1.width=0.75;desk1.height=0.75;desk1.price=1000;strcpy(desk1.material,"木質");
3、結構體變量的初始化和使用
:.成員運算符10.1.2結構體案例分析#include<stdio.h>intmain(){ inti;
structcomplex{ doublereal;//復數實部 doubleimag;//復數虛部 }num; printf("請輸入復數的實部和虛部,用空格隔開:\n"); scanf("%lf%lf",&num.real,&num.imag); printf("thecomplexnumis(%.2f+%.2fi)",num.real,num.imag); return0;}
案例10.1.1定義一個表示復數的結構體,輸入一個復數,并將該復數輸出出來。請輸入復數的實部和虛部,用空格隔開:3.25.1↙thecomplexnumis(3.20+5.10i)運行結果10.1.2結構體案例分析要求:輸入整數n,隨后輸入n個候選人信息,候選人信息包括:姓名、學號、班級、得票數,并輸出得票數最多的學生會主席候選人信息。//姓名、學號、班級、得票數structcandidate{ charname[10];//姓名 intno;//學號 chargrade[20];//班級 intvotes;//得票數};typedefstructcandidateCandidata;
案例10.1.2學生會主席候選人信息統計,以及最高票候選人信息輸出。
#include<stdio.h>//姓名、學號、班級、得票數structcandidate{ charname[10];//姓名 intno;//學號 chargrade[20];//班級 intvotes;//得票數};typedefstructcandidateCandidata;
intmain(){ Candidatamax,stu; inti,n;案例10.1.2程序代碼
printf("請輸入候選人的人數:\n"); scanf("%d",&n); printf("請輸入候選人的信息:姓名、學號、班級和票數:\n"); for(i=0;i<n;i++){ if(i==0){ scanf("%s%d%s%d",,&stu.no,stu.grade,&stu.votes); max=stu;//先假設第一個學生的投票數最多 }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",,max.no,max.grade,max.votes); return0;}10.1.2結構體案例分析請輸入候選人的人數:3↙請輸入候選人的信息:姓名、學號、班級和票數:Emily2023100023軟件工程28↙Peter2022103422信息安全30↙Eric2022202922會計42↙得票最多的候選人:Eric2022202922會計42運行結果10.1.3結構體課堂練習題課堂練習題10.1.1:寫出執行下面程序后的輸出結果。#include<stdio.h>typedefstructdesk{ doublelength,width,height,price; charmaterial[6];}Desk;intmain(){ Deskdesk1={2,0.75,0.75,1000,"木質"},desk2=desk1; desk2.price=1250; strcpy(desk2.material,"鐵質"); 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結構體課堂練習題課堂練習題10.1.2:在案例10.1.1的基礎上,輸入兩個復數,并輸出這兩個復數的和與積。課堂練習題10.1.3:給定若干個二維坐標中的點,計算并輸出這些點離原點的距離。10.2結構體數組123結構體數組的定義結構體數組的使用知識點結構體數組案例分析案例分析結構體數組相關練習題練習題結構體數組,是指數組中每一個元素的類型都是結構體類型。結構體數組通常用來表示一組相同類型的實體,比如一個班級的學生。10.2.1結構體數組知識點學號姓名C語言成績1、結構體數組的定義形式如下:與定義結構體變量的方式類似,有三種方式:分開定義、同時定義、無類型定義,只是在定義變量的位置替換成定義數組。10.2.1結構體數組知識點
例如:結構體數組也可以在定義的同時初始化。
structcandidate{ charname[10]; intno; chargrade[20]; intvotes; }stu[4]={//如果對數組中全部元素賦初值,也可以省略數組個數4 {"Emily",20231000,"23軟件工程",35}, {"Peter",20221022,"22網絡工程",12}, {"Eric",20221030,"22信息安全",49}, {"Paul",20211040,"21金融學",26} };namenogradevotesstu[0]Emily2023100023軟件工程35stu[1]Peter2022102222網絡工程12stu[2]Eric2022103022信息安全49stu[3]Paul2021104021金融學262、結構體數組的使用
:結構體數組名[下標].結構體成員名10.2.1結構體數組知識點獲取上例中Eric這個候選人的得票數:namenogradevotesstu[0]Emily2023100023軟件工程35stu[1]Peter2022102222網絡工程12stu[2]Eric2022103022信息安全49stu[3]Paul2021104021金融學26stu[2].votes先獲取下標為2的候選人Eric的結構體獲取候選人Eric的結構體成員votes的值如何修改Emily的得票數為38stu[0].votes=38;Emily2023100023軟件工程35↙Peter2022102222網絡工程12↙Eric2022103022信息安全49↙Paul2021104021金融學26↙依次輸出所有候選人的信息:Emily2023100023軟件工程35Peter2022102222網絡工程12Eric2022103022信息安全49Paul2021104021金融學2610.2.2結構體數組案例分析要求:編寫程序輸入所有候選人的信息,包括姓名、學號、年級和得票數。并按照輸入的順序輸出所有候候選人的信息。案例10.2.1統計所有學生會主席候選人的信息#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;}運行結果10.2.2結構體數組案例分析要求:候選人的信息包括姓名、學號、班級和得票數。編寫程序按照得票數從高到低的順序輸出候選人的信息,只需要輸出候選人姓名:得票數,案例10.2.2從高到底輸出各學生會主席侯選人的得票數#include<stdio.h>#defineMAX4intmain(){ inti,j; structcandidate{ charname[10]; intno; chargrade[20]; intvotes; }stu[MAX]={ {"Emily",20231000,"23軟件工程",35}, {"Peter",20221022,"22網絡工程",12}, {"Eric",20221030,"22信息安全",49}, {"Paul",20211040,"21金融學",26} };
10.2.2結構體數組案例分析案例10.2.2從高到底輸出各學生會主席侯選人的得票數 for(i=0;i<MAX-1;i++){//冒泡排序法進行排序,從高到底 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;}運行結果Eric:49Emily:35Paul:26Peter:1210.2.3結構體數組課堂練習題課堂練習題10.2.1:定義包含10個畢業生信息的結構體數組,每個畢業生的信息包括編號、姓名、畢業院校、入職公司、薪資,計算這10個人的平均薪資。
課堂練習題10.2.2:在課堂練習題10.2.1基礎上,計算大于平均薪資的畢業生的信息。課堂練習題10.2.3:在課堂練習題10.1.3基礎上做擴展,給定若干個二維坐標中的點,按照每個點距離原點的距離,從近到遠的順序輸出每個點。10.3結構體指針123結構體指針的定義結構體指針成員的訪問結構體指針作為函數參數知識點結構體指針案例分析案例分析結構體指針相關練習題練習題結構體指針是保存了一個結構體變量地址的變量,即結構體指針指向一個結構體變量。1、結構體指針定義方式如下:struct結構體類型名*結構體指針名;10.3.1結構體指針知識點#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;}運行結果:0X62FDF00X62FDF0stustu.namestu.nostu.gradestu.votesp&stuEric2022103022信息安全49數組名:指針常量結構體變量:代表了所有成員的一個集合,不是一個指針。&stu是地址。stustu.namestu.nostu.gradestu.votespEric&stu2022103022信息安全49當一個結構體指針指向一個具體的結構體變量時,通過結構體指針也可以獲取結構體成員。(1)用(*p)訪問結構體成員(*p).no=20221031;
不可以寫成*p.no,’.’優先級高于‘*’,*p.no等價于*(p.no),p是一個指針變量,沒有‘.’的運算,這樣意義就不對了。(2)用指向運算符“->”訪問指針指向的結構體變量的成員p->no=20221031;10.3.1結構體指針知識點2、結構體指針成員的獲?。?、結構體指針作為函數參數:
結構體變量作為函數的實參傳遞到函數中時,傳遞的是所有成員變量的集合,當成員變量比較多時,傳遞的時間和消耗的內存空間較大,會影響程序的執行效率。此時實參改為只傳遞結構體指針,從實參傳給形參的只是一個地址,就可以大大提高函數調用的效率。10.3.1結構體指針知識點10.3.2結構體指針案例分析案例10.3.1編寫程序輸入一名候選人的信息,并用指針的方式將其信息輸出。#include<stdio.h>typedefstructcandidate{ charname[10]; intno; chargrade[20]; intvotes;}Candidate;intmain(){ intn,i,no,votes; Candidatestu,*pStu; printf("請輸入候選人的信息:姓名、學號、班級和票數:\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;}請輸入候選人的信息:姓名、學號、班級和票數:David2022102922會計37↙輸出候選人信息如下:David2022102922會計37運行結果10.3.2結構體指針案例分析案例10.3.2調用函數,根據學號,修改指定候選人的票數。#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("請輸入候選人的信息:姓名、學號、班級和票數:\n"); scanf("%s%d%s%d",stu[i].name,&stu[i].no,stu[i].grade,&stu[i].votes); } printf("請輸入擬修改候選人的信息:學號及票數:");
scanf("%d%d",&no,&votes); index=modify(stu,n,no,votes); if(index==-1){ printf("這個候選人不存在!");
}else{//index中保存的是需要修改候選人的下標
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;//標記找到的那個候選人的下標
Candidate*p; for(p=candi,i=0;i<n;i++,p++){ if(p->no==no){ index=i; p->votes=votes; break; } } returnindex;}4↙請輸入候選人的信息:姓名、學號、班級和票數:Emily2023100023軟件工程35↙請輸入候選人的信息:姓名、學號、班級和票數:Peter2022102222網絡工程12↙請輸入候選人的信息:姓名、學號、班級和票數:Eric2022103022信息安全49↙請輸入候選人的信息:姓名、學號、班級和票數:Paul2021104021金融學26↙請輸入擬修改候選人的信息:學號及票數:2023100050↙修改后的候選人信息如下:Emily2023100023軟件工程50運行結果10.3.3結構體指針課堂練習題課堂練習題10.3.1:查找下面程序中的3處錯誤。編寫程序使用結構體指針來操作結構體變量中的成員。#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結構體指針課堂練習題課堂練習題10.3.2編寫函數來計算兩個復數的和與積,將指向復數和與積的指針作為函數的參數。課堂練習題10.3.3:調用函數,修改指定應屆畢業生的薪資信息。輸入n個應屆畢業生的信息,包括姓名、編號、畢業院校、入職公司、薪資,再輸入一個應屆畢業生的編號,編寫函數根據編號修改其薪資和入職公司。【微視頻】學生成績查詢與插入10.4鏈表123鏈表的鏈式存儲鏈表的節點鏈表的組織形式鏈表的基本操作知識點鏈表案例分析案例分析鏈表相關練習題練習題前面章節中,學生會候選人、應屆畢業生的信息采用什么方式存儲?若進行刪除、插入的操作,會涉及到非常多移動的操作,降低了程序執行的效率。C語言提供了一種采用動態存儲分配的構造數據類型——鏈表,大大提高了程序解決此類問題的時間效率。10.4.1鏈表知識點結構體數組的存儲方式優點:便于對信息進行查詢、修改、輸出操作。如何更好解決刪除、插入的問題?鏈條示意圖10.4.1鏈表知識點先看下鏈條:由多個金屬環串聯在一起的前一個金屬環扣住下一個金屬環。鏈表就是一種鏈式存儲的結構,由多個相同結構體類型的節點串聯一起節點之間相互關聯鏈表分為單向鏈表和雙向鏈表,本節只講解單向鏈表。10.4.1鏈表知識點每個節點都是一個結構體類型的變量,兩部分組成:①
節點本身的數據部分,稱為數據域;②
指向下一個節點的指針,稱為指針域。以保存29478490這4個數據為例。鏈表的組織形式——節點10.4.1鏈表知識點例如:定義structnode結構體類型作為鏈表節點的類型名,定義如下:typedefstructnode{ intdata;//數據域的值 structnode*next;//指針域的值,next指向下一個鏈表節點}Node;typedef用法?next指針的類型?鏈表的組織形式——節點datanext10.4.1鏈表知識點(1)頭指針,鏈表一般使用頭指針head來表示,方便后續對鏈表的訪問和操作。(2)節點,節點分為第一個節點和其他節點。無頭節點的單向鏈表:帶頭節點的單向鏈表:涉及的概念:第一個節點,為頭結點。存儲第一個實際數據的節點,為首元節點。最后一個節點稱為尾節點,尾節點后續沒有節點,其指針域的值為NULL。鏈表包括頭指針和節點10.4.1鏈表知識點(1)malloc和free函數鏈表中的節點,邏輯上:連續的,
物理上:是隨機存放的。每個節點的內存空間,通過動態存儲分配的。使用stdlib.h頭文件中函數。malloc:動態分配內存空間free:釋放用malloc動態分配的內存空間鏈表的基本操作10.4.1鏈表知識點(1)malloc和free函數malloc函數原型如下: void*malloc(unsignedintsize);在動態存儲區分配一個大小為size字節的連續空間。成功:返回分配好的存儲空間的首地址;失?。悍祷刂礜ULL 鏈表的基本操作舉例:double*pd=(double*)malloc(sizeof(double));1、增加程序可移植性2、強制轉化為需要的類型10.4.1鏈表知識點(1)malloc和free函數free函數原型如下: voidfree(void*p);釋放掉指針p指向的內容空間。free函數要和malloc函數成對使用。
鏈表的基本操作舉例:structnode*curNode=(structnode*)malloc(sizeof(structnode));…free(curNode);maloc函數申請的空間,不會自動釋放。必須由free函數來釋放。10.4.1鏈表知識點(2)單向鏈表的新建
鏈表的基本操作創建單鏈表,保存29478490這4個數據。頭結點headrear29首元結點curNoderear->next47rear->next10.4.1鏈表知識點//生成含頭節點的單向鏈表for(i=0;i<N;i++){//創建新節點curNode,為其動態分配存儲空間Node*curNode=(Node*)malloc(sizeof(structnode));curNode->data=array[i];//此時rear指向當前鏈表的尾節點rear->next=curNode;//將新節點curNode加入到鏈表中//curNode成為了新的尾節點,更新rear指向curNoderear=curNode;}rear->next=NULL;returnhead;//將頭指針返回}typedefstructnode{ intdata;//存儲數據域的值 structnode*next;//存儲指針域的值,next指向下一個鏈表節點}Node;#defineN4Node*initLink(){inti=0;intarray[N]={29,47,84,90};//創建頭結點Node*head=(Node*)malloc(sizeof(structnode));//聲明一個rear指針,指向鏈表的尾節點 Node*rear=head;(2)單向鏈表的新建,代碼段
10.4.1鏈表知識點(3)判斷單向鏈表是否為空帶頭結點單向鏈表只有頭節點,沒有后續節點時,被認為單向鏈表為空
intemptyLink(Node*head){ return(head->next==NULL);}鏈表的基本操作NULLheaddatanext頭結點10.4.1鏈表知識點(4)單項鏈表的插入兩個節點A和B間插入一個新節點C時,讓C與A和B分別建立邏輯聯系。
步驟如下:將C節點的next指針指向B節點將A節點的next指針指向C節點鏈表的基本操作head8429A結點9047頭結點B結點35C結點第一步第二步節點間是如何建立邏輯聯系?通過前節點next指針指向下一個節點,建立邏輯聯系NULL10.4.1鏈表知識點//在第position個位置處插入數據newData,position從1開始計數Node*insertLink(Node*head,intnewData,intposition){ //因為插入數據時,需要知道插入位置的前一個節點,定義p為前一個節點指針
Node*p=head,*newNode; inti=1; //先找到插入位置的前一個節點
while(i<position){ p=p->next;if(p==NULL){printf("插入位置無效\n");returnhead;}i++; } //找到插入位置,此時p為插入位置的前一個節點
newNode=(Node*)malloc(sizeof(structnode)); newNode->data=newData; newNode->next=p->next; p->next=newNode; returnhead;}(4)單向鏈表的插入,代碼段
頭節點的存在,不管新插入的節點,是在首元節點前、還是中間的位置,還是在尾節點后,操作步驟都是一樣的。10.4.1鏈表知識點(5)單項鏈表的遍歷從鏈表頭開始,依次訪問單向鏈表中的每個節點,并將節點的數據值輸出,直到鏈表尾。鏈表的基本操作head84299047NULLp
voiddisplayLink(Node*head){ Node*p=head->next;//p指向首元節點
while(p!=NULL){//當p不為空,則沒有到達鏈表尾
printf("%d",p->data); p=p->next; }
printf("\n");}10.4.1鏈表知識點(6)單項鏈表的刪除假設其前驅節點為A節點,則對C節點的刪除,需要三步操作步驟:①遍歷單向鏈表,找到需要刪除的節點C,并記錄前驅節點A。②A節點的next指針指向C節點的next指針③刪除C節點鏈表的基本操作head8429A結點9047頭結點35C結點第一步第二步NULL第②、③步能顛倒嗎?第三步不能!10.4.1鏈表知識點//刪除鏈表中數據值為delData的節點。voiddelNode(Node*head,intdelData){ Node*p=head,*curNode=head->next;//curNode指向首元節點
while(curNode!=NULL){ if(delData==curNode->data){//此時p指向A節點,curNode指向C節點 p->next=curNode->next; free(curNode); curNode=p->next; }else{ p=curNode; curNode=p->next; } }}(6)單向鏈表的刪除,代碼段
10.4.1鏈表知識點(7)單向鏈表的查找遍歷單向鏈表的過程中,比較某個節點的值是否和被查找數據一致,直到找到或者遍歷到鏈表尾(某個節點NULL)結束。鏈表的基本操作//在鏈表中查找數據值為needData的節點,找到了則返回該節點的地址,否則返回NULLNode*searchNode(Node*head,intneedData){ Node*p=head,*curNode=head->next;//p指向首元節點
while(curNode!=NULL){ if(needData==curNode->data){ returncurNode; } p=curNode; curNode=p->next; } returnNULL;}10.4.1鏈表知識點(8)單向鏈表的修改鏈表的基本操作/*在鏈表中查找數據值為oldData的節點,找到后修改成newData,找到了則返回該節點的地址,否則返回NULL*/Node*modifyNode(Node*head,intoldData,intnewData){ Node*p=head,*curNode=head->next; while(curNode!=NULL){ if(oldData==curNode->data){ curNode->data=newData; returncurNode; } p=curNode; curNode=p->next; } returnNULL;}10.4.1鏈表知識點
為了確保開發的程序不會存在內存泄露,需用free釋放每個節點的空間。需要2步操作步驟:①從首元節點curNode開始往后逐個刪除。②頭節點指針域置為NULL。(此處不刪除頭結點,等鏈表不再使用時刪除頭結點)鏈表的基本操作head8429首元結點curNode9047頭結點35B結點第一步NULL(9)單向鏈表的整個刪除q第二步10.4.1鏈表知識點//刪除整個鏈表的代碼voiddelList(Node*head){ Node*q,*curNode=head->next; while(curNode){ q=curNode->next; free(curNode); curNode=q; }head->next=NULL;}(9)單向鏈表的整個刪除,代碼段
10.4.1鏈表案例分析案例10.4.1用鏈表結構來存儲候選人信息,根據學號查看某個候選人的信息,再修改指定候選人的票數。要求:輸入候選人的信息,包括學號、姓名、班級、得票數,直到輸入一個-1結束輸入。再輸入一個候選人學號,編寫函數,查詢該候選人的信息,發現該候選人的票數不對,再根據這個候選人的學號修改其得票數。#include<stdio.h>#include<stdlib.h>structcandidate{ charname[10]; intno; chargrade[20]; intvotes; structcandidate*next;};typedefstructcandidateCandidate;Candidate*createLink();voiddisplayLink(Candidate*head);Candidate*modifyNode(Candidate*head,intno,intvotes);Candidate*searchNode(Candidate*head,intno);voiddeleteLink(Candidate*head);intmain(){ intno,votes; Candidate*p=NULL; Candidate*head=createLink(); displayLink(head); printf("請輸入要查詢的候選人的學號"); scanf("%d",&no); p=searchNode(head,no);//根據學號查詢候選人信息 if(p==NULL){ printf("這個候選人不存在!"); }else{//p中保存的是被修改的候選人的地址 printf("查詢到的候選人信息如下:\n"); printf("%d%s%s%d\n",p->no,p->name,p->grade,p->votes); } printf("請輸入擬修改候選人的信息:學號及票數:"); scanf("%d%d",&no,&votes); p=modifyNode(head,no,votes);//根據學號修改票數,并返回被修改的節點的地址 if(p==NULL){ printf("這個候選人不存在!"); }else{//p中保存的是被修改的候選人的地址 printf("修改后的候選人信息如下:\n"); printf("%d%s%s%d\n",p->no,p->name,p->grade,p->votes); } displayLink(head); deleteLink(head); free(head); return0;}10.4.1鏈表案例分析10.4.1鏈表案例分析Candidate*modifyNode(Candidate*head,intno,intvotes){ Candidate*p=NULL;//p先指向首元節點 Candidate*curNode=head->next; while(curNode!=NULL){ //判斷當前節點的學號是否為要查找的學號 if(curN
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 留守兒童感恩教育主題班會
- 肺癌的診斷與鑒別診斷
- 速遞網點裝修人工協議
- 銀行裝修環保驗收報告
- 珠寶玉石運輸保險協議
- 營銷團隊入職培訓
- 美術興趣課程課件
- 腸外營養配置規范
- 鋼材采購合同模板范本
- 2024泰州市姜堰區江淮職業高級中學工作人員招聘考試及答案
- 湖南省常德市2025屆高三下學期模擬考試(二模)物理試卷(含答案)
- 甘肅省招聘衛生健康人才筆試真題2024
- 高鐵站裝飾裝修施工方案
- 防臺防汛管理制度
- 消防器材(滅火器)檢查及記錄表
- 2012小小科學家高年級試題生物
- 廣電運通研究報告:數字人民幣促產業升級-AI+城市助業務轉型
- 移動式腳手架安全操作規程
- 永輝超市企業文化ppt課件
- 多肉生石花圖譜_版
- 送達地址確認書(法院最新版)
評論
0/150
提交評論