第十一章結(jié)構(gòu)體和共用體_第1頁(yè)
第十一章結(jié)構(gòu)體和共用體_第2頁(yè)
第十一章結(jié)構(gòu)體和共用體_第3頁(yè)
第十一章結(jié)構(gòu)體和共用體_第4頁(yè)
第十一章結(jié)構(gòu)體和共用體_第5頁(yè)
已閱讀5頁(yè),還剩78頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、結(jié)構(gòu)體與共用體結(jié)構(gòu)體與共用體第十一章第十一章10.1 結(jié)構(gòu)體及其類(lèi)型定義結(jié)構(gòu)體及其類(lèi)型定義 已介紹的數(shù)據(jù)類(lèi)型:簡(jiǎn)單變量、數(shù)組、指針。已介紹的數(shù)據(jù)類(lèi)型:簡(jiǎn)單變量、數(shù)組、指針。例:例:建立學(xué)生檔案每一個(gè)學(xué)生的:學(xué)號(hào)(int num) 姓名(char name20) 性別(char sex) 年齡(int age) 存在的問(wèn)題:難以處理一些較復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。存在的問(wèn)題:難以處理一些較復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。成績(jī)(float score)地址(char addr30)C程序可將上述數(shù)據(jù)的集合定義為一種結(jié)構(gòu)體類(lèi)型:struct student int num; char name20; char sex; in

2、t age; float score; char addr30;上述定義中: struct 關(guān)鍵詞(保留字), 表示定義一種結(jié)構(gòu)體類(lèi)型。結(jié)構(gòu)體定義的一般形式: struct 結(jié)構(gòu)體名 成員表列; 成員表列:類(lèi)型標(biāo)識(shí)符 成員名 以上僅說(shuō)明了定義一種類(lèi)型的方法,尚未定義變量。strudent 結(jié)構(gòu)體名如:如:struct exp int times; char flag; float meter; 結(jié)構(gòu)體名成員表列10.2 定義結(jié)構(gòu)體變量定義結(jié)構(gòu)體變量一、先定義結(jié)構(gòu)體類(lèi)型再定義結(jié)構(gòu)體變量一、先定義結(jié)構(gòu)體類(lèi)型再定義結(jié)構(gòu)體變量三種方法可用來(lái)定義結(jié)構(gòu)體變量:struct student x1, x2;

3、則 x1, x2為student 結(jié)構(gòu)型變量,x1, x2可存放student類(lèi)型數(shù)據(jù)。例: struct student int num; char name20; char sex; int age; float score; char addr30;類(lèi)型標(biāo)識(shí)符例:struct student int num; char name20; char sex; int age; char addr30; x1, x2;定義形式 struct 結(jié)構(gòu)體名成員表列 變量名表列;二、二、 在定義結(jié)構(gòu)體類(lèi)型的同時(shí)定義變量在定義結(jié)構(gòu)體類(lèi)型的同時(shí)定義變量:定義形式 struct 成員表列 變量名表列;不出現(xiàn)

4、結(jié)構(gòu)體類(lèi)型名三、直接定義結(jié)構(gòu)類(lèi)型變量三、直接定義結(jié)構(gòu)類(lèi)型變量如:struct int num char name20; char sex; int age; char addr30; x1, x2;A) struct student int num; float age; ; struct student std1;以下對(duì)結(jié)構(gòu)體類(lèi)型變量的定義中不正確的是:以下對(duì)結(jié)構(gòu)體類(lèi)型變量的定義中不正確的是:B) struct student int num; float age; std1 ;D) struct int num; float age; std1 ;C) struct int num; fl

5、oat age; student;struct student std1; 1. 類(lèi)型名與變量名是不同的概念 2. 允許成員名又為另一個(gè)已定義的結(jié)構(gòu)型變量 3. 每一個(gè)成員地位如同該類(lèi)型的變量 4. 成員名與程序中的變量名可相同但意義不同幾點(diǎn)說(shuō)明幾點(diǎn)說(shuō)明: :一個(gè)嵌套定義的例子:struct date int month;int day;int year;struct studentint num;char name20; char sex;int age;struct date birthday;char addr30; x1, x2; x1或x2num name sex agebirthd

