c語言程序設(shè)計(jì)課件h_第1頁
c語言程序設(shè)計(jì)課件h_第2頁
c語言程序設(shè)計(jì)課件h_第3頁
c語言程序設(shè)計(jì)課件h_第4頁
c語言程序設(shè)計(jì)課件h_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第1頁第10章結(jié)構(gòu)體與其它數(shù)據(jù)類型 (1)第2頁針對現(xiàn)實(shí)生活中描述同一事物多方面屬性的需要,結(jié)構(gòu)體類型可以包含多個成員,每個成員用于描述事物的某方面屬性;共用體類型在形式上與結(jié)構(gòu)體類型相似,所不同的是,共用體類型的各成員“共用”同一片內(nèi)存單元,而結(jié)構(gòu)體類型的各成員分配各自不同的內(nèi)存單元鏈表是一種重要的數(shù)據(jù)結(jié)構(gòu),是實(shí)現(xiàn)動態(tài)存儲分配重要方式,也是實(shí)現(xiàn)諸如樹、圖等復(fù)雜數(shù)據(jù)結(jié)構(gòu)的主要手段,與順序結(jié)構(gòu)(數(shù)組)相比,最大的優(yōu)點(diǎn)在于,鏈表在刪除和插入元素時,不需要移動其他元素。枚舉類型因?yàn)槊杜e常量往往具有明確含義,故可提高程序的可讀性,降低程序出錯的概念typedef用于為已有數(shù)據(jù)類型定義別名,可提高程序的

2、可讀性及通用性。第3頁主要內(nèi)容10.1 結(jié)構(gòu)體的概念 10.2 結(jié)構(gòu)體類型變量和數(shù)組 10.3 指向結(jié)構(gòu)體的指針 10.4 使用指針處理鏈表 10.5 共用體和枚舉類型 10.6 用typedef聲明類型 10.7 程序設(shè)計(jì)舉例第4頁10.1 結(jié)構(gòu)體的概念 在數(shù)據(jù)庫中為了表示一些相關(guān)的簡單數(shù)據(jù)類型,如學(xué)生的擋案、職工工資表、圖書資料等,可以定義數(shù)據(jù)庫中表的結(jié)構(gòu),然后根據(jù)數(shù)據(jù)庫中表的結(jié)構(gòu)建立若干個“記錄”,形成數(shù)據(jù)庫中的表文件,其中每個記錄是由多項(xiàng)數(shù)據(jù)構(gòu)成的一個集合。 C語言為了表達(dá)此類問題,可使用結(jié)構(gòu)體類型,并定義其變量、賦值,形成一個包含多項(xiàng)數(shù)據(jù)的數(shù)據(jù)單元。結(jié)構(gòu)體的類型聲明方式為: stru

3、ct 結(jié)構(gòu)體名 成員表列; ;其中各成員應(yīng)進(jìn)行類型說明。第5頁 例如,可以用一個結(jié)構(gòu)體來描述學(xué)生,包括學(xué)號、姓名、年齡、性別、成績等數(shù)據(jù)項(xiàng)。每項(xiàng)數(shù)據(jù)有不同的類型,類型為:學(xué)號(無符號整型)、姓名(字符數(shù)組)、性別(字符型)、年齡(整型)、成績(單精度類型),則需要聲明以下結(jié)構(gòu)體類型: struct student unsigned int num; char name10; char sex; int age; float score; ; 其中struct 是結(jié)構(gòu)體的關(guān)鍵字;student是結(jié)構(gòu)體的標(biāo)識符,即結(jié)構(gòu)體名;num、name10、sex、age、score 等是結(jié)構(gòu)體成員,組成成員

