




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、結(jié)構(gòu)體與共用體結(jié)構(gòu)體與共用體第十一章第十一章10.1 結(jié)構(gòu)體及其類型定義結(jié)構(gòu)體及其類型定義 已介紹的數(shù)據(jù)類型:簡單變量、數(shù)組、指針。已介紹的數(shù)據(jù)類型:簡單變量、數(shù)組、指針。例:例:建立學(xué)生檔案每一個學(xué)生的:學(xué)號(int num) 姓名(char name20) 性別(char sex) 年齡(int age) 存在的問題:難以處理一些較復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。存在的問題:難以處理一些較復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。成績(float score)地址(char addr30)C程序可將上述數(shù)據(jù)的集合定義為一種結(jié)構(gòu)體類型:struct student int num; char name20; char sex; in
2、t age; float score; char addr30;上述定義中: struct 關(guān)鍵詞(保留字), 表示定義一種結(jié)構(gòu)體類型。結(jié)構(gòu)體定義的一般形式: struct 結(jié)構(gòu)體名 成員表列; 成員表列:類型標(biāo)識符 成員名 以上僅說明了定義一種類型的方法,尚未定義變量。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)體類型再定義結(jié)構(gòu)體變量一、先定義結(jié)構(gòu)體類型再定義結(jié)構(gòu)體變量三種方法可用來定義結(jié)構(gòu)體變量:struct student x1, x2;
3、則 x1, x2為student 結(jié)構(gòu)型變量,x1, x2可存放student類型數(shù)據(jù)。例: struct student int num; char name20; char sex; int age; float score; char addr30;類型標(biāo)識符例:struct student int num; char name20; char sex; int age; char addr30; x1, x2;定義形式 struct 結(jié)構(gòu)體名成員表列 變量名表列;二、二、 在定義結(jié)構(gòu)體類型的同時定義變量在定義結(jié)構(gòu)體類型的同時定義變量:定義形式 struct 成員表列 變量名表列;不出現(xiàn)
4、結(jié)構(gòu)體類型名三、直接定義結(jié)構(gòu)類型變量三、直接定義結(jié)構(gòu)類型變量如:struct int num char name20; char sex; int age; char addr30; x1, x2;A) struct student int num; float age; ; struct student std1;以下對結(jié)構(gòu)體類型變量的定義中不正確的是:以下對結(jié)構(gòu)體類型變量的定義中不正確的是: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. 類型名與變量名是不同的概念 2. 允許成員名又為另一個已定義的結(jié)構(gòu)型變量 3. 每一個成員地位如同該類型的變量 4. 成員名與程序中的變量名可相同但意義不同幾點說明幾點說明: :一個嵌套定義的例子: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)體類型變量的引用結(jié)構(gòu)體類型變量的引用 如:x1為student型變量,則 x1.num: 表示x1的學(xué)號 : 表示x1的名字 x1.birthday.day: 表示x1的出生日 1. 只能用成員,不可用結(jié)構(gòu)體變量名直接運算2. 每一個分量的引用與其同類型的簡單變量的引用相同。引用結(jié)構(gòu)體變量實質(zhì)上為引用其成員引用結(jié)構(gòu)體變量實質(zhì)上為引用其成員用分量運算符用分量運算符.優(yōu)先級最高優(yōu)先級最高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)體變量在定義時可初始化:1. 結(jié)構(gòu)體變量不是一個簡單變量,它的值是由許多個基本數(shù)據(jù)組成。2. 在內(nèi)存中占有一段連續(xù)的存儲單元3. 占有的連續(xù)存儲單元大小取決于成員的數(shù)據(jù)類型如:如:struct exp int a; float b; char yn8; struct exp x=1234,56.7, text 若 x 的起始地址為2000, 則 x 在內(nèi)存中占有的存儲單元為:共用14個字節(jié)的連續(xù)單元123456.7test0ab2000200220062013yn84. 結(jié)構(gòu)體定義和變量定義及初始化可二合為一: str
8、uct exp int a; float b; char yn8; x=1234, 56. 7, test; 但不能這樣寫:但不能這樣寫: 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);錯誤原因:原因:結(jié)構(gòu)體變量中包含有多個不同類型的數(shù)據(jù)項。正確方法正確方法:對結(jié)構(gòu)體變量各成員的值進行輸入/輸出。如:如: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)體變量定義類似: struct student w3; w0.num: 表示w0的學(xué)號 : 表示w1的姓名對w數(shù)組也可初始化: struct student w3=8901, Li Ming , , , ;則有三個元素w0, w1, w2. 每一個元素為一個結(jié)構(gòu)student型變量。結(jié)構(gòu)體類型標(biāo)識符可省略大小說明,直接用賦初值確定其大小 struct student w =, ,;struct person char name20; int count; leader3=Li, 0,Zhang , 0, Hang , 0
10、;例:有三個侯選人,每一侯選人的數(shù)據(jù)包括其姓名和得票數(shù),則可定義結(jié)構(gòu)類型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 輸入:輸入:運行情況如下:運行情況如下: 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)指針變量,它可用來存放student型變量的地址numnameaddrpx1令p=&x1;則 p為x1的首地址.struct student p; (p).name (p).score 或者用“ ”運算符, p num, pname, p score. 稱為指向運算符, “ ”優(yōu)先級高于+, 。則:p num+1(x1.num)+ +pnum +(x1.num)先使用x1.num, 再加1先使x1.num加1,再用x1.num訪問x1的成員: 小結(jié):小結(jié): 引用結(jié)構(gòu)變量中
13、的成員有三種方法:(2) 用指針變量 (p).成員名 (p).num(3) 用指向運算符成員名 p num(1) 結(jié)構(gòu)體變量名.成員名 x1.num注意注意:指針變量p必須是結(jié)構(gòu)指針型,且有p=&x1;例:例:請指出下列程序的錯誤所在: struct person char name20; int count; x1=ZhongHua, 10; main( ) int *p;p=&x1;printf (%sn%dn, (*p).name, (*p).count)錯誤的原因: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為指向下一個元素的首地址。stu0 p+1 p+2(p) 用地址傳送,函數(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); 運行結(jié)果:zhao, 4qian, 3sun, 610.7 10.7 共用體類型數(shù)據(jù)共用體類型數(shù)據(jù)一、共用體數(shù)據(jù)類型的特點一、共用體數(shù)據(jù)類型的特點 與結(jié)構(gòu)體類似之處:由不同的數(shù)據(jù)項組成一個整體。 與結(jié)構(gòu)體不同之處:占用的內(nèi)存單元不同。二、共
16、用體類型定義二、共用體類型定義定義方式與結(jié)構(gòu)體類型完全相同。把結(jié)構(gòu)體類型中的關(guān)鍵字struct換成union即可。例例:struct memb float v;int n;char c; stag; stag占內(nèi)存7個字節(jié)的空間union memb float v;int n;char c; ustag; utag占的內(nèi)存空間為100110051007vnc2001vnc200220032004 共用體類型變量每次只能存放一個成員的值。三、共用體類型變量的引用三、共用體類型變量的引用引用方法同結(jié)構(gòu)體變量:(共用體類型變量名).共用體類型變量的輸入輸出同結(jié)構(gòu)體類型變量相同。例例:#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); 運行結(jié)果運行結(jié)果:36.7 13107想一想:想一想:若改變成員的賦值順序: utag.v=36.7 utag.c=T utag.n=18則則運行結(jié)果為運行結(jié)果為:36.5 84 T spe為共用體類型數(shù)組,每個數(shù)組元素所占用的內(nèi)存單元為:2001mudfsns20022003200420052006200711.7 用指針處理鏈
18、表 用數(shù)組存放數(shù)據(jù)時,必須事先定義固定的長度,數(shù)組元素在內(nèi)存中也是連續(xù)存放的,若元素個數(shù)不確定,則長度必須足夠大,造成內(nèi)存的浪費。 鏈表則不同,它根據(jù)需要開辟內(nèi)存單元,鏈表中各數(shù)據(jù)成員在內(nèi)存中可以不是連續(xù)存放的。可以用它來代替數(shù)組元素個數(shù)不確定的數(shù)組。 鏈表概述 鏈表必須利用指針變量才能實現(xiàn),單向鏈表包含一個指針,用來存放下一個結(jié)點的首地址。(雙鏈表包含兩個指針,一個用來指向它后面的結(jié)點,一個用來指向它前面的結(jié)點)單向鏈表的結(jié)構(gòu)形式單向鏈表的結(jié)構(gòu)形式如下圖所示單向鏈表的結(jié)構(gòu)形式如下圖所示1356A1475B1021CNULLD1249head 鏈表有一個鏈表有一個“頭指針頭指針”變量,存放一個
19、地址,變量,存放一個地址,該地址指向鏈表中的第一個元素。該地址指向鏈表中的第一個元素。 鏈表中每一個元素稱為鏈表中每一個元素稱為結(jié)點結(jié)點,每個結(jié)點都應(yīng),每個結(jié)點都應(yīng)包括兩個部分:一為包括兩個部分:一為用戶需要用的實際數(shù)據(jù)用戶需要用的實際數(shù)據(jù),二,二為為下一個結(jié)點的地址下一個結(jié)點的地址。 鏈表中最后一個元素稱為鏈表中最后一個元素稱為表尾表尾,它不再指向,它不再指向其他元素,它的地址部分為其他元素,它的地址部分為NULL。在語言中,用結(jié)構(gòu)類型結(jié)構(gòu)類型來描述結(jié)點結(jié)構(gòu)。例如: struct student int num;/*學(xué)號學(xué)號*/ int score;/*成績成績*/ struct stude
20、nt *next;/*指針域指針域*/ ;鏈表的數(shù)據(jù)結(jié)構(gòu),必須利用指針變量才能實現(xiàn)。語言對鏈表結(jié)點的結(jié)構(gòu)描述語言對鏈表結(jié)點的結(jié)構(gòu)描述 簡單鏈表簡單鏈表#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); 例:建立一個如右圖所示的簡單鏈表,它由例:建立一個如右圖所示的簡單鏈表,它由3 3個學(xué)生數(shù)據(jù)的個學(xué)生數(shù)據(jù)的結(jié)點組成并輸出各結(jié)點中的數(shù)據(jù)。結(jié)點組成并輸出各結(jié)點中的數(shù)據(jù)。89.51001901002851006numscorenextNULL處理動態(tài)鏈表所需庫函數(shù)處理動態(tài)鏈表所需庫函數(shù)malloc函數(shù)函數(shù)函數(shù)原型:函數(shù)原型:void *malloc(unsigned int size)作用:在內(nèi)存的動態(tài)存儲區(qū)中分配一個長度為作用:在
22、內(nèi)存的動態(tài)存儲區(qū)中分配一個長度為size的連續(xù)空間的連續(xù)空間返回值:成功,指向分配區(qū)域起始地址的指針;失敗,返回值:成功,指向分配區(qū)域起始地址的指針;失敗,NULL。calloc函數(shù)函數(shù)函數(shù)原型:函數(shù)原型:void *calloc(int n, unsigned size)作用:在內(nèi)存的動態(tài)存儲區(qū)中分配作用:在內(nèi)存的動態(tài)存儲區(qū)中分配n個長度為個長度為size的連續(xù)空間的連續(xù)空間返回值:成功,指向分配區(qū)域起始地址的指針;失敗,返回值:成功,指向分配區(qū)域起始地址的指針;失敗,NULL。free函數(shù)函數(shù)函數(shù)原型:函數(shù)原型:void free(void *p)作用:釋放由作用:釋放由p指向的內(nèi)存區(qū)指向
23、的內(nèi)存區(qū) 建立動態(tài)鏈表是指,從無到有地建立起建立動態(tài)鏈表是指,從無到有地建立起一個鏈表,即一個一個地開辟結(jié)點和輸入一個鏈表,即一個一個地開辟結(jié)點和輸入各結(jié)點數(shù)據(jù),并建立起前后相鏈的關(guān)系。各結(jié)點數(shù)據(jù),并建立起前后相鏈的關(guān)系。例:例:建立一個學(xué)生數(shù)據(jù)的單向鏈表。如果輸建立一個學(xué)生數(shù)據(jù)的單向鏈表。如果輸入的學(xué)號為入的學(xué)號為0,則建立過程結(jié)束。,則建立過程結(jié)束。 建立動態(tài)鏈表建立動態(tài)鏈表 基本思路基本思路: 定義好所需的結(jié)構(gòu)體類型,用求字節(jié)數(shù)運算符定義好所需的結(jié)構(gòu)體類型,用求字節(jié)數(shù)運算符“sizeof()”求出該結(jié)構(gòu)體類型數(shù)據(jù)所占用的長度。求出該結(jié)構(gòu)體類型數(shù)據(jù)所占用的長度。并定義三個指向結(jié)構(gòu)體類型的指
24、針并定義三個指向結(jié)構(gòu)體類型的指針head,p1,p2。 首先向系統(tǒng)用首先向系統(tǒng)用malloc( )函數(shù)申請一個結(jié)點的空間,函數(shù)申請一個結(jié)點的空間,并使并使p1指向它指向它 輸入該結(jié)點數(shù)據(jù)域的數(shù)據(jù)項,并將指針域置為空,輸入該結(jié)點數(shù)據(jù)域的數(shù)據(jù)項,并將指針域置為空,最后將該結(jié)點接到最后將該結(jié)點接到p2所指向的結(jié)點后面。所指向的結(jié)點后面。 3個指針變量個指針變量head、p1和和p2的說明如下:的說明如下: head頭指針變量,指向鏈表的第一個結(jié)頭指針變量,指向鏈表的第一個結(jié)點。點。 p1指向新申請的結(jié)點。指向新申請的結(jié)點。 p2指向鏈表的尾結(jié)點。指向鏈表的尾結(jié)點。#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é)點個數(shù)為外部變量,代表結(jié)點個數(shù)*/struct student *creat( ) /*定義函數(shù),它將帶回一個指向鏈表頭的指針定義函數(shù),它將帶回一個指向鏈表頭的指針*/ struct student *head; struct student *p1,*p2; p1=(struct student*)malloc(LEN); /*開辟一個新單元開辟一個新單
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è)一個指針變量設(shè)一個指針變量p, 使使p=head,即讓它指向第一個,即讓它指向第一個結(jié)點結(jié)點輸出輸出p所指向的結(jié)點的數(shù)據(jù)所指向的結(jié)點的數(shù)據(jù)使使p后移一結(jié)點,即后移一結(jié)點,即p=p-next,則,則p指向第二個結(jié)點指向第二個結(jié)點然后再輸出,如此循環(huán)直到鏈表的尾結(jié)點然后再輸出,如此循環(huán)直到鏈表的尾結(jié)點注意:注意:head的值由實參傳過來,也就是將已有的鏈表的值由實參傳過來
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é)點如果刪除結(jié)點C,則結(jié)點數(shù)減,則結(jié)點數(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定義兩個指針變量定義兩個指針變量p1,p2,并讓,并讓p1指向第一個結(jié)點指向第一個結(jié)點9910385NULLp1p1p2p2p1判斷判斷p1是不是要刪除的結(jié)點,若不是,則令是不是要刪除的結(jié)點,若不是,則令p2=p1;p1=p1-next;即使即使p2指向剛才檢查過的結(jié)點,指向剛才檢查過的結(jié)點,p1指向下一個結(jié)點指向下一個結(jié)點如此循環(huán),直到找到所要刪除的結(jié)點或檢查到最后一個結(jié)點為止如此循環(huán),直到找到所要刪除的結(jié)點或檢查到最后一個結(jié)點為止 若要刪除的是第一個結(jié)點若要刪除的是第一個結(jié)點p19910189.59910290
30、9910385NULLhead則將則將p1-next賦給賦給head,這時第一個結(jié)點已脫離鏈表,這時第一個結(jié)點已脫離鏈表,鏈表的頭指針鏈表的頭指針head指向原來的第二個結(jié)點指向原來的第二個結(jié)點 若刪除的不是第一個結(jié)點若刪除的不是第一個結(jié)點9910189.599102909910385NULLheadp1p2注意:還要考慮鏈表是空表(無結(jié)點)和鏈表中找不到要刪注意:還要考慮鏈表是空表(無結(jié)點)和鏈表中找不到要刪除的結(jié)點的情況除的結(jié)點的情況則令則令 p2-next=p1-next,此時此時p2-next由原來指向由原來指向p1指向的結(jié)點,改為指向指向的結(jié)點,改為指向p1-next所指的結(jié)點。也即
31、是所指的結(jié)點。也即是p1所指向的結(jié)點已被刪除,不再是鏈表中的一部分所指向的結(jié)點已被刪除,不再是鏈表中的一部分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é)點函數(shù)刪除鏈表結(jié)點函數(shù)del */定義三個指針變量定義三個指針變量p0,p1,p2。用。用p0指向待插入的結(jié)點,指向待插入的結(jié)點,p1指向第一個結(jié)點指向第一個結(jié)點鏈表的插入操作p1p19910290NULLp09910189.59910385head9910787.5NULLp2p2p1將將p0-num與與p1-num比較,若前者大于后者,則待插入的結(jié)點不應(yīng)比較,
33、若前者大于后者,則待插入的結(jié)點不應(yīng)在在p1所指的結(jié)點之前,此時將所指的結(jié)點之前,此時將p1后移,并使后移,并使p2指向指向p1剛才所指的結(jié)點剛才所指的結(jié)點再將再將p0-num與與p1-num比較,如此循環(huán),直到比較,如此循環(huán),直到p0-nump1-num或或p1所指的表尾為止所指的表尾為止如果插入的位置為第一結(jié)點之前如果插入的位置為第一結(jié)點之前p19910189.599103859910787.5NULLhead9910092NULLp0則將則將p0賦給賦給head,p1賦給賦給p0-next如果要插到表尾之后如果要插到表尾之后應(yīng)將應(yīng)將p0賦給賦給p1-next, NULL賦給賦給p0-nex
34、tp19910189.599103859910787.5NULLhead9910986NULLp0NULL如果既不在第一個結(jié)點之前如果既不在第一個結(jié)點之前又不在表尾結(jié)點之后又不在表尾結(jié)點之后則應(yīng)將則應(yīng)將p0的值賦給的值賦給p2-next,使使p2-next指向待插入的結(jié)指向待插入的結(jié)點,然后將點,然后將p1的值賦給的值賦給p0-next,即使即使p0-next指向指向p1所指的結(jié)點,這樣在第一個結(jié)點和第二個結(jié)點之間已插入了所指的結(jié)點,這樣在第一個結(jié)點和第二個結(jié)點之間已插入了一個新結(jié)點一個新結(jié)點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é)點函數(shù)insert */&構(gòu)造數(shù)據(jù)類型構(gòu)造數(shù)據(jù)類型,也叫聯(lián)合體也叫聯(lián)合體&用途:使幾個不同類型的變量共占一段內(nèi)存用途:使幾個不同類型的變量共占一段內(nèi)存(相互覆蓋相互覆蓋) 共用體類型定義共用體類型定義定義形式:定義形式:union 共用體名共用體名 類型標(biāo)識符類型標(biāo)識符1 成員名成員名1; 類型標(biāo)識符類型標(biāo)識符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)存,長度=最長成員所占字節(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); ( 編譯通過,運行結(jié)果不對編譯通過,運行結(jié)果不對) 不能引用共用體變量,只能不能引用共用體變量,只能引用其成員引用其成員,不能不能在定義共在定義共用體變量時用體變量時初始化初始化例例 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ū)別: 存儲方式不同存儲方式不同struct node char ch2; int k;a;union node char ch2; int k;b;achkbch k變量的各成員同時存在變量的各成員同時存在任一時刻只有一個成員存在任一時刻只有一個成員存在結(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 枚舉類型名枚舉類型名取值取值1,取值,取值2,取值,取值n;例如:例如:enum daySun,Mon,Tue,Wed,Thu,Fri,Sat; C在編譯時按順序分配給它們的值為在編譯時按順序分配給它們的值為0、1、2、3、4n。枚舉元素的值在定義時也可以由程序指定,如:枚舉元素的值在定義時也可以由程序指定,如:enum day Sun=7,Mon=1,Tue,Wed,Thu,Fri,Sat;定義定義Sun為為7, Mon為為1,后面的值順序加,后面的值順序加1,Sat就為就為6。 11.9 11.9 枚
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年洛陽市洛寧縣招聘政府專職消防員考試真題
- 倉庫保潔服務(wù)合同范本
- 出售車位合同范本
- 企業(yè)經(jīng)銷合同范本
- 2024年德陽市就業(yè)創(chuàng)業(yè)促進中心市本級公益性崗位招聘考試真題
- 個人房屋裝飾合同范本
- 買斷合同屬于合同范本
- 低價購買租賃合同范本
- 全案整裝合同范本
- 勞務(wù)聘用合同范本6
- 2023年南京市鼓樓區(qū)建寧路街道安監(jiān)辦招聘專職安全員考試真題及答案
- 2024陜西延長石油集團礦業(yè)公司所屬單位招聘筆試參考題庫附帶答案詳解
- 鄉(xiāng)鎮(zhèn)精神衛(wèi)生工作總結(jié)
- 井工煤礦中長期防治水規(guī)劃編制細則
- 2024年湘中幼兒師范高等??茖W(xué)校高職單招(英語/數(shù)學(xué)/語文)筆試歷年參考題庫含答案解析
- 設(shè)備使用手冊(范例模板)
- 上海房屋修繕工程培訓(xùn)課件
- 醫(yī)院電梯安全操作培訓(xùn)記錄
- 《讀懂財務(wù)報表》課件
- 《瘋狂動物城》全本臺詞中英文對照
- 建筑施工安全管理及揚塵治理檢查投標(biāo)方案(技術(shù)方案)
評論
0/150
提交評論