6、aymonth dayyearaddr10.3 10.3 結(jié)構(gòu)體類(lèi)型變量的引用結(jié)構(gòu)體類(lèi)型變量的引用 如:x1為student型變量,則 x1.num: 表示x1的學(xué)號(hào) : 表示x1的名字 x1.birthday.day: 表示x1的出生日 1. 只能用成員,不可用結(jié)構(gòu)體變量名直接運(yùn)算2. 每一個(gè)分量的引用與其同類(lèi)型的簡(jiǎn)單變量的引用相同。引用結(jié)構(gòu)體變量實(shí)質(zhì)上為引用其成員引用結(jié)構(gòu)體變量實(shí)質(zhì)上為引用其成員用分量運(yùn)算符用分量運(yùn)算符.優(yōu)先級(jí)最高優(yōu)先級(jí)最高10.4 結(jié)構(gòu)體變量的初始化結(jié)構(gòu)體變量的初始化 struct student x1=8906, Li Ming , M, 25, 8, 3

7、, 1928, Yu Lushan 123 與其它變量的初始化完全一樣,結(jié)構(gòu)體變量在定義時(shí)可初始化:1. 結(jié)構(gòu)體變量不是一個(gè)簡(jiǎn)單變量,它的值是由許多個(gè)基本數(shù)據(jù)組成。2. 在內(nèi)存中占有一段連續(xù)的存儲(chǔ)單元3. 占有的連續(xù)存儲(chǔ)單元大小取決于成員的數(shù)據(jù)類(lèi)型如:如:struct exp int a; float b; char yn8; struct exp x=1234,56.7, text 若 x 的起始地址為2000, 則 x 在內(nèi)存中占有的存儲(chǔ)單元為:共用14個(gè)字節(jié)的連續(xù)單元123456.7test0ab2000200220062013yn84. 結(jié)構(gòu)體定義和變量定義及初始化可二合為一: str

8、uct exp int a; float b; char yn8; x=1234, 56. 7, test; 但不能這樣寫(xiě):但不能這樣寫(xiě): struct exp int a=1234; float b=56.7; char yn8=test; x;5. 要注意結(jié)構(gòu)體變量的輸入/輸出.若有struct student h;則:scanf(%s, &h);printf(%s, h);錯(cuò)誤原因:原因:結(jié)構(gòu)體變量中包含有多個(gè)不同類(lèi)型的數(shù)據(jù)項(xiàng)。正確方法正確方法:對(duì)結(jié)構(gòu)體變量各成員的值進(jìn)行輸入/輸出。如:如:scanf(%d%s, &h.num, );printf(%d%s, h.num, h

9、.name);10.5 10.5 結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組同結(jié)構(gòu)體變量定義類(lèi)似: struct student w3; w0.num: 表示w0的學(xué)號(hào) : 表示w1的姓名對(duì)w數(shù)組也可初始化: struct student w3=8901, Li Ming , , , ;則有三個(gè)元素w0, w1, w2. 每一個(gè)元素為一個(gè)結(jié)構(gòu)student型變量。結(jié)構(gòu)體類(lèi)型標(biāo)識(shí)符可省略大小說(shuō)明,直接用賦初值確定其大小 struct student w =, ,;struct person char name20; int count; leader3=Li, 0,Zhang , 0, Hang , 0

10、;例:有三個(gè)侯選人,每一侯選人的數(shù)據(jù)包括其姓名和得票數(shù),則可定義結(jié)構(gòu)類(lèi)型person和結(jié)構(gòu)數(shù)組leader程序如下: /*exp14_1.c*/struct person char name20; int count; leader3=Li, 0,Zhang , 0, Hang , 0;main ( )int i, j; char leader_name20; for (i=1; i=10; i+) scanf (%s, leader_name); for (j=0; j3; j+) if (strcmp (leader_name, )= =0) leaderj.cou

11、nt+; printf (n); for (i=0; i3; i+) printf(%5s : %dn, , leaderi.count); Li Li Hang Zhang Zhang Hang Li Hang Zhang Li 輸入:輸入:運(yùn)行情況如下:運(yùn)行情況如下: count name LiZhangHang 0 0 0 Li : 4 Zhang : 3 Hang : 3顯示:10.6 10.6 結(jié)構(gòu)指針結(jié)構(gòu)指針 結(jié)構(gòu)指針:結(jié)構(gòu)指針:指向結(jié)構(gòu)型變量的起始地址指向結(jié)構(gòu)型變量的起始地址.一、結(jié)構(gòu)指針變量一、結(jié)構(gòu)指針變量 例例:struct student char

