c語言結(jié)構(gòu)與聯(lián)合_第1頁
c語言結(jié)構(gòu)與聯(lián)合_第2頁
c語言結(jié)構(gòu)與聯(lián)合_第3頁
c語言結(jié)構(gòu)與聯(lián)合_第4頁
c語言結(jié)構(gòu)與聯(lián)合_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、結(jié)構(gòu)與聯(lián)合一、結(jié)構(gòu)體(一)結(jié)構(gòu)體類型的定義結(jié)構(gòu)體數(shù)據(jù)類型定義的一般形式為: struct 結(jié)構(gòu)體名 類型名 結(jié)構(gòu)體成員名1; 類型名 結(jié)構(gòu)體成員名2; 類型名 結(jié)構(gòu)體成員名n;說明:(1)struct是結(jié)構(gòu)體定義的標(biāo)志,其后必須定義一個結(jié)構(gòu)體名,結(jié)構(gòu)體名是一個合法的C語言標(biāo)識符,struct與結(jié)構(gòu)變量名兩者合起來共同組成結(jié)構(gòu)體類型名;(2)所有的成員清單必須用一對大括號括起來。優(yōu)點(diǎn):信息整體性強(qiáng),具有較高的可讀性和清晰性,有利于數(shù)據(jù)的處理。(二)結(jié)構(gòu)體變量1、結(jié)構(gòu)體變量的定義:結(jié)構(gòu)體變量說明有如下3種方法:(1)定義結(jié)構(gòu)體類型的同時,說明結(jié)構(gòu)體變量。這種形式的定義的一般形式為: struct結(jié)

2、構(gòu)體名 成員表列 變量名表列;例:struct student int num; charname20; char sex; int age; float score; char addr30; student1,student2(2)在定義結(jié)構(gòu)體類型之后,說明結(jié)構(gòu)體變量。這種形式的定義的一般形式為: struct結(jié)構(gòu)體名 成員表列 變量名表列;例:struct student int num; charname20; char sex; float score; student1, student2注意:將一個變量定義為標(biāo)準(zhǔn)類型(基本數(shù)據(jù)類型)與定義為結(jié)構(gòu)體類型不同之處在于后者不僅要求指定變

3、量為結(jié)構(gòu)體類型,而且要求指定為某一特定的結(jié)構(gòu)體類型,因為可以定義出許許多多種具體的結(jié)構(gòu)體類型。(3)用無名結(jié)構(gòu)體類型,直接說明結(jié)構(gòu)體變量。其一般形式為: struct 成員表列 變量名表列;例:struct int num; char name20; char sex; float score; student1,student2;注意: (1) 類型與變量是不同的概念,不要混同。只能對變量賦值、存取或運(yùn)算,而不能對一個類型賦值、存取或運(yùn)算。在編譯時,對類型是不分配空間的,只對變量分配空間。(2)對結(jié)構(gòu)體中的成員(即“域”),可以單獨(dú)使用,它的作用與地位相當(dāng)于普通變量。(3)成員也可以是一個結(jié)

4、構(gòu)體變量。(4)成員名可以與程序中的變量名相同,二者不代表同一對象。 2、結(jié)構(gòu)體類型的嵌套定義方式:struct date short month; short day; short year; struct stud long num; char name10; stuct date birthday; float math; wang,zhao,zhang;3、對結(jié)構(gòu)體變量初始化#include <stdio.h>void main()struct student long int num; char name20; char sex; char addr20; a=10101

5、,LiLin,M,123 Beijing Road; /* 對結(jié)構(gòu)體變量a賦初值*/printf(No.:%ldnname:%snsex:%cnaddress:%sn,a.num,,a.sex,a.addr); 注:若某一項暫時不賦值,其中的分隔符“,”也不能省略。4、使用的一般形式: 結(jié)構(gòu)變量名.成員名結(jié)構(gòu)體變量的使用應(yīng)遵守以下規(guī)則(1)不能將一個結(jié)構(gòu)體變量最為一個整體驚醒輸入和輸出。只能對其中的各個成員分別進(jìn)行輸入和輸出;(2)同類結(jié)構(gòu)體變量之間可以整體賦值;(3)可以對一個結(jié)構(gòu)體施加取地址操作,結(jié)果是結(jié)構(gòu)體第一個成員的地址;(4)成員(分量)運(yùn)算符“.”的作用是引用結(jié)構(gòu)體變量