4、表列。10.1 結(jié)構(gòu)體的概念第6頁 struct score float score_math; float score_english; float puter; ; struct student unsigned num; char name10; char sex; int age; struct score class; ; 10.1 結(jié)構(gòu)體的概念結(jié)構(gòu)體類型聲明時應(yīng)注意:(1)結(jié)構(gòu)體類型聲明并不引起內(nèi)存分配,結(jié)構(gòu)體類型變量的定義才引起內(nèi)存的分配。(2) 在聲明結(jié)構(gòu)體類型時,允許先聲明過的結(jié)構(gòu)體類型作另一個結(jié)構(gòu)體類型的成員,如右所示。 第7頁10.2結(jié)構(gòu)體類型變量和數(shù)組 結(jié)構(gòu)體變量定義有

5、三種方法(1) 先聲明結(jié)構(gòu)體類型,后定義變量這種方法的語法格式為:struct 結(jié)構(gòu)體名 成員表列; ;struct 結(jié)構(gòu)體名 結(jié)構(gòu)體變量表;例如: struct student unsigned num; char name10; char sex; int age; float score; ;struct student student1,student2;定義了student結(jié)構(gòu)體類型的2個變量:student1,student2。10.2.1 結(jié)構(gòu)體類型變量1結(jié)構(gòu)體類型變量的定義第8頁(2) 聲明結(jié)構(gòu)體類型 的同時定義變量。一般形式: struct 結(jié)構(gòu)體名 成員表列; 結(jié)構(gòu)體變量表

6、; 例如: struct student unsigned num; char name10; char sex; int age; float score; student1,student2,student3;定義了student結(jié)構(gòu)體類型的三個變量:student1,student2,student3。 10.2.1 結(jié)構(gòu)體類型變量第9頁 (3) 直接定義變量一般格式: struct 成員表列; 結(jié)構(gòu)體變量表; 例如: struct unsigned num; char name10; char sex; int age; float score; student1,student2,s

7、tudent3; 直接定義了結(jié)構(gòu)體類型的三個變量student1、student2和student3。 但這種定義方式因無類型名,所以不能再定義更多的變量。 10.2.1 結(jié)構(gòu)體類型變量第10頁定義了一個結(jié)構(gòu)體類型的變量后,系統(tǒng)就為其按結(jié)構(gòu)分配相應(yīng)的內(nèi)存,其大小取決于結(jié)構(gòu)體的具體成員。10.2.1 結(jié)構(gòu)體類型變量如前面所舉的這個例子中,一個struct student的結(jié)構(gòu)體類型變量應(yīng)分配: num(4字節(jié))+name(10字節(jié))+sex(1字節(jié)) +age(4字節(jié))+score(4字節(jié))=23字節(jié)無論是否給每個成員賦值,只要定義了,每個成員都以占據(jù)23個字節(jié)而存在。 struct unsig

8、ned num; char name10; char sex; int age; float score; student1,student2,student3;第11頁2.結(jié)構(gòu)體變量的初始化 結(jié)構(gòu)體變量初始化是在定義變量時,指定變量各個成員的初始值。例如: struct student unsigned num; char name10; char sex; int age; float score; student1=9805, “l(fā)iliang ”,m,20,80.0;main() static struct student unsigned num; char name10; char

9、 sex; int age; float score; student2=9807,“wangning”, m,19,90.0; 10.2.1 結(jié)構(gòu)體類型變量student1為全局(結(jié)構(gòu)體)變量,student2為靜態(tài)局部(結(jié)構(gòu)體)變量。第12頁3.結(jié)構(gòu)體成員的引用結(jié)構(gòu)體類型變量定義之后即可在程序中使用。但不像其他簡單變量那樣,直接使用其名,而只能對其成員進(jìn)行操作,結(jié)構(gòu)體成員的引用形式為: 結(jié)構(gòu)體變量名.成員名其中 “.” 為成員運(yùn)算符,如: scanf(”%d,%s,%c,%d,%f”,&student1.num,, &student1.sex,&student1.

10、age,&student1.score); printf(”%d,%s,%c,%d,%fn”,student1.num,, student1.sex,student1.age, student1.score); 而下面scanf(”%d,%s,%c,%d,%f”, &student1); printf(”%d,%s,%c,%d,%fn”, student1);則是錯誤的 10.2.1 結(jié)構(gòu)體類型變量第13頁(1) 如果成員是另一定義過的結(jié)構(gòu)體類型變量,則要用若干個成員運(yùn)算符,逐級找到最低一級的成員,各級成員按順序用成員運(yùn)算符連接起來。只能對最低一級成員進(jìn)行賦值或運(yùn)算。