12、name 10; char sex; int age; float score; char addr20; x1;則p為結(jié)構(gòu)指針變量,它可用來(lái)存放student型變量的地址numnameaddrpx1令p=&x1;則 p為x1的首地址.struct student p; (p).name (p).score 或者用“ ”運(yùn)算符, p num, pname, p score. 稱(chēng)為指向運(yùn)算符, “ ”優(yōu)先級(jí)高于+, 。則:p num+1(x1.num)+ +pnum +(x1.num)先使用x1.num, 再加1先使x1.num加1,再用x1.num訪(fǎng)問(wèn)x1的成員: 小結(jié):小結(jié): 引用結(jié)構(gòu)變量中

13、的成員有三種方法:(2) 用指針變量 (p).成員名 (p).num(3) 用指向運(yùn)算符成員名 p num(1) 結(jié)構(gòu)體變量名.成員名 x1.num注意注意:指針變量p必須是結(jié)構(gòu)指針型,且有p=&x1;例:例:請(qǐng)指出下列程序的錯(cuò)誤所在: struct person char name20; int count; x1=ZhongHua, 10; main( ) int *p;p=&x1;printf (%sn%dn, (*p).name, (*p).count)錯(cuò)誤的原因:p不是結(jié)構(gòu)指針變量可改為:struct person *p例例:struct student int num;char n

14、ame20;char sex;int age;二、指向結(jié)構(gòu)體數(shù)組的指針二、指向結(jié)構(gòu)體數(shù)組的指針 與指向數(shù)組的指針一樣,可用指針指向結(jié)構(gòu)體數(shù)組。 main ( ) struct student stu3=10101, Li Lin , M, , , ; struct student p; p=stu;for (;pstu+3;p+) printf( , pnum, p name, p sex, p age);內(nèi)存結(jié)構(gòu)如下:內(nèi)存結(jié)構(gòu)如下:注:注: p+1為指向下一個(gè)元素的首地址。stu0 p+1 p+2(p) 用地址傳送,函數(shù)中形參用指針變量,實(shí)參可用 地址量或指針三、用指向結(jié)構(gòu)體的指針作函數(shù)參數(shù)

15、三、用指向結(jié)構(gòu)體的指針作函數(shù)參數(shù)例例/*-exp14_3.c-*/#include struct person char name20;int count; x3=zhao, 4, qian, 3, sun, 6; void prt(struct person *pp); main( ) int i; for (i=0; iname, pp-count); 運(yùn)行結(jié)果:zhao, 4qian, 3sun, 610.7 10.7 共用體類(lèi)型數(shù)據(jù)共用體類(lèi)型數(shù)據(jù)一、共用體數(shù)據(jù)類(lèi)型的特點(diǎn)一、共用體數(shù)據(jù)類(lèi)型的特點(diǎn) 與結(jié)構(gòu)體類(lèi)似之處:由不同的數(shù)據(jù)項(xiàng)組成一個(gè)整體。 與結(jié)構(gòu)體不同之處:占用的內(nèi)存單元不同。二、共

16、用體類(lèi)型定義二、共用體類(lèi)型定義定義方式與結(jié)構(gòu)體類(lèi)型完全相同。把結(jié)構(gòu)體類(lèi)型中的關(guān)鍵字struct換成union即可。例例:struct memb float v;int n;char c; stag; stag占內(nèi)存7個(gè)字節(jié)的空間union memb float v;int n;char c; ustag; utag占的內(nèi)存空間為100110051007vnc2001vnc200220032004 共用體類(lèi)型變量每次只能存放一個(gè)成員的值。三、共用體類(lèi)型變量的引用三、共用體類(lèi)型變量的引用引用方法同結(jié)構(gòu)體變量:(共用體類(lèi)型變量名).共用體類(lèi)型變量的輸入輸出同結(jié)構(gòu)體類(lèi)型變量相同。例例:#include

17、union memb float v;int n;char c;main( ) union memb utag; utag.v=36.7 utag.c=T utag.n=18 printf(%5.1fn%dn%cn, utag.v, utag.n, utag.c); 運(yùn)行結(jié)果運(yùn)行結(jié)果:36.7 13107想一想:想一想:若改變成員的賦值順序: utag.v=36.7 utag.c=T utag.n=18則則運(yùn)行結(jié)果為運(yùn)行結(jié)果為:36.5 84 T spe為共用體類(lèi)型數(shù)組,每個(gè)數(shù)組元素所占用的內(nèi)存單元為:2001mudfsns20022003200420052006200711.7 用指針處理鏈