6、中的特定成員,一般形式是:結(jié)構(gòu)體變量名.成員名(5)成員運(yùn)算符的優(yōu)先級較一般的運(yùn)算符要高(和數(shù)組下標(biāo)運(yùn)算符相同),為左結(jié)合性;(6)如果成員本身又屬于一個結(jié)構(gòu)體類型,則要用若干個成員運(yùn)算符,一級一級的找到最低一級的成員;(7)對結(jié)構(gòu)體變量的成員可以像普通變量一樣進(jìn)行相應(yīng)類型所允許的各種運(yùn)算。(三)結(jié)構(gòu)數(shù)組結(jié)構(gòu)體數(shù)組與以前介紹過的數(shù)值型數(shù)組不同之處在于每個數(shù)組元素都是一個結(jié)構(gòu)體類型的數(shù)據(jù),它們都分別包括各個成員(分量)項。1、結(jié)構(gòu)數(shù)組的定義首先必須定義結(jié)構(gòu)類型,然后才可以定義結(jié)構(gòu)數(shù)組。方式:(1)可以在定義結(jié)構(gòu)類型的同時,定義結(jié)構(gòu)數(shù)組;struct student int num; ;stu3;

7、 (2)可以在定義結(jié)構(gòu)類型之后,再定義結(jié)構(gòu)數(shù)組。例:struct student int num; 或stu3;2、初始化:(與結(jié)構(gòu)變量初始化相同,必須注意數(shù)量)注意:(1)初始化數(shù)據(jù)的類型與結(jié)構(gòu)體類型的一致性; (2)如果對數(shù)組的全部元素初始化,可以省略元素個數(shù); (3)如果在初始化的過程中,某個元素的某個成員不賦值,分隔符逗號也不能省略。3、使用:結(jié)構(gòu)數(shù)組中某一元素中的某個成員的功能與普通變量相同,可以參加普通變量可以參加的仁和動作,但其表示形式與普通變量不同。其使用的一般形式為: 結(jié)構(gòu)數(shù)組名下標(biāo).成員項名例: 標(biāo)識下標(biāo)為2的學(xué)生的姓名。(四)結(jié)構(gòu)與指針1、指向結(jié)構(gòu)體

8、變量的指針的定義(與指向變量的指針的定義相同)。2、使用:其形式為: 結(jié)構(gòu)變量名.成員項名通過結(jié)構(gòu)指針訪問結(jié)構(gòu)中的成員可使用以下2中形式:(1)通過指針運(yùn)算符“*”;例:(*p) . num = 200700011;/*通過指針運(yùn)算符訪問結(jié)構(gòu)中的成員num*/(2)通過指向運(yùn)算符“->”。例:p->num = 200700011;/*通過指向運(yùn)算符訪問結(jié)構(gòu)中的成員num*/注:(1)由于指向運(yùn)算符“->”非常形象直觀,因此更常用;(2)由于指針運(yùn)算符“*”的優(yōu)先級低于成員運(yùn)算符“.”,因此(*p).num中的*p必須帶括號。訪問結(jié)構(gòu)中的成員可以用以下3種方法:(1)結(jié)構(gòu)變量名

9、.成員項名(2)(*結(jié)構(gòu)指針名).成員項名(3)結(jié)構(gòu)指針名->成員項名3、指向結(jié)構(gòu)數(shù)組的指針(與數(shù)組的指針的用法相同)注:結(jié)構(gòu)指針加1,其移動的字節(jié)書為整個結(jié)構(gòu)類型所占的字節(jié)數(shù),即結(jié)構(gòu)中各個成員所占的字節(jié)數(shù)之和。(五)結(jié)構(gòu)體與函數(shù)1、結(jié)構(gòu)體變量作為函數(shù)參數(shù)用結(jié)構(gòu)體變量作為函數(shù)參數(shù)實參和形參時,形參與實參必須保持?jǐn)?shù)據(jù)類型的一致性(值傳遞),兩者一一對應(yīng)賦值,且占有各自的存儲空間。2、指向結(jié)構(gòu)體變量的指針作為函數(shù)參數(shù)用結(jié)構(gòu)體指針作為函數(shù)的實參和形參時,形參和實參必須具有相同的結(jié)構(gòu)類型的指針(地址傳遞),即形參的結(jié)構(gòu)指針指向?qū)崊⒔Y(jié)構(gòu)變量,通過共享的方式實現(xiàn)數(shù)據(jù)的傳遞,具體可以利用指向結(jié)構(gòu)體的指

10、針或結(jié)構(gòu)數(shù)組實現(xiàn)。返回就夠的函數(shù)是指函數(shù)的返回值是結(jié)構(gòu)類型的數(shù)據(jù),如結(jié)構(gòu)變量或結(jié)構(gòu)指針。(六)動態(tài)內(nèi)存與鏈表1、動態(tài)內(nèi)存函數(shù)當(dāng)程序需要使用動態(tài)內(nèi)存的分配和釋放函數(shù)時,應(yīng)包含頭文件: #include<stdio.h> 或 #include<malloc.h>(1)malloc函數(shù)【原型為:void *malloc(unsigned int size)】功能:向系統(tǒng)申請長度為size個字節(jié)的存儲空間。 申請成功 返回起始地址 申請不成功 返回空地址NULL說明:(1)函數(shù)的形參是無符號整型。 (2)函數(shù)的返回值是指針(指向void類型的指針),如果需要利用此段空間存儲其他