11、 struct student unsigned num; char name10; char sex; int age; struct score report;student1;struct scorefloat score_math; float score_english; float puter;這里可用student1.num形式引用num這個成員,而對report這個成員,則必須用student1.report.score_math , student1. report.score_english , student1. puter形式來引用。 10.2.1 結(jié)構(gòu)體類型變量 注意

12、事項(xiàng)第14頁(2) 可以像簡單變量一樣,對結(jié)構(gòu)體成員進(jìn)行運(yùn)算等各種操作,且成員運(yùn)算符“.”優(yōu)先級最高。(3) &student1 表示student1這個結(jié)構(gòu)體變量所占的首地址,&student1.num表示成員num的地址。10.2.1 結(jié)構(gòu)體類型變量10.2.1 結(jié)構(gòu)體類型變量 注意事項(xiàng)第15頁例10.1 編寫程序,從鍵盤輸入一個學(xué)生的學(xué)號、姓名、數(shù)學(xué)成績、英語成績、計(jì)算機(jī)成績,然后輸出學(xué)生的學(xué)號、姓名和三門課的平均成績。10.2.1 結(jié)構(gòu)體類型變量#include struct student unsigned num; char name10; float score_math; fl

13、oat score_english; float puter;;int main() struct student st; float aver; printf(“Input number:”); scanf(“%d”,&stnum); printf(“Input name:”); scanf(“%s”,stname);printf(“Input score of mathmatics:”); scanf(“%f”,&stscore_math);printf(“Input score of english:”); scanf(“%f”,&stscore_english);printf(“Inp

14、ut score of computer:”); scanf(“%f”,&st puter);aver=(stscore_math+ stscore_english+ st puter)/3;printf(“Number=%dn”, stnum);printf(“Name=%sn”, stname);printf(“average=%fn”, aver);return 0; 第16頁10.2.2 結(jié)構(gòu)體類型數(shù)組 結(jié)構(gòu)體類型數(shù)組與普通數(shù)組不同之處在于,結(jié)構(gòu)體數(shù)組的每個數(shù)組元素都存儲一組數(shù)據(jù)(各成員的數(shù)據(jù)),而普通數(shù)組的每個數(shù)組元素只存儲一個數(shù)據(jù)。 與定義結(jié)構(gòu)體類型變量的方法相仿,三種定義方法如下

15、表所示。 1結(jié)構(gòu)體類型數(shù)組的定義方法方法第17頁2結(jié)構(gòu)體類型數(shù)組成員的初始化 struct date int year; int month; int day; person2=1997,7,1,2000,8,8; 定義了數(shù)組person,數(shù)組中含有2個元素,每個元素都是struct date結(jié)構(gòu)體類型,定義的同時對其成員進(jìn)行了初始化。下表給出了結(jié)構(gòu)體類型數(shù)組person的邏輯存儲結(jié)構(gòu)。 yearmonthdayperson0199771person120008810.2.2 結(jié)構(gòu)體類型數(shù)組 第18頁 結(jié)構(gòu)體類型數(shù)組元素也是通過數(shù)組名和下標(biāo)來引用的,結(jié)構(gòu)體類型數(shù)組元素的引用與結(jié)構(gòu)體類型變量的引