18、表 用數(shù)組存放數(shù)據(jù)時(shí),必須事先定義固定的長(zhǎng)度,數(shù)組元素在內(nèi)存中也是連續(xù)存放的,若元素個(gè)數(shù)不確定,則長(zhǎng)度必須足夠大,造成內(nèi)存的浪費(fèi)。 鏈表則不同,它根據(jù)需要開(kāi)辟內(nèi)存單元,鏈表中各數(shù)據(jù)成員在內(nèi)存中可以不是連續(xù)存放的??梢杂盟鼇?lái)代替數(shù)組元素個(gè)數(shù)不確定的數(shù)組。 鏈表概述 鏈表必須利用指針變量才能實(shí)現(xiàn),單向鏈表包含一個(gè)指針,用來(lái)存放下一個(gè)結(jié)點(diǎn)的首地址。(雙鏈表包含兩個(gè)指針,一個(gè)用來(lái)指向它后面的結(jié)點(diǎn),一個(gè)用來(lái)指向它前面的結(jié)點(diǎn))單向鏈表的結(jié)構(gòu)形式單向鏈表的結(jié)構(gòu)形式如下圖所示單向鏈表的結(jié)構(gòu)形式如下圖所示1356A1475B1021CNULLD1249head 鏈表有一個(gè)鏈表有一個(gè)“頭指針頭指針”變量,存放一個(gè)

19、地址,變量,存放一個(gè)地址,該地址指向鏈表中的第一個(gè)元素。該地址指向鏈表中的第一個(gè)元素。 鏈表中每一個(gè)元素稱(chēng)為鏈表中每一個(gè)元素稱(chēng)為結(jié)點(diǎn)結(jié)點(diǎn),每個(gè)結(jié)點(diǎn)都應(yīng),每個(gè)結(jié)點(diǎn)都應(yīng)包括兩個(gè)部分:一為包括兩個(gè)部分:一為用戶(hù)需要用的實(shí)際數(shù)據(jù)用戶(hù)需要用的實(shí)際數(shù)據(jù),二,二為為下一個(gè)結(jié)點(diǎn)的地址下一個(gè)結(jié)點(diǎn)的地址。 鏈表中最后一個(gè)元素稱(chēng)為鏈表中最后一個(gè)元素稱(chēng)為表尾表尾,它不再指向,它不再指向其他元素,它的地址部分為其他元素,它的地址部分為NULL。在語(yǔ)言中,用結(jié)構(gòu)類(lèi)型結(jié)構(gòu)類(lèi)型來(lái)描述結(jié)點(diǎn)結(jié)構(gòu)。例如: struct student int num;/*學(xué)號(hào)學(xué)號(hào)*/ int score;/*成績(jī)成績(jī)*/ struct stude

20、nt *next;/*指針域指針域*/ ;鏈表的數(shù)據(jù)結(jié)構(gòu),必須利用指針變量才能實(shí)現(xiàn)。語(yǔ)言對(duì)鏈表結(jié)點(diǎn)的結(jié)構(gòu)描述語(yǔ)言對(duì)鏈表結(jié)點(diǎn)的結(jié)構(gòu)描述 簡(jiǎn)單鏈表簡(jiǎn)單鏈表#define NULL 0 struct student int num; float score; struct student *next; ; main() struct student a, b, c, *head, *p; a.num=1001; a.score=89.5; b.num=1002; b.score=90; c.num=1006; c.score=85; head=&a; a.next=&b; b.next=&c; c.

21、next=NULL; p=head; do printf(%d %5.1fn, p-num, p-score); p=p-next; while (p!=NULL); 例:建立一個(gè)如右圖所示的簡(jiǎn)單鏈表,它由例:建立一個(gè)如右圖所示的簡(jiǎn)單鏈表,它由3 3個(gè)學(xué)生數(shù)據(jù)的個(gè)學(xué)生數(shù)據(jù)的結(jié)點(diǎn)組成并輸出各結(jié)點(diǎn)中的數(shù)據(jù)。結(jié)點(diǎn)組成并輸出各結(jié)點(diǎn)中的數(shù)據(jù)。89.51001901002851006numscorenextNULL處理動(dòng)態(tài)鏈表所需庫(kù)函數(shù)處理動(dòng)態(tài)鏈表所需庫(kù)函數(shù)malloc函數(shù)函數(shù)函數(shù)原型:函數(shù)原型:void *malloc(unsigned int size)作用:在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配一個(gè)長(zhǎng)度為作用:在

