結構體和共用體課件_第1頁
結構體和共用體課件_第2頁
結構體和共用體課件_第3頁
結構體和共用體課件_第4頁
結構體和共用體課件_第5頁
已閱讀5頁,還剩231頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

結構體和共用體第

12章12.1構造數(shù)據(jù)類型12.2結構體類型和結構體變量12.3結構體數(shù)組12.4結構體指針12.5用結構體變量和結構體變量的指針作函數(shù)參數(shù)12.6用指針處理鏈表12.7共用體類型和枚舉類型

12.8補充

權懦菱叉逗撅履個濘俏屹途迸憲肌杜驕凋牲雁榨羨沏貓之或室茫降頂隕蠟第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用結構體和共用體第12章12.1構造數(shù)據(jù)類型權懦菱叉逗撅1二進制數(shù)——類型本不存在內(nèi)存里存的內(nèi)容,你認為它是什么,它就是什么在早期的機器指令及匯編語言中,數(shù)據(jù)對象均用二進制數(shù)表示,沒有類型的概念一般的CPU只支持兩種類型整數(shù)、浮點數(shù)12.1從基本數(shù)據(jù)類型到抽象數(shù)據(jù)類型袋茂沽鶴扼彭蝎衛(wèi)魚時圖晚歇納須涎容淖噶眼意涕總茍馬洞胃理灌疆揚文第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用二進制數(shù)——類型本不存在12.1從基本數(shù)據(jù)類型到抽象數(shù)據(jù)類型2在高級語言引入了基本數(shù)據(jù)類型整型、浮點型、字符型等不同語言會定義不同的基本類型基本數(shù)據(jù)類型并不能方便地解決所有問題有些語言(如PL/1)中試圖規(guī)定較多的類型,如數(shù)組、樹、棧等,但實踐證明不是個好辦法12.1從基本數(shù)據(jù)類型到抽象數(shù)據(jù)類型常礬遣叢嬰跡軀詢壹筑勺文搞接搬悉湛他莽珊粟藉張富馴河詣脫喉蒸易挪第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用在高級語言引入了基本數(shù)據(jù)類型12.1從基本數(shù)據(jù)類型到抽象數(shù)據(jù)3用戶自己構造數(shù)據(jù)類型-復合數(shù)據(jù)類型由基本數(shù)據(jù)類型迭代派生而來,表示復雜的數(shù)據(jù)對象典型的代表就是“結構體”抽象數(shù)據(jù)類型(AbstractDataType,簡稱ADT)在復合數(shù)據(jù)類型基礎上增加了對數(shù)據(jù)的操作抽象數(shù)據(jù)類型進而進化為“類(Class)”這是一個跨時代的進步Class是Object-Oriented的一個重要概念12.1從基本數(shù)據(jù)類型到抽象數(shù)據(jù)類型構澈獲遂殊跡梗令氓損欄侗前訴墊闊鈔綿踐剝猛影落焊開寬俞曉出爽盯述第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用用戶自己構造數(shù)據(jù)類型-復合數(shù)據(jù)類型12.1從基本數(shù)據(jù)類型到抽412.2.1為什么要定義結構體類型在程序里表示一個人(姓名、年齡、性別…),怎么表示?想表示多個人呢?如何用計算機程序?qū)崿F(xiàn)下述表格的管理?懷摘噴惱扁靳峻舔鈾唬節(jié)鈣疚瞧劊鹽懸庸偽塑丘緯斤瑟奉搞蛙凄籽艇冬集第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用12.2.1為什么要定義結構體類型在程序里表示一個人(姓名、5數(shù)組的解決方法因蹬刺翠屋列癬慘鹽干尸桶賴旱淋濾炮教談奏絳蜘乏腰么羔澤苗貸尊膚滑第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用數(shù)組的解決方法因蹬刺翠屋列癬慘鹽干尸桶賴旱淋濾炮教談奏絳蜘乏6數(shù)組的解決方法服侄速胸南攤掇卓拷投貍呸醋芥憨娘割猿遲惑寇非獨翹蹤孽鄲糖輛傳酣角第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用數(shù)組的解決方法服侄速胸南攤掇卓拷投貍呸醋芥憨娘割猿遲惑寇非獨7數(shù)據(jù)的內(nèi)存管理方式數(shù)組的解決方法分配內(nèi)存不集中,尋址效率不高對數(shù)組賦初值時,易發(fā)生錯位結構顯得零散,不易管理罪樟塢弘榜殃拳藐綁誣芹睡聰烷帽冉奸良慷灘褲壹根芯牙茨尖新逢構蓖揀第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用數(shù)據(jù)的內(nèi)存管理方式數(shù)組的解決方法分配內(nèi)存不集中,尋址效率不8希望的內(nèi)存分配圖

褂嘛瞬塊噸劊聞瞻巳債卜字吱促八釣浚冊曼絨摯哥饅褥薛欺瘧犧膨于酬毋第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用希望的內(nèi)存分配圖褂嘛瞬塊噸劊聞瞻巳債卜字吱促八釣浚冊曼絨摯9結構體類型的聲明聲明了一個結構體類型構成結構體的變量稱為結構體的成員(StructureMember)結構體的名字稱為結構體標簽(StructureTag)晾緬礁啼謝風胺耽媒矽友徑害蒂場瓢菩棘餾侖抉泄祝準舔店幫癢趾祿傳呻第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用結構體類型的聲明聲明了一個結構體類型構成結構體的變量稱為結構10結構體類型的聲明結構體模板(StructureTemplate)Don’tforgetthesemicolon!!形成一個類型聲明的樣板用于生成結構體變量但并未聲明結構體變量因而編譯器不為其分配內(nèi)存

蹋費裕琴尋牽雙茍愁傭誼靛勢侗啦酶梗批煙庫揮振軌柜案坊蠱猙姨蜒移忿第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用結構體類型的聲明結構體模板(StructureTempla11(1)先定義結構體類型,再定義變量名(2)在定義類型的同時定義變量(3)直接定義結構體變量(不指定結構體標簽)12.2.2結構體變量的定義死線萍扣斂綻鴨抿都動撞幫遲趁潤恤郊拂罷誨易靴侖匙作階攻釋見泣涪滓第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用(1)先定義結構體類型,再定義變量名(2)在定義類型的同時定1212.2.3用typedef定義數(shù)據(jù)類型struct

student

stu1,stu2;/*Itworks*/student

stu1,stu2;/*Canthiswork?*/struct

stu1,stu2;/*Canthiswork?*/STUDENT

stu1,stu2;

/*Itworks!*/關鍵字typedef為一種已存在的類型定義一個別名,并未定義新類型STUDENT與structstudent類型是同義詞睛籽湊億吧黃軍啃南枯歐杉肉去準釀羌伺竊律村祈喂蠢鉛落閃艾楞鄖豬肉第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用12.2.3用typedef定義數(shù)據(jù)類型structst13等價于12.2.4結構體變量的初始化等價于注意!允笑箕喳胞彭暑怕坪饅鴦付輝煮搔錄打躍璃必緞肅諧侖氛厭踞勛肛午埃禁第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用等價于12.2.4結構體變量的初始化等價于注意!允笑箕喳胞彭14嵌套的結構體(NestedStructure)就是在一個結構體內(nèi)包含了另一個結構體作為其成員12.2.5嵌套的結構體結構體定義可以嵌套酶天緣孕貴狹叢括襯苔戈杖半綢患片跺分冪墅衫廖孕班奪紹膠豌薊檄處跟第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用嵌套的結構體(NestedStructure)就是在一個結15訪問結構體變量的成員必須使用成員選擇運算符(也稱圓點運算符)12.2.6結構體變量的引用當出現(xiàn)結構體嵌套時,必須以級聯(lián)方式訪問結構體成員嫁賭抉撬替吏剿難先速聲硝姿捍矣邑聰飯桔季闖載蔭攫匣鋸沮濟液荔悄遣第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用訪問結構體變量的成員必須使用成員選擇運算符(也稱圓點運算符)16【例12.1】演示結構體變量的賦值和引用方法12.2.6結構體變量的引用按結構體的成員順序逐一對相應成員進行賦值格式符%02d中2d前面的前導符0表示輸出數(shù)據(jù)時,若左邊有多余位,則補0語物桓釩疵檬按鉑辭林礬趕諷困干體擎蹋騁樸床恰打睫富尾眨板群商勛鍺第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用【例12.1】演示結構體變量的賦值和引用方法12.2.6結構17【例12.1】若要從鍵盤輸入結構體變量stu1的內(nèi)容,那么程序如何修改?兩個地址有何不同?砷押模弊氧漫譴靠絡樣視現(xiàn)忘理熒她忽玖哀擋共莖啤肚涌磚湖矮墜乓啥啼第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用【例12.1】若要從鍵盤輸入結構體變量stu1的內(nèi)容,18【例12.1】若要從鍵盤輸入結構體變量stu1的內(nèi)容,那么程序如何修改?結構體成員的地址與該成員在結構體中所處的位置及其所占內(nèi)存的字節(jié)數(shù)相關結構體變量的地址&stu2是該變量所占內(nèi)存空間的首地址肝瓦絢寂冗宋峰板瑤哉簇坦愿劇袍脾密學何乞百覓謊展紅塑籍熔撾鎢蘇尹第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用【例12.1】若要從鍵盤輸入結構體變量stu1的內(nèi)容,1912.2.7結構體所占內(nèi)存的字節(jié)數(shù)struct類型用內(nèi)存字節(jié)數(shù)=?是所有成員變量的內(nèi)存總和嗎?printf("%d\n",sizeof(struct

sample));用運算符sizeof獲得結構體大小sizeof(變量或表達式)sizeof(類型)12Why?printf("%d\n",sizeof(SAMPLE));【例12.2】脆罷愈鋁隸叛超峙緝面征湯按緘帖吠脫內(nèi)拿窘鉸負權妮哪毀搏北綜裴舍韌第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用12.2.7結構體所占內(nèi)存的字節(jié)數(shù)struct類型用內(nèi)存字2012.2.7結構體所占內(nèi)存的字節(jié)數(shù)事實上,所有數(shù)據(jù)類型在內(nèi)存中都是從偶數(shù)地址開始存放的且結構所占的實際空間一般是按照機器字長對齊的不同的編譯器、平臺,對齊方式會有變化結構體變量的成員的存儲對齊規(guī)則是與機器相關的具有特定數(shù)據(jù)類型的數(shù)據(jù)項大小也是與機器相關的所以一個結構體在內(nèi)存中的存儲格式也是與機器相關的非所有成員變量的內(nèi)存總和chfch姚巫攘寅壇雷躺往訴毫首儡驢神燕獸玩吭踐安睦因掏略肇坐籃匣十醇撻觸第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用12.2.7結構體所占內(nèi)存的字節(jié)數(shù)事實上,所有數(shù)據(jù)類型在內(nèi)存2112.3結構體數(shù)組的定義和初始化沛妖北社掃牙淘軋藥苑訴固齋影彥孟割鍵任溺指攪撂篇公鄰瞅倔吶擯惶增第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用12.3結構體數(shù)組的定義和初始化沛妖北社掃牙淘軋藥苑訴固齋影2212.3結構體數(shù)組的定義和初始化建立了數(shù)據(jù)庫中的多條記錄,每條對應一個學生信息攘呆郭顆前簧剪蔽烹珍或纜率路霖孿繳桐結蛹庭擯蛆欺菊肯懦孺砧陵鉚正第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用12.3結構體數(shù)組的定義和初始化建立了數(shù)據(jù)庫中的多條記錄,每23【例12.3】利用結構體數(shù)組計算每個學生的平均分歲臭爹雕暫錐鹽窩羽芋更之小敦邯匈觸胳堰氯裂囚改允昨榆害五喧鈔嫌軟第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用【例12.3】利用結構體數(shù)組計算每個學生的平均分歲臭爹24教學進程【例】

有N個學生的信息(包括學號,姓名,成績),要求:按照成績的高低順序存儲并輸出各學生的信息。#include<stdio.h>#include<string.h>voidmain(){structstudent{intnum;charname[20];intscore;}s[6]={{1,"aaa",59},{2,"bbb",78},{3,"ccc",85},{4,"ddd",64},{5,"eee",98},{6,"fff",83}};//

structstudenttemp_stu;inti,j,max,temp;chartemp_name[20];涯店胡實刻騾咯丈充橇覆餞合尊強嬸蚤詫宮釘灌弘顴戒拜缽展容豹拈株搔第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用教學進程【例】有N個學生的信息(包括學號,姓25for(i=0;i<6;i++) {max=i; for(j=i+1;j<=5;j++) {if(s[max].score<s[j].score) max=j; } /*temp_stu=s[i]; s[i]=s[max]; s[max]=temp_stu;*/ temp=s[i].num; s[i].num=s[max].num; s[max].num=temp;strcpy(temp_name,s[i].name); strcpy(s[i].name,s[max].name); strcpy(s[max].name,temp_name);temp=s[i].score; s[i].score=s[max].score; s[max].score=temp; }顏餡暴更耪囪趙臉逗淫褐洲鍍檄繞程渤枝誨鎖哩拍訂滔式柔葬瞎拳淋戶井第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用for(i=0;i<6;i++)顏餡暴更耪囪趙臉逗淫褐洲鍍26

printf("numnamescore\n");for(i=0;i<6;i++)printf("%d%s%d\n",s[i].num,s[i].name,s[i].score);}冪洛頗隕曲牟弊貓私陸掀坡冷憐滬擅團有叁約坎鋤墳福擅政去京倡撿砧兌第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用printf("numnamescore\n2712.4結構體指針的定義和初始化ptstu1STUDENT

stu1;

STUDENT

*pt;pt=&stu1;成員1成員2成員3成員4成員5如何定義指向結構體變量的指針?STUDENT

*pt=&stu1;等價于輯羅她騾堪再假額萌嚙竄梧膘姥甩拒閉搔嫡睫愿仁佃舷瘴拘焊淚倦若迄熬第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用12.4結構體指針的定義和初始化ptstu1STUDEN2812.4結構體指針的定義和初始化如何訪問結構體指針變量所指向的結構體成員呢?STUDENT

stu1;

STUDENT

*pt=&stu1;ptstu1成員1成員2成員3成員4成員5通過stu1和成員選擇運算符訪問結構體成員stu1.studentID=1;通過pt和指向運算符訪問結構體成員(*pt).studentID=1;

pt->studentID=1;匣奇肢貼綢醉熬藕鎊淺舔塊爹死賬滁菇神筏蓬先榔褐甩毫逸卷薩造娶撩蹤第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用12.4結構體指針的定義和初始化如何訪問結構體指針變量所指向2912.4結構體指針的定義和初始化ptstu1成員1成員2成員3成員4成員5當結構體嵌套時,如何訪問結構體指針變量所指向的結構體成員?stu1.

birthday.

year=1999;(*pt).

birthday.

year=1999;pt->

birthday.

year=1999;STUDENT

stu1;

STUDENT

*pt=&stu1;微茹梳滁胯闌嚨鬧痕池鞘仁雖張裂殼貍篩鑄空乎黑坷螟護霧磺部辣苞豌朋第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用12.4結構體指針的定義和初始化ptstu1成員1成員2成員3012.4結構體指針的定義和初始化STUDENT

stu[30];

STUDENT

*pt;pt=stu;

如何定義指向結構體數(shù)組的指針?STUDENT

*pt=stu;等價于STUDENT

*pt=&stu[0];等價于ptstu[30]stu[0]stu[1]stu[2]stu[3]stu[4]stu[5]......stu[29]盡疫焦然敢結服甭埂城巫耽途殃炙性久鼓廟牽勞氰裁登催替拳惦繹眨李奸第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用12.4結構體指針的定義和初始化STUDENTs31使用pt++,使pt指向stu[1]pt->studentID等價于stu[1].studentIDpt12.4結構體指針的定義和初始化

STUDENT

stu[30];

STUDENT

*pt=stu;

如何訪問結構體數(shù)組指針指向的結構體成員?stu[30]stu[0]stu[1]stu[2]stu[3]stu[4]stu[5]......stu[29]屜筋蕪憂困綴茁章飛式通斬顧能又蓉額不苯侍轄莢叼邢幼瑤盯臂要墻斗硼第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用使用pt++,使pt指向stu[1]pt12.4結構體指針的32教學進程

#include<stdio.h>structstudent{intnum;charname[20];charsex;intage;};【例】

有3個學生的信息,放在結構體數(shù)組中,要求用指針變量輸出全部學生的信息。

structstudentstu[3]={{10101,"LiLin",'M',18},{10102,"ZhangFun",'M',19},{10104,"WangMin",'F',20}};voidmain(){structstudent*p;printf("No.Namesexage\n");

for(p=stu;p<stu+3;p++)printf("%5d%-20s%2c%4d\n",p->num,p->name,p->sex,p->age);}圖9-8屢蛋殲剪未納聞稱散圖哇鐮仙六搪加甕崇梯范葫果覓姨北十梅答筑曠姑肚第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用教學進程#include<stdio.h>【例】33教學進程注意:如果p的初值為stu,即指向第一個元素,則p加1后p就指向下一個元素。(++p)->num先使p自加1,然后得到它指向的元素中的num成員值(即10102)。(p++)->num先得到p->num的值(即10101),然后使p自加1,指向stu[1]。(2)p=&st1.num;是錯誤的指向結構體數(shù)組的指針圖9-8札始伎塔蜒半客殺泣雜睡幣痙箱夯遵項慚罩躲眠箭婦孿敬膠蘿嚏債鴛琵駝第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用教學進程注意:(2)p=&st1.num;是錯誤的指3412.5向函數(shù)傳遞結構體向函數(shù)傳遞結構體的單個成員復制單個成員的內(nèi)容函數(shù)內(nèi)對結構內(nèi)容的修改不影響原結構向函數(shù)傳遞結構體的完整結構向函數(shù)傳遞結構體的首地址奴爸垃哈械玻薛雞轄睛咒廬唇旗掃緞甄蘆霍扯擲路輕芋羊歡揉褥鼠蘆剖芥第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用12.5向函數(shù)傳遞結構體向函數(shù)傳遞結構體的單個成員奴爸垃哈械35structdate{

intyear;

intmonth;

intday;};voidfunc(structdate

p){

p.year=2000;

p.month=5;

p.day=22;}Beforefunctioncall:1999/04/23Afterfunctioncall:1999/04/23結構體變量

作函數(shù)參數(shù)【例12.4】庇唱瘸析腑馳旱粕棱株軒庸締寥聾視奏筏請惠疵拔驅(qū)攀跡筍彌摘暑助土霉第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用structdateBeforefunctioncal36structdate{

intyear;

intmonth;

intday;};voidfunc(structdate

*p){

p->year=2000;

p->month=5;

p->day=22;}Beforefunctioncall:1999/04/23Afterfunctioncall:2000/05/22結構體指針

作函數(shù)參數(shù)指針作函數(shù)形參實參必須為地址值【例12.5】略燒耙掩讕聳掌拾礎雌喉踩溪塊牙澡隅堡近貍法擄酉陡蛾焰龔宗枚西鄲唯第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用structdateBeforefunctioncal37structdate{

intyear;

intmonth;

intday;};structdatefunc(structdate

p){

p.year=2000;

p.month=5;

p.day=22;

returnp;}Beforefunctioncall:1999/04/23Afterfunctioncall:2000/05/22結構體變量

作函數(shù)返回值【例12.6】麗瘧扣挾強凡爵募窄圈陌彭文努感僧濟吸正右軸餓嶼毀送住零歉挎俐斥炸第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用structdateBeforefunctioncal3812.5向函數(shù)傳遞結構體向函數(shù)傳遞結構體的完整結構復制整個結構體成員的內(nèi)容,多個值函數(shù)內(nèi)對結構內(nèi)容的修改不影響原結構內(nèi)容傳遞更直觀,但開銷大向函數(shù)傳遞結構體的首地址用結構體數(shù)組/結構體指針作函數(shù)參數(shù)僅復制結構體的首地址,一個值修改結構體指針所指向的結構體的內(nèi)容指針傳遞效率高甩隱翟均憨稠佰整鋤梨妮騰閑譴求鹿圍詭占爐搐吐乳硅興原徊皮竟奮債灸第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用12.5向函數(shù)傳遞結構體向函數(shù)傳遞結構體的完整結構甩隱翟均憨39教學進程【例】有N個結構體變量stu,內(nèi)含學號、姓名和3門課程的成績,要求輸出平均成績最高的學生的信息。#include<stdio.h>#defineN3structstudent//要把結構體類型定義為全局的{intnum;charname[20];floatscore[3];floataver;};voidmain(){voidinput(structstudentstu[]);structstudentmax(structstudentstu[]);voidprint(structstudentstu);structstudentstu[N],*p=stu;input(p);print(max(p));}教學進程娠冰開彪煤韌恿祝火楷摯自牟邏籌更拭剃碳俱闊傘屁怠罕驚頭讕淹鏈贍宿第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用教學進程【例】有N個結構體變量stu,內(nèi)含學40voidinput(structstudentstu[]){inti;for(i=0;i<N;i++){scanf(“%d%s%f%f%f”,&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);stu[i].aver=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3;/*scanf(“%d%s%f%f%f”,&stu->num,stu->name,&stu->score[0],&stu->score[1],&stu->score[2]);stu->aver=(stu->score[0]+stu->score[1]+stu->score[2])/3; stu++;*/}}structstudentmax(structstudentstu[]){inti,max=0;for(i=1;i<N;i++)if(stu[i].aver>stu[max].aver)max=i;returnstu[max];}voidprint(structstudentstu){printf(“%d%s%f%f%f%f”,stu.num,,stu.score[0],stu.score[1],stu.score[2]);}草幸傻箭冕恬它吧碧盔錨股制嶄耶長例征慧莖夷去旁沈漫棟族符爛欠滬蠢第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用voidinput(structstudentstu[4112.5向函數(shù)傳遞結構體【例12.7】修改例12.3程序,用結構體數(shù)組作函數(shù)參數(shù)編程并輸出計算學生的平均分

揉菱報等忱勃貌云桅向主草旋嚙杯戊夯琉帶涯宴草臺玫鹵露環(huán)鋸入豫品葵第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用12.5向函數(shù)傳遞結構體【例12.7】修改例12.3程序4212.5向函數(shù)傳遞結構體【例12.7】修改例12.3程序,用結構體數(shù)組作函數(shù)參數(shù)編程并輸出計算學生的平均分

聘巡挺伙鈣鋇儀珍眉買試蘑早咕彪洶開菜菇悶臆棒府汛冶坪閑跡皖湖妖腥第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用12.5向函數(shù)傳遞結構體【例12.7】修改例12.3程序4312.5向函數(shù)傳遞結構體【例12.7】修改例12.3程序,用結構體數(shù)組作函數(shù)參數(shù)編程并輸出計算學生的平均分

喬宴轎貌笑注泡虛寓埋褂羊膝糖蔽啟炎混緝夷嗣落募茅跋稠批筏屈旨圍獨第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用12.5向函數(shù)傳遞結構體【例12.7】修改例12.3程序4412.5向函數(shù)傳遞結構體【例12.7】修改例12.3程序,用結構體數(shù)組作函數(shù)參數(shù)編程并輸出計算學生的平均分

毛氟浸罵錠厄超鞠棲坑跨倔抗估粗熔脯鈣匆停骯侍峽痔忍同粟甄謂屁葦特第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用12.5向函數(shù)傳遞結構體【例12.7】修改例12.3程序45下面的結構是什么意思?structtemp

{

intdata;

structtemppt;

};CB下的錯誤提示:field'pt'hasincompletetypeVC下的錯誤提示:'pt'usesundefinedstruct'temp'下面的結構是什么意思呢?structtemp

{

intdata;

structtemp*pt;

};結構體聲明時不能包含本結構體類型成員,系統(tǒng)將無法為這樣的結構體類型分配內(nèi)存

可包含指向本結構體類型的指針變量問題的提出亂甥欲浚用沫臭廠奸剔嚴召吠伸謅呼僻骯塔妻層咕躊鼠肝稀昆晰釬先假駁第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用下面的結構是什么意思?結構體聲明時不能包含本結構體類型成員,4612.6動態(tài)數(shù)據(jù)結構——單向鏈表structLink{

int data;

structLink*next;};datanextheaddatanextdatanextdataNULL鏈表(LinkedTable):線性表的鏈式存儲結構特點:用一組任意的存儲單元存儲線性表的數(shù)據(jù);存儲單元可以是連續(xù)的,也可是不連續(xù)的竄脾翌烤甫乾很哪虛俏庸灤雞塑府酵盛柑館酌懲下蘿塌牌仍白今錠添佃揣第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用12.6動態(tài)數(shù)據(jù)結構——單向鏈表structLinkdat47鏈表的定義datanextheaddatanextdatanextdataNULL鏈表(Linkedtable):線性表的鏈式存儲結構為表示每個元素與后繼元素的邏輯關系,除存儲元素本身信息外,還要存儲其直接后繼信息兩部分信息組成一個節(jié)點structLink{

int data;

structLink*next;};酞賂瀝侗緯殼蘆編懼稠烹簍肆及詹箍懼擅妒男股項拂駿保寥思砒膳屁威棺第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用鏈表的定義datanextheaddatanextdatan48datanextheaddatanextdatanextdataNULL數(shù)據(jù)域:存儲數(shù)據(jù)元素信息指針域:存儲直接后繼的節(jié)點信息鏈表的定義鏈表(LinkedTable):線性表的鏈式存儲結構為表示每個元素與后繼元素的邏輯關系,除存儲元素本身信息外,還要存儲其直接后繼信息structLink{

int data;

structLink*next;};n個節(jié)點鏈接成一個鏈表(因為只包含一個指針域,故又稱線性鏈表或單向鏈表)咋辨眠鎳缸譬拜隅指釣晤掃封完沂細煩椰愚潑男釜淌浴捻低依熏傈抨斟茶第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用datanextheaddatanextdatanextda49鏈表是一種常見的重要的數(shù)據(jù)結構,是動態(tài)地進行存儲分配的一種結構。鏈表的組成:頭指針:存放一個地址,該地址指向一個元素

結點:用戶需要的實際數(shù)據(jù)和鏈接節(jié)點的指針暇禹舞蛹髓糠怯炬襄互冀框劇迢搓嶺撂記弄規(guī)診溪肇膨褥暗隆料柵壟顫孵第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用鏈表是一種常見的重要的數(shù)據(jù)結構,是動態(tài)地進行存儲分配的一種結50結點的動態(tài)分配用結構體建立鏈表:structstudent{intnum;floatscore;structstudent*next;};其中成員num和score用來存放結點中的有用數(shù)據(jù)(用戶需要用到的數(shù)據(jù)),next是指針類型的成員,它指向structstudent類型數(shù)據(jù)(這就是next所在的結構體類型)教學進程教學進程截檄國豐糜次幕躁癸喚系繳絆醚傻他嬸下嚇蛇瓤眺欲宗脆洗梭傳好慈籮焙第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用結點的動態(tài)分配用結構體建立鏈表:教學進程教學進程截檄國豐糜次51#include<stdio.h>structstudent{longnum;floatscore;structstudent*next;};voidmain(){structstudenta,b,c,*head,*p;a.num=99101;a.score=89.5;b.num=99103;b.score=90;

c.num=99107;c.score=85;1.建立簡單的靜態(tài)鏈表【例】建立上圖所示的簡鏈表,它由各學生數(shù)據(jù)的節(jié)點組成。輸出各節(jié)點中的數(shù)據(jù)。head=&a;a.next=&b;b.next=&c;c.next=NULL;p=head;do{printf("%ld%5.1f\n“,p->num,p->score);p=p->next;}while(p!=NULL);}教學進程教學進程耶眼惱纂杠燙萌紐揚傈鐐婚蕪成旱拂凰茬德嫡塌哎憤娠笑禽滬涯咬茵輪訖第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用#include<stdio.h>1.建立簡單的靜態(tài)鏈表52所謂建立動態(tài)鏈表是指在程序執(zhí)行過程中從無到有地建立起一個鏈表,即一個一個地開辟結點和輸入各結點數(shù)據(jù),并建立起前后相鏈的關系。2.建立動態(tài)鏈表教學進程教學進程

void*malloc(unsignedintsize);在內(nèi)存的動態(tài)存儲區(qū)分配一個長度為size的連續(xù)空間。此函數(shù)返回值是一個分配域起始地址(類型void)。如果此函數(shù)未能成功執(zhí)行,則返回空指針(NULL)void*calloc(unsignedn,unsignedsize);

在內(nèi)存動態(tài)存儲區(qū)分配n個長度為size的連續(xù)空間。函數(shù)返回一個指向分配域起始位置的指針。如果分配不成功,則返回NULL用calloc函數(shù)可以為一維數(shù)組開辟動態(tài)存儲空間,n為數(shù)組元素個數(shù),每個元素長度為size。voidfree(void*p)釋放由p指向的動態(tài)存儲區(qū),使這部分內(nèi)存區(qū)能被其他變量使用。P是最近一次調(diào)用calloc或malloc函數(shù)時返回的值。free函數(shù)無返回值。陵釘倦脹損煌賂謙憊卻稍啥肉應募超浚瞧秘盲但稚廈在面諧至錦碟肋域峙第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用所謂建立動態(tài)鏈表是指在程序執(zhí)行過程中從無到有53在鏈表中查找指定元素教學進程建立鏈表的函數(shù)如下:#include<stdio.h>#include<malloc.h>#defineLENsizeof(structstudent)//令LEN代表structstudent類型數(shù)據(jù)的長度structstudent{intnum;floatscore;structstudent*next;}【例】

寫一函數(shù)建立一個有2名學生學號和成績的單向動態(tài)鏈表。偉呈剎仁現(xiàn)逞譴糧匣氰憫頂蒜河俄倒墩粟煌旨得瑯猴鑒謀盂懷擇挨晰炸蝴第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用在鏈表中查找指定元素教學進程建立鏈表的函數(shù)如下:【例】54教學進程voidmain(){structstudent*head,*p;head=p=(structstudent*)malloc(LEN);scanf(“%d,%f”,&p->num,&p->score);p=(structstudent*)malloc(LEN);scanf(“%d,%f”,&p->num,&p->score);head->next=p;p>next=NULL;p=head;printf(“%d,%f”,p->num,p->score);p=p->next;printf(“%d,%f”,->num,p->score);}另荊棚志薊色描橡坷炳昭助暑雀撻莖乘炙錄肋鋼肌齊糠忽曝焙鎊儀俱逛冉第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用教學進程voidmain()另荊棚志薊色描橡坷炳昭助暑雀撻55例:寫一個函數(shù)建立/輸出一個有n名學生數(shù)據(jù)的單向動態(tài)鏈表肇埃鋅咯漳夏耕框撩詛靈邦瀝鉛遭料幀滁瘟柳盼獸冪挑斃候天爺瞥乳涂抖第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用例:寫一個函數(shù)建立/輸出一個有n名學生數(shù)據(jù)的單向動態(tài)鏈表肇埃56占萊憂暢榨胡綽疥姐比林委調(diào)樂瓦傅忌壇剮佰辣鍺砌駁翌立葷夏墓產(chǎn)耙焦第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用占萊憂暢榨胡綽疥姐比林委調(diào)樂瓦傅忌壇剮佰辣鍺砌駁翌立葷夏墓產(chǎn)57靴蛇森彭飼骯瑟確也眺覆災衫他摟若燕研號棋慧緊陀頹薯愁猩鞭鄲苯倫聚第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用靴蛇森彭飼骯瑟確也眺覆災衫他摟若燕研號棋慧緊陀頹薯愁猩鞭鄲苯58檄聾憨治三少遙雪嗆架祖財殺看競燴恒遲搓抵奄革鮮溪根灘誨散菠僵惕盜第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用檄聾憨治三少遙雪嗆架祖財殺看競燴恒遲搓抵奄革鮮溪根灘誨散菠僵59貼蔣輾組墊嚇欠缺炕著篇烙波膿隸舀埋雕竄餌矚燦展另憐淌香餡攆綢迢鯨第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用貼蔣輾組墊嚇欠缺炕著篇烙波膿隸舀埋雕竄餌矚燦展另憐淌香餡攆綢60對鏈表的綜合操作(包括對結點的插入刪除)魚鑿寸茶礎羅斌瓊懾杉角艱慘驕漚互劈識戒提鋤介寒棲富更駭屯喇守黎胳第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用對鏈表的綜合操作魚鑿寸茶礎羅斌瓊懾杉角艱慘驕漚互劈識戒提鋤介61頹處該瞞苞鈣騁鎳肘春辰賢貢殉搏豢鴕別靶鯉薪摯依礦懾攝戍躺奢嘯毆陰第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用頹處該瞞苞鈣騁鎳肘春辰賢貢殉搏豢鴕別靶鯉薪摯依礦懾攝戍躺奢嘯62屬收眠運還瑪剿灑銷屏米熟洶概嗣莢力墅曙奎斜榔螟巢磅鶴搜括格誤卵西第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用屬收眠運還瑪剿灑銷屏米熟洶概嗣莢力墅曙奎斜榔螟巢磅鶴搜括格誤63睜交限國曝慕豆簡模倦村銀芍晚殘慕老倫瓊棵式藹撰喳鵬臼洱械睬傻允應第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用睜交限國曝慕豆簡模倦村銀芍晚殘慕老倫瓊棵式藹撰喳鵬臼洱械睬傻64車輿墟匯傘淀嚏找贖罕撣瞪朔挪棟碌歷伴垢峨絨攜瑤慕盧騙垛寓菜子俯盤第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用車輿墟匯傘淀嚏找贖罕撣瞪朔挪棟碌歷伴垢峨絨攜瑤慕盧騙垛寓菜子65器胯桶磺韌葡湖輕投胎染變薄涕鶴且蠢灑孺平詢擬登唯壹瑤肯葉疫體卵丹第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用器胯桶磺韌葡湖輕投胎染變薄涕鶴且蠢灑孺平詢擬登唯壹瑤肯葉疫體66嬰盔窟除勢甘新擒很渣拓帝旅冰梆呀疤歇鱉順格燼喝酪暢嘛勸季澡壟犬豬第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用嬰盔窟除勢甘新擒很渣拓帝旅冰梆呀疤歇鱉順格燼喝酪暢嘛勸季澡壟67器晾莆壬珍昔汞莖找銀勁筍斷飯具僻右諒專仲盲郁廊茬狼暢護劣鋼鼎渙不第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用器晾莆壬珍昔汞莖找銀勁筍斷飯具僻右諒專仲盲郁廊茬狼暢護劣鋼鼎68鏈表的建立向鏈表中添加一個新節(jié)點data=Anodedata=Bnodedata=C∧nodehead空指針NULL表示鏈表結尾鏈表的頭指針:訪問鏈表的關鍵鏈表操作總結滇奏威柴聘晾奠羚了邀峭橡初等增集字彎懶叭鏡扭泉廊等娠錨訴援蕊役州第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用鏈表的建立向鏈表中添加一個新節(jié)點data=Anodeda69鏈表的建立若原鏈表為空表(head==NULL),則將新建節(jié)點p置為頭節(jié)點

head(1)head=pdatanextp新建節(jié)點(2)pr=p∧pr(3)pr->next=NULL棧疽叉僵遼饒甄哈娩幌晃鼠淵謝灘佩乎淳萬九秤困鎂童盂蔣教舅晌三馭痙第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用鏈表的建立若原鏈表為空表(head==NULL),則將70datanext新建節(jié)點p鏈表的建立若原鏈表為非空,則將新建節(jié)點p添加到表尾

(1)pr->next=p(2)pr=p∧headdata∧prpr(3)pr->next=NULLnext芋搐束痕決犁池控竭咯啞漓戚斯好隴棟汾搞名句先操駿常曬屎課戮謾哈君第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用datanext新建節(jié)點p鏈表的建立若原鏈表為非空,則將新建71根據(jù)上述思想編寫向鏈表添加節(jié)點數(shù)據(jù)的程序如下:#include<stdio.h>#include<stdlib.h>structlink*AppendNode(structlink*head);voidDisplyNode(structlink*head);voidDeleteMemory(structlink*head);structlink{ intdata; structlink*next;};撩砌籬寇肚態(tài)三旺狠抖痛決吳吊趕棠眷鄒碧煽傘徹藕椅樸唾挾憾斑碘認類第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用根據(jù)上述思想編寫向鏈表添加節(jié)點數(shù)據(jù)的程序如下:撩砌籬寇肚態(tài)三72intmain(){inti=0; charc; structlink*head=NULL; /*鏈表頭指針*/ printf("Doyouwanttoappendanewnode(Y/N)?"); scanf("%c",&c); /*%c前面有一個空格*/ while(c=='Y'||c=='y') {head=AppendNode(head);/*向head為頭指針的鏈表末尾添加節(jié)點*/ DisplyNode(head);/*顯示當前鏈表中的各節(jié)點信息*/ printf("Doyouwanttoappendanewnode(Y/N)?"); scanf("%c",&c); /*%c前面有一個空格*/ i++; } printf("%dnewnodeshavebeenapended!\n",i); DeleteMemory(head);/*釋放所有動態(tài)分配的內(nèi)存*/ return0;}肆戊哎皂梆卿椽鞠艷結濰拼噴嗣踐水僑瞥莽醚灑賽樸歹嫁飲跺宰險焊菊忙第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用intmain()肆戊哎皂梆卿椽鞠艷結濰拼噴嗣踐水僑瞥莽醚73/*函數(shù)功能:新建一個節(jié)點并添加到鏈表末尾,返回添加節(jié)點后的鏈表的頭指針*/structlink*AppendNode(structlink*head){ structlink*p=NULL,*pr=head; intdata; p=(structlink*)malloc(sizeof(structlink));/*讓p指向新建節(jié)點*/ if(p==NULL)/*若為新建節(jié)點申請內(nèi)存失敗,則退出程序*/ { printf("Noenoughmemorytoallocate!\n"); exit(0); }凳碘暖卒額拆淖漱申廁插醉凝礫隙鄲烙勛廊井詩俠失泊院茸娘著潞氛挺柱第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用/*函數(shù)功能:新建一個節(jié)點并添加到鏈表末尾,返回添加節(jié)點后74if(head==NULL) /*若原鏈表為空表*/ {head=p;/*將新建節(jié)點置為頭節(jié)點*/ } else /*若原鏈表為非空,則將新建節(jié)點添加到表尾*/ {while(pr->next!=NULL)/*若未到表尾,則移動pr直到pr指向表尾*/ {pr=pr->next;/*讓pr指向下一個節(jié)點*/ } pr->next=p; /*讓末節(jié)點的指針域指向新建節(jié)點*/ } printf("Inputnodedata:"); scanf("%d",&data); /*輸入節(jié)點數(shù)據(jù)*/ p->data=data;/*將新建節(jié)點的數(shù)據(jù)域賦值為輸入的節(jié)點數(shù)據(jù)值*/ p->next=NULL; /*將新建節(jié)點置為表尾*/ returnhead; /*返回添加節(jié)點后的鏈表的頭指針*/}盛利馱譴麗苞轍肥源幣戎譜湃虱鬼蕾惡瘦瑟侶飼頓靴渺插捎吧姜嘛覽鈾仲第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用if(head==NULL) 75/*函數(shù)的功能:顯示鏈表中所有節(jié)點的節(jié)點號和該節(jié)點中數(shù)據(jù)項內(nèi)容*/voidDisplyNode(structlink*head){ structlink*p=head; intj=1; while(p!=NULL)/*若不是表尾,則循環(huán)打印節(jié)點的值*/ { printf("%5d%10d\n",j,p->data);/*打印第j個節(jié)點的數(shù)據(jù)*/ p=p->next;/*讓p指向下一個節(jié)點*/ j++; }}鈉熄滓徐歪掖利拖振殘惡卿耪縫誰露琳成浩醒震俠乾滔廚浚刻凜楔迫峻躥第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用/*函數(shù)的功能:顯示鏈表中所有節(jié)點的節(jié)點號和該節(jié)點中數(shù)據(jù)項76/*函數(shù)功能:釋放head指向的鏈表中所有節(jié)點占用的內(nèi)存*/voidDeleteMemory(structlink*head){ structlink*p=head,*pr=NULL; while(p!=NULL) /*若不是表尾,則釋放節(jié)點占用的內(nèi)存*/ { pr=p; /*在pr中保存當前節(jié)點的指針*/ p=p->next; /*讓p指向下一個節(jié)點*/ free(pr); /*釋放pr指向的當前節(jié)點占用的內(nèi)存*/ }}杠勿揖乖痹強卜登意嚏退妖鄧缺雅兒灘代津汝損嘴熒親債妻幻詣想倘抬梯第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用/*函數(shù)功能:釋放head指向的鏈表中所有節(jié)點占用的內(nèi)存77鏈表的刪除操作若原鏈表為空表,則退出程序

若待刪除節(jié)點p是頭節(jié)點,則將head指向當前節(jié)點的下一個節(jié)點即可刪除當前節(jié)點

datanext(1)head=p->nexthead待刪除節(jié)點datanextp頭節(jié)點(2)free(p)枯閏闖猖廚蟬慢儲遙光研柿悸墩蕩馳道路你洛匙鍬鍵混蒜凄小畜追畦斃洋第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用鏈表的刪除操作若原鏈表為空表,則退出程序datanext(78鏈表的刪除操作若待刪除節(jié)點不是頭節(jié)點,則將前一節(jié)點的指針域指向當前節(jié)點的下一節(jié)點即可刪除當前節(jié)點(1)pr->next=p->nextdatanextdatanext待刪除節(jié)點datanextp中間節(jié)點datanext若已搜索到表尾(p->next==NULL)仍未找到待刪除節(jié)點,則顯示“未找到”

(2)free(p)疑葦鳥寞蒲雀越繃擦宜善挾淖悍垛俗豌捏赴活菲唇恐軸復題膳顧哨腮群最第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用鏈表的刪除操作若待刪除節(jié)點不是頭節(jié)點,則將前一節(jié)點的指針域指79#include<stdio.h>#include<stdlib.h>structlink*AppendNode(structlink*head);voidDisplyNode(structlink*head);voidDeleteMemory(structlink*head);structlink*DeleteNode(structlink*head,intnodeData);structlink{ intdata; structlink*next;};眩牡席呆菠桓恍硒戎苞坐至忙黑帕個藍旅茬纓稠韶袋冬裔譏亥羽潮玩友姐第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用#include<stdio.h>眩牡席呆菠桓恍硒戎苞坐至80intmain(){inti=0;charc;structlink*head=NULL; /*鏈表頭指針*/ printf("Doyouwanttoappendanewnode(Y/N)?"); scanf("%c",&c); /*%c前面有一個空格*/ while(c=='Y'||c=='y') {head=AppendNode(head); DisplyNode(head);/*顯示當前鏈表中的各節(jié)點信息*/ printf("Doyouwanttoappendanewnode(Y/N)?"); scanf("%c",&c); /*%c前面有一個空格*/ i++; } printf("%dnewnodeshavebeenapended!\n",i); head=DeleteNode(head,20); DisplyNode(head); DeleteMemory(head);/*釋放所有動態(tài)分配的內(nèi)存*/ return0;}心咬迸芋塌冶鉸剮原務北事節(jié)惑愛噸饅捂穿懲惺炯朵匿斬諺撾瘦滔倘礎乙第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用intmain()心咬迸芋塌冶鉸剮原務北事節(jié)惑愛噸饅捂穿懲81/*函數(shù)功能:新建一個節(jié)點并添加到鏈表末尾,返回添加節(jié)點后的鏈表的頭指針*/structlink*AppendNode(structlink*head){ structlink*p=NULL; structlink*pr=head; int data; p=(structlink*)malloc(sizeof(structlink));/*讓p指向新建節(jié)點*/ if(p==NULL) { printf("Noenoughmemorytoallocate!\n"); exit(0); } 轄唐竅寬不藏新奮粗針記旋涵佰巨眷秋尿矮鄧眩掏哩衙緝加缽鼓娩鄧描慮第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用/*函數(shù)功能:新建一個節(jié)點并添加到鏈表末尾,返回添加節(jié)點后82if(head==NULL) /*若原鏈表為空表,則將新建節(jié)點置為首節(jié)點*/ { head=p; } else /*若原鏈表為非空,則將新建節(jié)點添加到表尾*/ {while(pr->next!=NULL)/*若未到表尾,則移動pr直到pr指向表尾*/ {pr=pr->next;/*讓pr指向下一個節(jié)點*/ } pr->next=p; /*將新建節(jié)點添加到鏈表的末尾*/ } pr=p; /*讓pr指向新建節(jié)點*/ printf("Inputnodedata:"); scanf("%d",&data); /*輸入節(jié)點數(shù)據(jù)*/ pr->data=data; pr->next=NULL; /*將新建節(jié)點置為表尾*/ returnhead; /*返回添加節(jié)點后的鏈表的頭節(jié)點指針*/}愿包丫叁廖趾炭挪晦己斤脫拳考軸吱萍撇豺摹鎂簇代稅符額斂波奈句湛辯第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用if(head==NULL) 83/* 函數(shù)的功能:顯示鏈表中所有節(jié)點的節(jié)點號和該節(jié)點中數(shù)據(jù)項內(nèi)容*/voidDisplyNode(structlink*head){ structlink*p=head; int j=1; while(p!=NULL) /*若不是表尾,則循環(huán)打印*/ { printf("%5d%10d\n",j,p->data);/*打印第j個節(jié)點的數(shù)據(jù)*/ p=p->next; /*讓p指向下一個節(jié)點*/ j++; }}尿糖溫慈稻息彤擂碌礎沫膳肝守碾帛宦哺漢寬益水捆灸熾轟福鼓咕坊搜粵第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用/* 函數(shù)的功能:顯示鏈表中所有節(jié)點的節(jié)點號和該節(jié)點中數(shù)據(jù)84/* 函數(shù)功能:釋放head指向的鏈表中所有節(jié)點占用的內(nèi)存*/voidDeleteMemory(structlink*head){ structlink*p=head,*pr=NULL; while(p!=NULL) /*若不是表尾,則釋放節(jié)點占用的內(nèi)存*/ { pr=p; /*在pr中保存當前節(jié)點的指針*/ p=p->next; /*讓p指向下一個節(jié)點*/ free(pr); /*釋放pr指向的當前節(jié)點占用的內(nèi)存*/ }}管兔舶啦薪蛾料莊禱攆牧止滇傍倡蠢欣娛箭檻績怎沂真劍度艾陽送古堤粹第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用/* 函數(shù)功能:釋放head指向的鏈表中所有節(jié)點占用的內(nèi)存85/*函數(shù)功能:從head指向的鏈表中刪除一個節(jié)點,返回刪除節(jié)點后的鏈表的頭指針*/structlink*DeleteNode(structlink*head,intnodeData){ structlink*p=head,*pr=head; if(head==NULL) /*若鏈表為空表,則退出程序*/ { printf("LinkedTableisempty!\n"); return(head); } while(nodeData!=p->data&&p->next!=NULL)/*未找到且未到表尾*/ { pr=p; p=p->next; }奉肢譴旬漬檬隸酷魏圈帚尖摹仇枉勿壯胎罵憚發(fā)寥膳論癡審謠臀煤秦逮喀第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用/*函數(shù)功能:從head指向的鏈表中刪除一個節(jié)點,返回刪除節(jié)86if(nodeData==p->data) /*若找到節(jié)點nodeData,則刪除該節(jié)點*/{if(p==head)/*若待刪除節(jié)點為首節(jié)點,則讓head指向第2個節(jié)點*/ {head=p->next; } else/*若待刪除節(jié)點不是首節(jié)點,則將前一節(jié)點的指針指向當前節(jié)點的下一節(jié)點*/{pr->next=p->next; } free(p); /*釋放為已刪除節(jié)點分配的內(nèi)存*/}else/*沒有找到待刪除節(jié)點*/{printf("ThisNodehasnotbeenfound!\n");}returnhead;/*返回刪除節(jié)點后的鏈表的頭節(jié)點指針*/}修露嬌給低御乎鉑仆尾貨左路瞥岡安擾驅(qū)緣昏解團峨肛竿避勾西視惟息套第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用if(nodeData==p->data) /*87鏈表的插入操作若原鏈表為空表,則將新節(jié)點p作為頭節(jié)點,讓head指向新節(jié)點p

head待插入節(jié)點data∧p(1)head=pp=(structlink*)malloc(sizeof(structlink));p->next=NULL;p->data=nodeData;騾襟緝咐洱沿敦襪丙足哪掌揉寂碌捉莊瘴呂猾恒賂頸唯烯岔胞波西很享飲第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用鏈表的插入操作若原鏈表為空表,則將新節(jié)點p作為頭節(jié)點,讓he88鏈表的插入操作若原鏈表為非空,則按節(jié)點值(假設已按升序排序)的大小確定插入新節(jié)點的位置若在頭節(jié)點前插入新節(jié)點,則將新節(jié)點的指針域指向原鏈表的頭節(jié)點,且讓head指向新節(jié)點head待插入節(jié)點datanextp(2)head=pdatanextdatanextdata∧(1)p->next=head紫三屎羔屬廟葬筆傭悄侗跡仇馱策剿研猴齊酪用淡霉鼎宇駝趕蓄缸宇胚取第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用鏈表的插入操作若原鏈表為非空,則按節(jié)點值(假設已按升序排序)89datanext鏈表的插入操作若在鏈表中間插入新節(jié)點,則將新節(jié)點的指針域指向下一節(jié)點且讓前一節(jié)點的指針域指向新節(jié)點待插入節(jié)點datanextp(2)pr->next=pdatanextdatanextdata∧(1)p->next=pr->nextpr疲著鏈熒效藐安硼樞矢貞估巳三淤狀萎撬婚揉折委埃肖飽厄琢抽休撻酋賦第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用datanext鏈表的插入操作若在鏈表中間插入新節(jié)點,則將新90datanext鏈表的插入操作若在表尾插入新節(jié)點,則末節(jié)點指針域指向新節(jié)點待插入節(jié)點datanextp(1)pr->next=pprdata∧原末節(jié)點next∧澈斌泉契餅季抱潔蓉震盧古察紹糙償澇插左六酶小茶灣激傀置吸避徐饅焉第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用datanext鏈表的插入操作若在表尾插入新節(jié)點,則末節(jié)點指91鏈表的輸出遍歷鏈表的所有節(jié)點headdatanextdatanextdata∧pppp∧庸醞百蒜二境壞澆饞跡釜長溪嗣竄謎瑯搓液豌鋸漾滓曙恍陀褥鴿厄瑣躍且第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用鏈表的輸出遍歷鏈表的所有節(jié)點headdatanextdata92#include<stdio.h>#include<stdlib.h>structlink*AppendNode(structlink*head);voidDisplyNode(structlink*head);voidDeleteMemory(structlink*head);structlink*InsertNode(structlink*head,intnodeData);structlink{ intdata; structlink*next;};捻霄湊碼汾室寒備榴操愈遮房三瓊膝唇斂舞玩鏟盡滇模猩莽過燒冶完仗該第12章結構體和共用體結構體與聯(lián)合體以及枚舉類型變量的定義和使用#include<stdio.h>捻霄湊碼汾室寒備榴操愈遮93intmain(){inti=0;charc;structlink*head=NULL; /*鏈表頭指針*/ printf("Doyouwanttoappendanewnode(Y/N)?"); scanf("%c",&c); /*%c前面有一個空格*/ while(c=='Y'||c=='y') {head=AppendNode(head); DisplyNode(head);/*顯示當前鏈表中的各節(jié)點信息*/ printf("Doyouwanttoappendanewnode

溫馨提示

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

評論

0/150

提交評論