16、用一樣,也是逐級找到最低一級成員,對最低一級成員進(jìn)行賦值或運(yùn)算。引用形式為: 數(shù)組名下標(biāo).成員名可用如下形式來引用數(shù)組元素: person1.year=2000; person1.month=person0.month+1; person1.day=6+2;10.2.2 結(jié)構(gòu)體類型數(shù)組 3結(jié)構(gòu)體類型數(shù)組元素的引用第19頁例10.2 編寫程序,從鍵盤輸入6個學(xué)生的信息(包括:學(xué)號、姓名、年齡、成績),然后輸出所有6個學(xué)生的信息,輸出年齡和成績的平均值。10.2.2 結(jié)構(gòu)體類型數(shù)組 # include # define N 6struct student unsigned num;char nam

17、e15;int age;float score;int main() int i;float x, average=0.0, averscore=0.0;struct student stN;for(i=0;iN;i+)printf(“Input number:”); scanf(“%d”,&sti.num);printf(“Input name:”); scanf(“%s”,);printf(“Input age:”); scanf(“%d”,&sti.age);printf(“Input score:”); scanf(“%f”,&x);sti.score=x; /*用一實(shí)

18、型變量間接給score賦值*/average=average+sti.age; /*計(jì)算年齡的總和*/averscore=averscore+sti.score; /*計(jì)算成績的總和*/*計(jì)算平均值*/average=average/N; averscore=averscore/N;for(i=0;i”。例如: (*p).name 或 p-name10.3 指向結(jié)構(gòu)體的指針 結(jié)構(gòu)體指針賦值:第22頁說明:(1)不可以寫成*,因?yàn)椤?”的優(yōu)先級高于“*”,*說明p是一個結(jié)構(gòu)體類型的變量。加上圓括號之后,先進(jìn)行(*p)運(yùn)算,p是一個指向結(jié)構(gòu)體類型變量的指針,(*p)是p所指

19、向的一個結(jié)構(gòu)體類型的變量,當(dāng)p指向s1時(即p=&s1),(*p)與s1等價。(2)箭頭運(yùn)算符“-”是由一個減號和一個大于號組成,且運(yùn)算優(yōu)先級最高。指向結(jié)構(gòu)體類型的指針只能存儲結(jié)構(gòu)體類型變量的地址,用來指向結(jié)構(gòu)體變量,不能用來存儲其成員的地址。10.3 指向結(jié)構(gòu)體的指針 第23頁(3)如果要對指向結(jié)構(gòu)體類型的指針?biāo)赶虻淖兞窟M(jìn)行操作,可用如下語句實(shí)現(xiàn): scanf(“%s,%d,%d,%f”,(*p).name,&(*p).num,&(*p).age,&x); /*x是float型變量*/ (*p).score=x; /*用一實(shí)型變量間接給score賦值*/ printf(“%s,%d,%d,

20、%fn”,(*p).name,(*p).num,(*p).age,(*p).score);或者: scanf(“%s%d%d%f”,p-name,p-num,p-age,&x); p-score=x; printf(“%s,%d,%d,%fn”,p-name,p-num,p-age,p-score); 10.3 指向結(jié)構(gòu)體的指針 第24頁2指向結(jié)構(gòu)體類型數(shù)組的指針如果將結(jié)構(gòu)體類型數(shù)組中某一元素的地址賦給指向結(jié)構(gòu)體類型的指針,那么指向結(jié)構(gòu)體類型的指針在進(jìn)行加1之后可指向數(shù)組的下一元素,如此重復(fù)就可以用指向結(jié)構(gòu)體類型的指針對結(jié)構(gòu)體類型數(shù)組元素進(jìn)行操作。例如: struct student stu2

21、0, *p; p=stu;p將指向stu數(shù)組的首地址,也就是stu0的地址,p-name表示。執(zhí)行 “p+;”后,p將指向stu數(shù)組中的元素stu1,p-name表示。10.3 指向結(jié)構(gòu)體的指針 第25頁# include # define N 6struct student unsigned num; char name15; int age; float score;int main() int i; float x, average=0.0, averscore=0.0; struct student stN,*p; p=st; for(i=0; in