11、類型的數(shù)據(jù),必須將其強(qiáng)制轉(zhuǎn)換為其他類型的指針。例:(float *)malloc(4) /*申請4個字節(jié)的存儲空間,并將其轉(zhuǎn)換為浮點(diǎn)類型的指針*/(2)calloc函數(shù)【void *calloc(unsigned int n,unsigned int size)】功能:向系統(tǒng)申請n個長度為size個字節(jié)的存儲空間。 申請成功 返回起始地址 申請不成功 返回空地址NULL說明:(1)calloc函數(shù)的的形參有2個; (2)函數(shù)的返回值是指針(指向void類型的指針),如果需要利用此段空間存儲其他類型的數(shù)據(jù),必須將其強(qiáng)制轉(zhuǎn)換為其他類型的指針。(3)free函數(shù)【原型為:void free(void

12、 *p)】功能:將指針變量p指向的存儲空間歸還系統(tǒng),函數(shù)無返回值。說明:(1)指針變量p指向的存儲空間歸還系統(tǒng)后,系統(tǒng)可將此空間分配給其他的變量;(2)指針變量p指向的存儲空間不能是任意的地址,只能是在程序的執(zhí)行過程中利用malloc函數(shù)或calloc函數(shù)獲得的返回地址。2、鏈表(1)概念:利用動態(tài)內(nèi)存的分配和回收策略實現(xiàn)的最常用的一種動態(tài)數(shù)據(jù)結(jié)構(gòu),由若干個結(jié)點(diǎn)所組成,每個結(jié)點(diǎn)可以分布在內(nèi)存的任意位置。(2)鏈表的組成:頭指針:存放一個地址,該地址指向一個元素 結(jié)點(diǎn):用戶需要的實際數(shù)據(jù)和鏈接節(jié)點(diǎn)的指針對于第一個結(jié)點(diǎn)的地址的存儲有2種方式:1)只有頭指針、無頭結(jié)點(diǎn)的鏈表。2)有頭結(jié)點(diǎn)的鏈表。3、

13、鏈表的基本操作鏈表的優(yōu)點(diǎn):有利于結(jié)點(diǎn)的插入和刪除,且具有組織靈活、對內(nèi)存壓力小、內(nèi)存的利用率高。缺點(diǎn):不能隨機(jī)的存取數(shù)據(jù)。(1)遍歷鏈表(為了輸出鏈表中的每一個結(jié)點(diǎn)的數(shù)據(jù))步驟如下:首先從鏈表的頭結(jié)點(diǎn)的后繼結(jié)點(diǎn)開始(p=head->next)。如果此結(jié)點(diǎn)存在(p!=NULL),則打印此結(jié)點(diǎn)的信息,接著結(jié)點(diǎn)指針后移(p->next),以指向下一個結(jié)點(diǎn),轉(zhuǎn)入步驟2.如果此結(jié)點(diǎn)不存在(p=NULL),則結(jié)束循環(huán),進(jìn)而結(jié)束子函數(shù)。(2)查找鏈表(在鏈表中查找數(shù)據(jù)信息)步驟如下:輸入待查找的數(shù)據(jù)信息。從鏈表的頭結(jié)點(diǎn)的后繼結(jié)點(diǎn)開始(p=head->next)。如果此點(diǎn)的數(shù)據(jù)信息與待查找的

14、數(shù)據(jù)信息不同,且此點(diǎn)存在后繼結(jié)點(diǎn),則結(jié)點(diǎn)指針后移(p=p->next)。循環(huán)結(jié)束后,仍沒有找到,則輸出“not found”。(3)插入鏈表(在有序鏈表中插入信息,并仍保持有序)步驟如下:輸入待插入的數(shù)據(jù)信息。從鏈表的頭結(jié)點(diǎn)開始(p=head)。如果此結(jié)點(diǎn)存在后繼結(jié)點(diǎn),且此結(jié)點(diǎn)的后繼結(jié)點(diǎn)的數(shù)據(jù)信息小于待插入的數(shù)據(jù)信息,則結(jié)點(diǎn)指針后移(p=p->next),以指向下一結(jié)點(diǎn)繼續(xù)查找。循環(huán)結(jié)束后,結(jié)點(diǎn)p的數(shù)據(jù)信息小玉待插入的數(shù)據(jù)信息,而結(jié)點(diǎn)p->next的數(shù)據(jù)信息大雨待插入的數(shù)據(jù)信息,因此應(yīng)將新結(jié)點(diǎn)q插在結(jié)點(diǎn)p和p->next之間。生成新結(jié)點(diǎn)q,將結(jié)點(diǎn)p的原后繼結(jié)點(diǎn)鏈在新結(jié)點(diǎn)