22、內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配一個(gè)長(zhǎng)度為size的連續(xù)空間的連續(xù)空間返回值:成功,指向分配區(qū)域起始地址的指針;失敗,返回值:成功,指向分配區(qū)域起始地址的指針;失敗,NULL。calloc函數(shù)函數(shù)函數(shù)原型:函數(shù)原型:void *calloc(int n, unsigned size)作用:在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配作用:在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配n個(gè)長(zhǎng)度為個(gè)長(zhǎng)度為size的連續(xù)空間的連續(xù)空間返回值:成功,指向分配區(qū)域起始地址的指針;失敗,返回值:成功,指向分配區(qū)域起始地址的指針;失敗,NULL。free函數(shù)函數(shù)函數(shù)原型:函數(shù)原型:void free(void *p)作用:釋放由作用:釋放由p指向的內(nèi)存區(qū)指向

23、的內(nèi)存區(qū) 建立動(dòng)態(tài)鏈表是指,從無(wú)到有地建立起建立動(dòng)態(tài)鏈表是指,從無(wú)到有地建立起一個(gè)鏈表,即一個(gè)一個(gè)地開(kāi)辟結(jié)點(diǎn)和輸入一個(gè)鏈表,即一個(gè)一個(gè)地開(kāi)辟結(jié)點(diǎn)和輸入各結(jié)點(diǎn)數(shù)據(jù),并建立起前后相鏈的關(guān)系。各結(jié)點(diǎn)數(shù)據(jù),并建立起前后相鏈的關(guān)系。例:例:建立一個(gè)學(xué)生數(shù)據(jù)的單向鏈表。如果輸建立一個(gè)學(xué)生數(shù)據(jù)的單向鏈表。如果輸入的學(xué)號(hào)為入的學(xué)號(hào)為0,則建立過(guò)程結(jié)束。,則建立過(guò)程結(jié)束。 建立動(dòng)態(tài)鏈表建立動(dòng)態(tài)鏈表 基本思路基本思路: 定義好所需的結(jié)構(gòu)體類(lèi)型,用求字節(jié)數(shù)運(yùn)算符定義好所需的結(jié)構(gòu)體類(lèi)型,用求字節(jié)數(shù)運(yùn)算符“sizeof()”求出該結(jié)構(gòu)體類(lèi)型數(shù)據(jù)所占用的長(zhǎng)度。求出該結(jié)構(gòu)體類(lèi)型數(shù)據(jù)所占用的長(zhǎng)度。并定義三個(gè)指向結(jié)構(gòu)體類(lèi)型的指

24、針并定義三個(gè)指向結(jié)構(gòu)體類(lèi)型的指針head,p1,p2。 首先向系統(tǒng)用首先向系統(tǒng)用malloc( )函數(shù)申請(qǐng)一個(gè)結(jié)點(diǎn)的空間,函數(shù)申請(qǐng)一個(gè)結(jié)點(diǎn)的空間,并使并使p1指向它指向它 輸入該結(jié)點(diǎn)數(shù)據(jù)域的數(shù)據(jù)項(xiàng),并將指針域置為空,輸入該結(jié)點(diǎn)數(shù)據(jù)域的數(shù)據(jù)項(xiàng),并將指針域置為空,最后將該結(jié)點(diǎn)接到最后將該結(jié)點(diǎn)接到p2所指向的結(jié)點(diǎn)后面。所指向的結(jié)點(diǎn)后面。 3個(gè)指針變量個(gè)指針變量head、p1和和p2的說(shuō)明如下:的說(shuō)明如下: head頭指針變量,指向鏈表的第一個(gè)結(jié)頭指針變量,指向鏈表的第一個(gè)結(jié)點(diǎn)。點(diǎn)。 p1指向新申請(qǐng)的結(jié)點(diǎn)。指向新申請(qǐng)的結(jié)點(diǎn)。 p2指向鏈表的尾結(jié)點(diǎn)。指向鏈表的尾結(jié)點(diǎn)。#include #define N