22、um); printf(“Input name:”); scanf(“%s”, p-name); printf(“Input age:”); scanf(“%d”,& p-age); printf(“Input score:”); scanf(“%f”,&x); p-score=x; /*用一實(shí)型變量間接給score賦值*/ average=average+ p-age; /*計(jì)算年齡的總和*/ averscore=averscore+ p-score; /*計(jì)算總成績*/ 例10.3使用指向結(jié)構(gòu)體的指針完成:從鍵盤輸入6個學(xué)生的信息(包括:學(xué)號、姓名、年齡、成績),然后輸出所有學(xué)生的信息,輸

23、出年齡和成績的平均值。 10.3 指向結(jié)構(gòu)體的指針 第26頁 average=average/N; /*計(jì)算平均值*/ averscore=averscore/N; for(p=st, i=0; inum); printf(“Name=%s, ”, p-name); printf(“Age=%d, ”, p-age); printf(“Score=%fn”, p-score); printf(“Average age =%fn”, average); printf(“Average score=%fn”, averscore); return 0;第27頁10.4 使用指針處理鏈表 鏈表是一種

24、常見的重要的數(shù)據(jù)結(jié)構(gòu),是動態(tài)進(jìn)行存儲分配的一種結(jié)構(gòu),在實(shí)際中應(yīng)用非常廣泛。鏈表是指將若干個稱為結(jié)點(diǎn)的數(shù)據(jù)項(xiàng)按一定的規(guī)則連接起來的表。最簡單的鏈表是單向鏈表,其構(gòu)造如下圖所示。 圖10.1 單向鏈表的構(gòu)造第28頁 單向鏈表是由若干個結(jié)點(diǎn)構(gòu)成的,每個結(jié)點(diǎn)具有相同的類型。每一個結(jié)點(diǎn)是一個結(jié)構(gòu)體類型的數(shù)據(jù)。結(jié)構(gòu)體中必須有一個成員,其類型為指向結(jié)構(gòu)體的指針變量,用來存放下一結(jié)點(diǎn)的地址,其它成員可根據(jù)需要而設(shè)置。 鏈表有一個頭指針(head),用來存放鏈表中第一個結(jié)點(diǎn)的地址,最后一個結(jié)點(diǎn)中存放空指針(NULL),代表鏈表的表尾,也是對鏈表進(jìn)行訪問時的結(jié)束標(biāo)志。 例如,圖10.1所示的每一個結(jié)點(diǎn)的結(jié)構(gòu)可以描

25、述為: struct knot int num; char class; struct knot *next; /*必須有此成員*/ ;這個結(jié)構(gòu)體類型有三個成員,其中成員next為指向結(jié)構(gòu)體的指針變量,用來存放下一結(jié)點(diǎn)的地址。10.4 使用指針處理鏈表 第29頁定義了結(jié)點(diǎn)結(jié)構(gòu)之后,就可以定義指向結(jié)構(gòu)體類型的指針變量。例如: struct knot *head,*p;上述定義之后,編譯系統(tǒng)只是給指針變量head和p分配了存儲空間,而head和p并沒有具體的指向。從圖10.1中可以看到,一個單向鏈表只有一個頭指針,從頭指針開始,利用結(jié)點(diǎn)的成員next,可以訪問到鏈表中的所有結(jié)點(diǎn)。例如,要訪問鏈表中