15、q之后,而結(jié)點(diǎn)p的后繼結(jié)點(diǎn)為新結(jié)點(diǎn)q。(4)刪除鏈表:其查找位置的操作過程與插入算法基本相同,如果需要刪除結(jié)點(diǎn)p->next,只需將結(jié)點(diǎn)p的后繼指針改為其后繼的后繼,刪除后必須及時地釋放被刪除結(jié)點(diǎn)的空間。(5)生成鏈表(首先生成空鏈,接著不斷生成新的結(jié)點(diǎn)插入鏈中,直至鏈表生成)鏈表生成算法分為頭插法和尾插法。尾插法:首先生成頭結(jié)點(diǎn),頭結(jié)點(diǎn)的指針為空,即空鏈。不斷生成結(jié)點(diǎn),并將其插在剛生成(即上一次循環(huán)生成的結(jié)點(diǎn))的后繼,直至輸入結(jié)束標(biāo)志為止。循環(huán)結(jié)束后,將最后一個結(jié)點(diǎn)的指針域置為空(NULL)。二、聯(lián)合體(共同體)概念:不同類型的數(shù)據(jù)聯(lián)合存放在一段起始地址相同的、連續(xù)的存儲空間中。(一)

16、聯(lián)合體類型的定義先定義聯(lián)合體類型,再定義聯(lián)合體變量,接著可以使用聯(lián)合體變量中的某個成員(與結(jié)構(gòu)體的定義和使用方法基本相同)。一般形式: union 聯(lián)合體類型名 聯(lián)合體成員列表;例: union data char ch; int n; float x;(二)聯(lián)合體變量1、定義(聯(lián)合體變量的定義有3種形式)(1)在定義聯(lián)合體的同時定義聯(lián)合體變量。例: union data char ch; int n; float x;a,b,c;(2)在定義聯(lián)合體類型之后,定義聯(lián)合體變量。例: union data char ch; int n; float x;;union data a,b,c;(3)利

17、用無名聯(lián)合體類型直接定義聯(lián)合體變量。例: union char ch; int n; float x;a,b,c;注:字符型數(shù)據(jù)占用從起始單元開始的1個字節(jié);整型數(shù)據(jù)占用從起始單元開始的2個字節(jié);浮點(diǎn)型數(shù)據(jù)占用從起始單元開始的4個字節(jié)。它們相互之間有覆蓋的情況,在某一時刻只保留最新的數(shù)據(jù)。2、使用(與結(jié)構(gòu)體基本相同)一般形式為: 聯(lián)合體變量名.成員項名 或 聯(lián)合體指針->成員項名注:(1)不能對共用體變量名賦值,也不能企圖引用變量名來得到一個值,又不能在定義共用體變量時對它初始化。(2)不能把共用體變量作為函數(shù)參數(shù),也不能使函數(shù)帶回共用體變量,但可以使用指向共用體變量的指針 (3)共用體

18、類型可以出現(xiàn)在結(jié)構(gòu)體類型定義中,也可以定義共用體數(shù)組。反之,結(jié)構(gòu)體也可以出現(xiàn)在共用體類型定義中,數(shù)組也可以作為共用體的成員。三、枚舉類型1、枚舉類型的定義(與結(jié)構(gòu)體類型的數(shù)據(jù)的用法基本相同)必須先定義枚舉類型,在定義枚舉類型的變量,接著可使用枚舉類型的數(shù)據(jù)。2、一般形式: enum 枚舉類型名枚舉常量列表;注:系統(tǒng)自動為他么賦值為:0,1,2,3,也可根據(jù)系統(tǒng)需要,改變系統(tǒng)默認(rèn)值,其后的值則順延。例:enum day1mon,tue,wed,thu,fri,sat,sun;3、枚舉變量的定義(1)在定義枚舉類型的同時,定義枚舉變量。例:enum colorred,yel,grex,y;(2)在定義枚舉類型之后,定義枚舉變量。例:enum colorred,yel,gre;enum color x,y;(3)直接定義枚舉變量。例:enum red,yel,grex,y;4、枚舉變量的使用注意:(1)枚舉變量的值只能取舉個枚舉常量之一;(2)枚舉變量不能直接取一個整數(shù)值,如果

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論