25、ULL 0#define LEN sizeof(struct student) struct student long num; float score; struct student *next; int n=0; /*n為外部變量,代表結(jié)點(diǎn)個(gè)數(shù)為外部變量,代表結(jié)點(diǎn)個(gè)數(shù)*/struct student *creat( ) /*定義函數(shù),它將帶回一個(gè)指向鏈表頭的指針定義函數(shù),它將帶回一個(gè)指向鏈表頭的指針*/ struct student *head; struct student *p1,*p2; p1=(struct student*)malloc(LEN); /*開(kāi)辟一個(gè)新單元開(kāi)辟一個(gè)新單

26、元*/ scanf(“%ld,%f,&p1num,&p1score); p1next=NULL; head=NULL; num score nextp1 num9910189.5NULLwhile(p1num!=0)n=n+1; if(n= =1) head=p1; else p2next=p1; p2=p1; p1=(struct student *) malloc(LEN); scanf(“%ld,%f”,&p1num,&p1score); p2next=NULL;return(head);main( ) struct student *head; head=creat( );991018

27、9.5NULLheadp2p1num scorenextp1p2num scorenextp19910290NULL00NULL輸出鏈表基本思路:基本思路:首先要知道已有的鏈表的頭指針首先要知道已有的鏈表的頭指針head的值的值設(shè)一個(gè)指針變量設(shè)一個(gè)指針變量p, 使使p=head,即讓它指向第一個(gè),即讓它指向第一個(gè)結(jié)點(diǎn)結(jié)點(diǎn)輸出輸出p所指向的結(jié)點(diǎn)的數(shù)據(jù)所指向的結(jié)點(diǎn)的數(shù)據(jù)使使p后移一結(jié)點(diǎn),即后移一結(jié)點(diǎn),即p=p-next,則,則p指向第二個(gè)結(jié)點(diǎn)指向第二個(gè)結(jié)點(diǎn)然后再輸出,如此循環(huán)直到鏈表的尾結(jié)點(diǎn)然后再輸出,如此循環(huán)直到鏈表的尾結(jié)點(diǎn)注意:注意:head的值由實(shí)參傳過(guò)來(lái),也就是將已有的鏈表的值由實(shí)參傳過(guò)來(lái)

28、,也就是將已有的鏈表 的頭指針傳給被調(diào)用的函數(shù)的頭指針傳給被調(diào)用的函數(shù)void print(struct student *head) struct student *p; p=head; while(p!=NULL) printf(“%ld%5.1fn”,pnum,pscore); p=pnext; /* 輸出鏈表函數(shù)輸出鏈表函數(shù)print */如果刪除結(jié)點(diǎn)如果刪除結(jié)點(diǎn)C,則結(jié)點(diǎn)數(shù)減,則結(jié)點(diǎn)數(shù)減1,且,且B、C和和D之間的邏輯關(guān)系發(fā)之間的邏輯關(guān)系發(fā)生如下變化:生如下變化:刪除前,刪除前,C是是D的前驅(qū)、的前驅(qū)、B的后繼;刪除后,的后繼;刪除后,B成為成為D的前驅(qū),的前驅(qū),D成成為為B的后繼的

29、后繼鏈表的刪除操作基本思路:基本思路:9910189.599102 90head定義兩個(gè)指針變量定義兩個(gè)指針變量p1,p2,并讓?zhuān)⒆宲1指向第一個(gè)結(jié)點(diǎn)指向第一個(gè)結(jié)點(diǎn)9910385NULLp1p1p2p2p1判斷判斷p1是不是要?jiǎng)h除的結(jié)點(diǎn),若不是,則令是不是要?jiǎng)h除的結(jié)點(diǎn),若不是,則令p2=p1;p1=p1-next;即使即使p2指向剛才檢查過(guò)的結(jié)點(diǎn),指向剛才檢查過(guò)的結(jié)點(diǎn),p1指向下一個(gè)結(jié)點(diǎn)指向下一個(gè)結(jié)點(diǎn)如此循環(huán),直到找到所要?jiǎng)h除的結(jié)點(diǎn)或檢查到最后一個(gè)結(jié)點(diǎn)為止如此循環(huán),直到找到所要?jiǎng)h除的結(jié)點(diǎn)或檢查到最后一個(gè)結(jié)點(diǎn)為止 若要?jiǎng)h除的是第一個(gè)結(jié)點(diǎn)若要?jiǎng)h除的是第一個(gè)結(jié)點(diǎn)p19910189.59910290