26、第一個結(jié)點(diǎn)的各成員,可以表示為: head-num, head-class, head-nexthead-next為指向第二個結(jié)點(diǎn)的指針變量。要訪問鏈表中第二個結(jié)點(diǎn)的各成員,可以表示為: head-next -num, head-next-class, head-next-next10.4 使用指針處理鏈表 第30頁我們可以看到,head和head-next的類型一樣。如果要將一個頭指針為head的鏈表中的所有結(jié)點(diǎn)的數(shù)據(jù)輸出,可用下面的語句實(shí)現(xiàn)。 p=head; while(p!=NULL) printf(“%d, %cn”, p-num, p-class); p=p-next; /* p將指

27、向下一個結(jié)點(diǎn) */ 10.4 使用指針處理鏈表 鏈表是一種動態(tài)的存儲結(jié)構(gòu),在對鏈表進(jìn)行操作時經(jīng)常需要動態(tài)地分配和釋放結(jié)點(diǎn),在C語言中提供了相應(yīng)的函數(shù)對內(nèi)存空間的申請和釋放。下面先來介紹這些函數(shù)。第31頁10.4.1 內(nèi)存分配和釋放函數(shù) 1. malloc函數(shù) 申請內(nèi)存空間可以使用函數(shù)malloc,對函數(shù)malloc的調(diào)用格式為: malloc(字節(jié)數(shù)) malloc函數(shù)的功能是從內(nèi)存中申請一塊指定字節(jié)大小的連續(xù)空間。 若函數(shù)調(diào)用成功,返回該存儲塊的首地址作為函數(shù)的返回值;若申請空間失敗,說明沒有足夠的空間可供分配,返回空指針NULL。 第32頁 malloc函數(shù)的返回值為void類型指針,在使

