c语言结构体与共同体课件,《结构体与共同体》PPT课件.ppt
《《結構體與共同體》PPT課件.ppt》由會員分享,可在線閱讀,更多相關《《結構體與共同體》PPT課件.ppt(44頁珍藏版)》請在裝配圖網上搜索。
1、第9章 結構體與共同體,9.1 結構體 9.2 結構體數組 9.4 共用體,9.1 結構體,確定該類型數據的表示形式、取值范圍、存儲結構及其允許參加的運算。 在程序中每個變量在使用前要確定其類型,在前面所定義的類型都是標準類型。 在前面介紹的內容均為系統定義類型,用戶只要按要求用這些類型說明變量即可。,類型的作用,例如: int x; float y; char a30;,這些基本類型只能解決簡單的問題,而實際應用中的類型是千變萬化的。,簡單類型(整、實、字)的變量是獨立的,變量之間無內在的聯系;數組類型雖能同時存放多個數據,但必須是同類型的。 C允許用戶按需求自己定義類型。,例如:在計算機等。
2、級考試管理系統中,若每個考生 都有如下信息 :,考號 : 長整型 姓名 :字符串 性別 :字符 年齡 :無符號整型 報考等級:字符串 成績 :實型,數據分屬不同的類型,顯然不能采用前面已介紹過的類型來處理。 C語言提供了解決這類問題的類型結構體類型。,struct student1 int num; char name20; char class10; char sex; float score; ,struct student2 int num; char name20; char class10; date birth; ,struct date short year; short mon。
3、th ; short day; ,結構類型的定義,struct student1 stu1, stu2,方法1:,方法2:,struct student2 int num; char name20; char class10; date birth; stu1,stu2,在VC中若文件名*.cpp,用結構類型說明變量時可省略struct。,結構類型變量的定義,1. 由于結構類型是一個復合類型,其由多個成員組成,因此不能訪問結構體變量(同數組),只能按如下方法訪問變量的成員。 變量名 . 成員名 變量名 . 一級成員 . 二級成員 (嵌套時),結構類型變量的訪問,struct student1 。
4、stu1= 2001802,李, 計011,女,85.2 ; struct student2 stu2= 2001802,李, 計011,女, 12, 3, 1986, 85.2 ;,scanf(%d, stu1.num ); gets( stu2.name ); stu1.sex=getchar( ); stu1.birth.day=12; printf(“%d”, stu1.birth.day ); puts( stu2.name ),2.對成員,可根據其類型進行相應的運算。,3.由于結構型變量的成員多,C允許兩個同 類型的結構變量可互相整體賦值。,例如: struct s int no;。
5、 float score; stu1,stu2= 200123, 76.5 ; stu1=stu2;,4. 結構體變量中的各成員在內存中占一片連續的單元,其長度為: 各成員所占單元之和,5. 不能在定義類型時給成員賦值。,struct stu long num=97031; char name20 =li ming; char sex=m; student;,錯,不能對類型賦值!,可用結構類型定義指針。即存放結構對象的首地址。,例如: struct student int num; char name20; char sex; float score; ;,struct student x,*。
6、p; p=,由于結構類型變量占用連續單元,故p存放num成員的首地址,指向結構體的指針,結構型變量 . 成員名 結構型指針成員名,訪問成員時,有兩種表示:,見P.198 例9.3,結構體變量作為函數參數,因為結構體變量中的每個成員都被分配了存儲單元, 故當參數是結構體變量時, 采用值傳遞方式, 將實參的每個成員對應傳遞給形參成員。 見P.200 例9.4,9.5,9.2 結構體數組,單個結構型變量沒有實際的意義,可用簡單變量來完成工作。僅當結構體與數組相結合時,才能解決復雜問題,彌補數組的缺點。,用結構類型定義數組。即每個數組元素是結構類型。 見P.202-203,結構體數組的定義,stu1=。
7、97001; 錯誤 stu1.num=97001; 正確,1. 可引用數組元素的成員,不能引用數組元素。因為每 個數組元素是結構類型。,2. 同一結構體類型變量及數組元素之間可整體賦值。,struct student s1,s10; s1=s2; s1=s0; 正確,結構體數組的訪問,struct student int num; char name20; char class10; char sex; float score4; void main() struct student stu3; int j ;,例如:輸入/出3個學生的信息,每個學生的信息如下:學號,姓名,班級,性別,4門成績。
8、。,for( j=0; j3; j+) scanf(“%d”, ,輸出同上。,例程9-1:,某單位有3人參加04年計算機等級考試?,F需將每名考生的準考證號、姓名、性別、報考級別和成績錄入計算機,并統計平均分和及格率。,例程9-02: 利用指針訪問結構型數組。,9.3 鏈 表,一、鏈表的概述:,將數組與結構配合起來使用,可以解決復雜的數據結構,但數組仍需靜態定義。,雖然可利用malloc函數動態分配存儲單元,但這些動態分配的單元地址不連續,或只能按數組的形式分配單元,仍然不是完全動態分配。,C程序提供了鏈表類型來解決上述矛盾。,1、什么是鏈表?,一種動態分配的數據結構。即用指針變量和結構變量將非。
9、連續的數據塊連成一個整體的一種數據結構。,例如:,A,B,C,上述三個變量間沒有任何聯系,若希望象數組那樣,借助于一個變量的首地址,就能訪問到其他變量。,將B的地址存放到A中,將C的地址存放到B中,將A的地址保存,這樣就可以通過A變量找到其他變量。,只能按如下方法處理:,即每個變量必須是結構類型,至少有兩個成員:一個用來存放本變量的數據,另一個存放某變量的地址。這樣只要知道第一個結構變量的地址,就能通過該變量的地址成員中的地址找到某變量。,鏈表:將若干數據項按一定的原則連接起來的表,表中由若干元素組成,每個元素稱為接點。, pnew=p=(struct stu *)malloc(LEN); 并。
10、給首結點各域賦值。,3)在循環中: 1) 利用malloc函數,產生動態單元(pnew )。 2)給動態單元pnew賦值。 3)將動態單元pnew掛到鏈表的尾部。,#define LEN sizeof( STU ) struct STU long num; float score; STU next; ;,同時定義三個指向這種類型的指針變量head, pnew, p.,例程: 寫一個函數,建立5名學生數據的單向鏈表,每一個學生的數據塊(結點)定義如下:,STU creat( ) / 賦初值 STU head, p, pnew ,int n=0; head=NULL; pnew=p=( STU 。
11、) malloc( LEN ); scanf( %d %f , ,建立鏈表,pnew=(STU ) malloc(LEN); scanf(%ld, %f, ,pnext=NULL; / 給尾指針賦空 return(head); ,while ( pnewnum != 0 ) n+ +; if( n= =1) head=pnew ; / 將結點掛到表尾 else pnext =pnew;,p=pnew; / 使hear指向當前表尾,void print ( STU head ) STU p; p=head; if (p = = NULL) printf(“Null List!”); do pri。
12、ntf(%ld %5.1f n, pnum, pscore); p=pnext ; while (p!=NULL); ,輸出鏈表,例如:,2、鏈表的刪除和插入,鏈表的刪除 :,刪除結點操作: 若用2個指針操作 p.next=p1.next 若用1個指針操作 p.next=p.next.next,一般給出某一條件,當某一條件成立時,則刪除該結點:,STU del ( STU head, long num ) STU p1, p ; if ( head= =NULL ) printf( n list null!=n“ ); return (head); ,1)表為空時,無任何刪除 2)當第一個結點。
13、被刪除時,修改表頭 3)當最后一個結點不滿足條件時,返回。,p1=head; while ( num != p1num 尋找刪除點,if ( num= =p1num ) if (p1= =head) head=p1next; else pnext=p1next; printf (delete: %ld n, num); n ; else printf (%ld not been found!n, num);,一般鏈表中結點的關鍵數據按順序輸入,待插入結點的關鍵數據與鏈表中的關鍵數據一一比較,插入適當的位置。,鏈表的插入,head,例如:,插入操作: new.next=p.next; p.nex。
14、t=new;,步驟: 1)定義3個指針new(指向待插入結點),p1(當前待操作結點),p(p1之前的結點),并賦初值。,2)若鏈表為空,則插入到表頭,作為第一個結點。,3)若鏈表不為空,尋找插入點。 a. 若插入到第一個結點之前,則改變頭指針的值。 b. 若插入在表中或表尾,則執行相應的插入操作。,算法:,STU insert( STU *head, STU *new ) 待插入的結點可在函 STU *p1, *p; 數中輸入 p1=head; if( head=NULL) 若為空表,將結點掛 head=new; newnext=NULL; 在頭結點 else while( newnum p。
15、1num ) 尋找插入點,if( newnum =p1num ) if (head = p1) head=new; 插入在表頭 else pnext=new; 插入在表中 newnext=p1; else p1next=new ; newnext=NULL; 插入在表尾 n+; return( head ); 9-4.c 9-5.c,9.4 共有體,二、共用體數據類型的特點,幾個不同類型的數據共用同一個存儲單元。共用體變量所占內存長度=最長成員的長度,各成員輪流使用一個單元,所以共同體變量及其各成員地址相同。每一瞬間只能存放一個成員,共用體中起作用的是最后一次存入的成員。,一、共用體類型定義,。
16、把結構體類型中的關鍵字struct換成union即可。,例如: struct memb, float v;,int n;,char c;, stag;,stag占內存7個字節的空間,union memb, float v;,int n;,char c;, ustag;,utag分配 4字節, 共用體類型變量每次只能存放一個成員的值。,三、共用體類型變量的引用,(共用體類型變量名). 成員名,1、共用體類型變量的訪問同結構體類型變量。 2、不能對共同體變量初始化。 union int i; char ch; x=6, A 錯誤,例程 #include,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);,例程9-3: 某單位有3名職工參加計算機辦公應用技能考試。設每個人的數據包括考號、姓名、年齡、和成績。單位規定年齡為25歲以下的職工進行筆試,成績為百分制,60分以上為及格。而25歲以上的職工進行操作考試,考試成績為A、B、C 、D,C級以上為及格。請統計考試及格的人數,并輸出每位考生考試的成績。
總結
以上是生活随笔為你收集整理的c语言结构体与共同体课件,《结构体与共同体》PPT课件.ppt的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言程序设计精髓第二周,2实型数据C语
- 下一篇: Android宫格动态列,Android