30、9910385NULLhead則將則將p1-next賦給賦給head,這時(shí)第一個(gè)結(jié)點(diǎn)已脫離鏈表,這時(shí)第一個(gè)結(jié)點(diǎn)已脫離鏈表,鏈表的頭指針鏈表的頭指針head指向原來(lái)的第二個(gè)結(jié)點(diǎn)指向原來(lái)的第二個(gè)結(jié)點(diǎn) 若刪除的不是第一個(gè)結(jié)點(diǎn)若刪除的不是第一個(gè)結(jié)點(diǎn)9910189.599102909910385NULLheadp1p2注意:還要考慮鏈表是空表(無(wú)結(jié)點(diǎn))和鏈表中找不到要?jiǎng)h注意:還要考慮鏈表是空表(無(wú)結(jié)點(diǎn))和鏈表中找不到要?jiǎng)h除的結(jié)點(diǎn)的情況除的結(jié)點(diǎn)的情況則令則令 p2-next=p1-next,此時(shí)此時(shí)p2-next由原來(lái)指向由原來(lái)指向p1指向的結(jié)點(diǎn),改為指向指向的結(jié)點(diǎn),改為指向p1-next所指的結(jié)點(diǎn)。也即

31、是所指的結(jié)點(diǎn)。也即是p1所指向的結(jié)點(diǎn)已被刪除,不再是鏈表中的一部分所指向的結(jié)點(diǎn)已被刪除,不再是鏈表中的一部分struct student * del(struct student *head,long num) struct student *p1,*p2; if(head = = NULL)printf(“l(fā)ist null!n”); return head; p1=head; while(num!=p1-num & p1-next!=NULL) p2=p1; p1=p1-next; if(num = = p1-num) if(p1 = = head) head = p1-next; els

32、e p2-next = p1-next; printf(“delete:%ldn”,num); n = n-1 ; else pirntf(“%ld is not found!n”,num); return head;/* 刪除鏈表結(jié)點(diǎn)函數(shù)刪除鏈表結(jié)點(diǎn)函數(shù)del */定義三個(gè)指針變量定義三個(gè)指針變量p0,p1,p2。用。用p0指向待插入的結(jié)點(diǎn),指向待插入的結(jié)點(diǎn),p1指向第一個(gè)結(jié)點(diǎn)指向第一個(gè)結(jié)點(diǎn)鏈表的插入操作p1p19910290NULLp09910189.59910385head9910787.5NULLp2p2p1將將p0-num與與p1-num比較,若前者大于后者,則待插入的結(jié)點(diǎn)不應(yīng)比較,

33、若前者大于后者,則待插入的結(jié)點(diǎn)不應(yīng)在在p1所指的結(jié)點(diǎn)之前,此時(shí)將所指的結(jié)點(diǎn)之前,此時(shí)將p1后移,并使后移,并使p2指向指向p1剛才所指的結(jié)點(diǎn)剛才所指的結(jié)點(diǎn)再將再將p0-num與與p1-num比較,如此循環(huán),直到比較,如此循環(huán),直到p0-nump1-num或或p1所指的表尾為止所指的表尾為止如果插入的位置為第一結(jié)點(diǎn)之前如果插入的位置為第一結(jié)點(diǎn)之前p19910189.599103859910787.5NULLhead9910092NULLp0則將則將p0賦給賦給head,p1賦給賦給p0-next如果要插到表尾之后如果要插到表尾之后應(yīng)將應(yīng)將p0賦給賦給p1-next, NULL賦給賦給p0-nex

34、tp19910189.599103859910787.5NULLhead9910986NULLp0NULL如果既不在第一個(gè)結(jié)點(diǎn)之前如果既不在第一個(gè)結(jié)點(diǎn)之前又不在表尾結(jié)點(diǎn)之后又不在表尾結(jié)點(diǎn)之后則應(yīng)將則應(yīng)將p0的值賦給的值賦給p2-next,使使p2-next指向待插入的結(jié)指向待插入的結(jié)點(diǎn),然后將點(diǎn),然后將p1的值賦給的值賦給p0-next,即使即使p0-next指向指向p1所指的結(jié)點(diǎn),這樣在第一個(gè)結(jié)點(diǎn)和第二個(gè)結(jié)點(diǎn)之間已插入了所指的結(jié)點(diǎn),這樣在第一個(gè)結(jié)點(diǎn)和第二個(gè)結(jié)點(diǎn)之間已插入了一個(gè)新結(jié)點(diǎn)一個(gè)新結(jié)點(diǎn)9910189.599103859910787.5NULLhead9910290NULLp0p1p2s