28、用該函數(shù)時,需要強(qiáng)制類型轉(zhuǎn)換為所需的類型。例如申請一個動態(tài)的整型存儲單元可如下使用該函數(shù): int * pi; pi=(int*)malloc(sizeof(int); 申請10個動態(tài)的整型存儲單元可如下使用該函數(shù): int *pj; pj=(int*)malloc(sizeof(int)*10);10.4.1 內(nèi)存分配和釋放函數(shù) 第33頁 申請一個動態(tài)的鏈表結(jié)點(diǎn)存儲空間可如下使用該函數(shù): struct knot int num; char class; struct knot *next; struct knot *p; p=(struct knot *)malloc(sizeof(stru

29、ct knot); 上面使用的sizeof是用于計(jì)算某個類型或變量所占的字節(jié)數(shù)。如上面的sizeof(struct knot)為計(jì)算struct knot結(jié)構(gòu)類型所占的字節(jié)數(shù)。而malloc(sizeof(struct knot)的功能是分配一個struct knot結(jié)構(gòu)類型變量所占的內(nèi)存空間。(struct knot *)為強(qiáng)制類型轉(zhuǎn)換,將malloc函數(shù)的返回值轉(zhuǎn)換為指向struct knot結(jié)構(gòu)類型的指針。 在使用malloc函數(shù)時,須在程序中加入#include 或#include 的頭文件。 10.4.1 內(nèi)存分配和釋放函數(shù) 第34頁2.free函數(shù)釋放存儲空間可以使用函數(shù)free。

30、對函數(shù)free的調(diào)用格式為: free (指針變量名) free 函數(shù)的功能是釋放“指針變量名”所指向的內(nèi)存區(qū)域。 例如: int * pi; pi=(int*)malloc(sizeof(int); free(pi);對于用malloc申請的空間,在使用完后必須用free釋放,所以free與malloc經(jīng)常配對使用 。 10.4.1 內(nèi)存分配和釋放函數(shù) 第35頁10.4.2 單向鏈表的操作 1鏈表的建立 單向鏈表的建立是通過不斷的生成新結(jié)點(diǎn)、并將生成的新結(jié)點(diǎn)與已有的結(jié)點(diǎn)連接起來而完成的。生成上圖所示單鏈表的結(jié)點(diǎn)可用如下結(jié)構(gòu)體類型:struct node int num; struct nod

31、e *next; 第36頁struct node *create_list() int k=1, j; struct node *head, *new, *p; head= (struct node *)malloc(sizeof(struct node); /*為新結(jié)點(diǎn)申請內(nèi)存空間*/ if (head!=NULL) scanf(%d ,&head-num); /*輸入第一個結(jié)點(diǎn)成員的值*/ head-next =NULL; p=head; else printf(“cannot create new noden”); exit(0); /*無條件退出程序*/ printf(create N

32、o.1 node! (if input (-1) end create.); scanf(%d,k); 具體函數(shù)如下:10.4.2 單向鏈表的操作 創(chuàng)建單鏈表 第37頁while(k!=-1) /*若k的值不是-1則繼續(xù)創(chuàng)建新結(jié)點(diǎn),否則結(jié)束創(chuàng)建*/ new=( struct node *)malloc(sizeof (struct node ); /*為新結(jié)點(diǎn)申請內(nèi)存空間*/ if (new!=NULL) scanf(%d ,&new-num); /*輸入新結(jié)點(diǎn)成員的值* new-next=NULL; p-next=new; p=new; else printf(“cannot create

33、new node!n”); exit(0); printf(continue create next node?(if input (-1) end loop); scanf(%d,&k); /*若k的值不是-1則繼續(xù)創(chuàng)建新結(jié)點(diǎn),否則結(jié)束創(chuàng)建*/ return (head); 10.4.2 單向鏈表的操作 創(chuàng)建單鏈表 第38頁2.鏈表的插入 設(shè)head為一鏈表的頭指針,鏈表中各結(jié)點(diǎn)按成員num值由小到大排列,現(xiàn)要將一新生成的結(jié)點(diǎn)插入鏈表中,為保證插入新結(jié)點(diǎn)后,所有結(jié)點(diǎn)仍按num值由小到大排列,新結(jié)點(diǎn)的插入可分三種情況來討論。設(shè)新結(jié)點(diǎn)的指針為new。 (1) 新結(jié)點(diǎn)的num值最小,新結(jié)點(diǎn)插入后成

34、為頭結(jié)點(diǎn),新結(jié)點(diǎn)的指針成為鏈表的頭指針,如圖所示: 完成插入的語句為: new-next=head; head=new;10.4.2 單向鏈表的操作 創(chuàng)建單鏈表 第39頁(2)新結(jié)點(diǎn)的num值比鏈表中某一結(jié)點(diǎn)的num值小,但不是最小值,例如,新結(jié)點(diǎn)的num為5,如圖所示,那么應(yīng)將它插入num值為 8的結(jié)點(diǎn)之前,所以應(yīng)先從head出發(fā)找到待插入結(jié)點(diǎn)的位置p,其前驅(qū)結(jié)點(diǎn)的指針為q,然后再完成插入。插入語句為: p=head;while (p!=NULL & p-numnum) q=p; p=p-next; new-next=p;q-next=new;第40頁(3)新結(jié)點(diǎn)的num值最大,新結(jié)點(diǎn)應(yīng)插入

35、鏈表的最后,其插入過程的語句與情況(2)的插入語句可以相同。完整的插入函數(shù)如下:struct node *insert_list(struct node *head, int num)struct node *p, *new, *q; new=(struct node*)malloc(sizeof(struct node); /*為新結(jié)點(diǎn)申請空間*/ if (new!=NULL) new-num=num; new-next=NULL; if (new-numnum | head=NULL) new-next=head; head=new; /*將新結(jié)點(diǎn)插在表頭位置*/ 第41頁 else p=

36、head; while (p!=NULL & p-numnum) /*查找插入位置*/ q=p; p=p-next; new-next=p; q-next=new; /*插入表中或表尾*/ return (head); else printf(“cannot create new noden”); exit(0); 第42頁3. 鏈表的刪除 如果要從鏈表中刪除一個結(jié)點(diǎn),應(yīng)先找到待刪結(jié)點(diǎn)的位置后再完成刪除。刪除操作可分兩種情況。 (1)待刪結(jié)點(diǎn)為鏈表中的頭結(jié)點(diǎn),刪除完成后鏈表的頭指針發(fā)生了改變。如下圖所示。刪除語句為:head=head-next;10.4.2 單向鏈表的操作 鏈表的刪除 第43頁在刪除的時候要注意將被刪結(jié)點(diǎn)釋放,這樣系統(tǒng)才可以重新分配這些單元,所以完整的刪除語句為: p=hea

溫馨提示

  • 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

提交評論