35、truct student * insert(struct student *head, struct student * stud) struct student *p0,*p1,*p2; p1=head; p0=stud; if(head = = NULL) head=p0; p0- next=NULL; else while(p0-num p1-num & p1-next!=NULL) p2=p1; p1=p1-next; if(p0-num num) if(p1 = = head) head =p0; p0-next=p1; else p2-next =p0; p0-next=p1;

36、else p1-next=p0; p0-next=NULL; n = n+1 ; return head;/* 插入鏈表結(jié)點(diǎn)函數(shù)insert */&構(gòu)造數(shù)據(jù)類(lèi)型構(gòu)造數(shù)據(jù)類(lèi)型,也叫聯(lián)合體也叫聯(lián)合體&用途:使幾個(gè)不同類(lèi)型的變量共占一段內(nèi)存用途:使幾個(gè)不同類(lèi)型的變量共占一段內(nèi)存(相互覆蓋相互覆蓋) 共用體類(lèi)型定義共用體類(lèi)型定義定義形式:定義形式:union 共用體名共用體名 類(lèi)型標(biāo)識(shí)符類(lèi)型標(biāo)識(shí)符1 成員名成員名1; 類(lèi)型標(biāo)識(shí)符類(lèi)型標(biāo)識(shí)符2 成員名成員名2; .;例例 union data int i; char ch; float f; ;fchi11.8 共用體共用體形式二: union data

37、 int i; char ch; float f; a,b,c, *p,d3;形式一: union data int i; char ch; float f; ; union data a,b,c,*p,d3;形式三: union int i; char ch; float f; a,b,c *p,d3;共用體變量定義分配內(nèi)存,長(zhǎng)度=最長(zhǎng)成員所占字節(jié)數(shù)共用體變量的定義引用方式:引用方式:共用體指針名共用體指針名-成員名成員名共用體變量名共用體變量名.成員名成員名(*共用體指針名共用體指針名).成員名成員名union data int i; char ch; float f; ; union d

38、ata a,*p,d3;a.i a.ch a.fp=&a; p-i p-ch p-fp=&a; (*p).i (*p).ch (*p).fd0.i d0.ch d0.f共用體變量引用共用體變量引用例例 a.i=1; a.ch=a; a.f=1.5; printf(“%d”,a.i); ( 編譯通過(guò),運(yùn)行結(jié)果不對(duì)編譯通過(guò),運(yùn)行結(jié)果不對(duì)) 不能引用共用體變量,只能不能引用共用體變量,只能引用其成員引用其成員,不能不能在定義共在定義共用體變量時(shí)用體變量時(shí)初始化初始化例例 union int i; char ch; float f; a; a=1; ( ) 例例 union int i; char c

39、h; float f; a=1,a,1.5; ( ) 共用體變量引用共用體變量引用共用體變量中起作用的成員是共用體變量中起作用的成員是最后一次存放的成員最后一次存放的成員引用規(guī)則引用規(guī)則區(qū)別區(qū)別: 存儲(chǔ)方式不同存儲(chǔ)方式不同struct node char ch2; int k;a;union node char ch2; int k;b;achkbch k變量的各成員同時(shí)存在變量的各成員同時(shí)存在任一時(shí)刻只有一個(gè)成員存在任一時(shí)刻只有一個(gè)成員存在結(jié)構(gòu)體與共用體結(jié)構(gòu)體與共用體num namesexjobclassposition1011 Li2086 WangFMST501profstruct pe

40、ople int num; char name10; char sex; char job; union int class; char position10; category;例 結(jié)構(gòu)體中嵌套共用體結(jié)構(gòu)體和共用體兩者可相互嵌套一般形式為:一般形式為:enum 枚舉類(lèi)型名枚舉類(lèi)型名取值取值1,取值,取值2,取值,取值n;例如:例如:enum daySun,Mon,Tue,Wed,Thu,Fri,Sat; C在編譯時(shí)按順序分配給它們的值為在編譯時(shí)按順序分配給它們的值為0、1、2、3、4n。枚舉元素的值在定義時(shí)也可以由程序指定,如:枚舉元素的值在定義時(shí)也可以由程序指定,如:enum day Sun=7,Mon=1,Tue,Wed,Thu,Fri,Sat;定義定義Sun為為7, Mon為為1,后面的值順序加,后面的值順序加1,Sat就為就為6。 11.9 11.9 枚

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論