C語言程序設計基礎課件 第11章自定義類型_第1頁
C語言程序設計基礎課件 第11章自定義類型_第2頁
C語言程序設計基礎課件 第11章自定義類型_第3頁
C語言程序設計基礎課件 第11章自定義類型_第4頁
C語言程序設計基礎課件 第11章自定義類型_第5頁
已閱讀5頁,還剩27頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

C語言程序設計

第11章自定義類型2num:num[0]num[1]num[2]num[3]num[4]10011002100310041005sex:sex[0]sex[1]sex[2]sex[3]sex[4]'M''F''M''F''F'score:score[0]score[1]score[2]score[3]score[4]85.090.092.070.079.00'Z''h''a''o''\0''\0''\0''\0''\0''\0'1'Q''i''a''n''\0''\0''\0''\0''\0''\0'2'S''u''n''\0''\0''\0''\0''\0''\0''\0'3'L''i''\0''\0''\0''\0''\0''\0''\0''\0'4'Z''h''o''u''\0''\0''\0''\0''\0''\0'name:管理學生成績constintN=5;intnum[N]; //學號charname[N][10]; //姓名charsex[N]; //性別floatscore[N]; //分數不同信息分散在不同變量,不便操作,且容易出錯。概述?能否用一個變量來保存一個學生的學號、姓名、性別、分數的所有信息呢?結構體自定義類型——結構體intfloatdoublechar自定義類型允許自己設計新的數據類型,定義了新類型后,就能用新類型定義變量。structstu{

intnum;

charname[10];

charsex;

floatscore;};定義一種自定義數據類型類型沒有內存空間,不能保存數據structstuboy1;intfloatdoublecharstructstu

這是一個變量不是定義變量!不是定義變量,而是設計成員(各成員的類型可以不同)定義新類型的變量,開辟內存空間numnamesexscoreboy1:stuboy1;使用結構體變量structstu{

intnum;

charname[10];

charsex;

floatscore;};structstuboy1;numnamesexscoreboy1:boy1=1001;scanf(%d",&boy1);printf("%d",boy1);boy1.num=1001;boy1.sex='M';boy1.score=85.0;="Zhao";strcpy(,"Zhao");printf("%d\n",boy1.num);printf("%f\n",boy1.score);printf("%s\n",);printf("%c\n",[1]);結構體變量名.成員名numnamesexscore1001numnamesexscore1001'M'numnamesexscore1001'M'85.0name是數組名,是假想的指針變量,值不能改1001

100185.000000

100185.000000zhao100185.000000zhaoh?????\0oahz結構體類型和結構體變量的區別結構體類型boy1:numnamesexscorestructstu{

intnum;

charname[10];

charsex;

floatscore;};boy2:numnamesexscoreprintf("%d",sizeof(boy1));printf("%d",sizeof(boy2));printf("%d",sizeof(structstu));printf("%d",sizeof(stu));202020特殊地,sizeof對類型和變量均可使用stu.num=1001;printf("%f",stu.score);boy1.num=1001;printf("%f",boy2.score);結構體類型的變量產品有內存空間,可以保存數據類型叫structstu,不叫stustructstu{

intnum;

charname[10];

charsex;

floatscore;};圖紙不占內存,不能保存數據先定義類型,然后才能定義變量結構體類型變量的定義方式①先定義類型,再定義變量structstu{

intnum;

charname[10];

charsex;

floatscore;};structstuboy1,boy2;structstu{

intnum;

charname[10];

charsex;

floatscore;}boy1,boy2;②定義類型的同時,定義變量③定義類型的同時定義變量,但省略類型名

struct{

intnum;

charname[10];

charsex;

floatscore;}boy1,boy2;structstuboy3;無法再定義其他變量如boy3,因類型無名結構體類型變量的初始化在定義結構體變量時也可對結構體變量賦初值,方法是將各成員的值按類型定義時的各成員順序,依次放在一對{}內。structstuboy2,boy1={1001,"zhao",'M',85.0};numnamesexscoreboy1:numnamesexscore1001numnamesexscorenumnamesexscore1001'M'85.0boy2:scoresexnamenum??????????????????\0oahzstructstu{

intnum;

charname[10];

charsex;

floatscore;};結構體變量之間的賦值structstu{

intnum;

charname[10];

charsex;

floatscore;};numnamesexscoreboy1:numnamesexscore1001numnamesexscore1001'M'numnamesexscore1001'M'85.0?????\0oahzboy2=boy1;可以整體賦值:所有成員一次性全部賦值,因為是2個變量boy2:scoresexnamenum?????????????85.0'M'1001?????\0oahz結構體類型的數組數組的元素也可以是結構體類型的,稱為結構體數組。每個元素都是相同結構體類型的變量。一本通訊錄,每一頁是一個結構體變量,一本就是一個結構體數組。structstuss[3];ss:numnamesexscore????numnamesexscore????numnamesexscore????ss[0]ss[1]ss[2]ss[0].num=1001;strcpy(ss[1].name,"Qian");ss[2].score=92.0;1001Qian\092.0結構指針變量一個指針變量當用來指向一個結構體類型的變量時,稱結構指針變量。structstuboy1;structstu*p;p=&boy1;p=&stu;stu是類型,不是變量,沒有內存空間,更無地址p=&boy1.num;boy1.num是int,p基類型是stu不是int,不能指向int

若:int*q;

q=&boy1.num;正確1000p:[]2000numnamesexscoreboy1:p:[1000]2000通過結構指針變量訪問結構體變量p->num=1001;boy1.num=1001;strcpy(p->name,"Zhang");strcpy(boy1.name,"Zhang");(*p).score=92.0;boy1.score=92.0;結構體變量用

.結構體指針變量用->(*結構體指針變量)

.*p.score.

和->

的優先級都最高(與()相當),這相當于*92.0,故錯誤1000numnamesexscoreboy1:p:[1000]2000structstuboy1;structstu*p;p=&boy1;一個指針變量當用來指向一個結構體類型的變量時,稱結構指針變量。100192.0\0????gnahz結構體指針指向結構體數組結構指針變量也可以指向一個結構體數組。ps+1或ps-1會移動一個元素(一個“結構體變量”)所占字節數,與普通數組的一致。structstux[3];structstu*ps=x;ps++;100010201040x:numnameage1Zhang\020numnameage2Wang\019numnameage3Zhao\018x[0]x[1]x[2]x:[1000]1000

ps:[1000]2000

[1020]

ps++;[1040]

x+2的值為:1040結構體類型數據做函數參數1)重口味:結構體類型變量作函數參數fun(structstua){…}2)輕口味:結構體指針作函數參數fun(structstu*p){…}全部成員整體傳送fun的空間main的空間numnamesexscore1001Zhao\0'M'85.0numnamesexscore1001Zhao\0'M'85.0形參:實參:fun的空間main的空間numnamesexscore1001Zhao\0'M'85.0形參:實參:[1000]20001000只傳送一個地址(4字節)時間和空間開銷都很大;但在函數中如果改變了形參的某個成員的值,不影響實參。無論成員多少,只傳4字節,提高了效率;但在函數中如果改變了形參所存地址所對應空間的值,實參變量的值就被改變。結構體變量作函數參數fun的空間

main的空間numnamesexscore1003Sun\0'M'92.0s:numnamesexscore1003Sun\0'M'92.0t:1003SunM921003SunM921003SunM92102Zhang\0'F'90.0#include<string.h>structperson{ intnum;

charname[10];

charsex;

floatscore;};voidfun(structpersont)//傳遞變量{ t.num=102; strcpy(,"Zhang"); t.sex='F'; t.score=90;}main(){ structpersons={101,"Li",'M',75};

printf("(1)S:%d%s%c%f\n", s.num,,s.sex,s.score); fun(s);

printf("(2)S:%d%s%c%f\n", s.num,,s.sex,s.score);}結構體指針作函數參數#include<string.h>structperson{ intnum;

charname[10];

charsex;

floatscore;};voidfun(structperson*ps)/*傳遞指針*/{ ps->num=102; strcpy(ps->name,"Zhang");

ps->sex='F';ps->score=90;}main(){ structpersons={101,"Li",'M',75};

printf("(1)S:%d%s%c%f\n", s.num,,s.sex,s.score);

fun(&s);

printf("(2)S:%d%s%c%f\n", s.num,,s.sex,s.score);}main的空間

numnamesexscore101Li\0'M'75.0s:fun的空間

ps:[1000]20001000102Zhang\0'F'90.0(1)S:101LiM75.000000(1)S:101LiM75.000000(2)S:102ZhangF90.000000#include<stdio.h>#include<string.h>structA{inta;charb[10];doublec;};structAf(structAt);main(){structAa={1001,"Zhang",1098.0};a=f(a);printf("%d,%s,%6.1f\n",a.a,a.b,a.c);}structAf(structAt){t.a=1002;strcpy(t.b,"Chang");t.c=1202.0;returnt;}main的空間

F1的空間

結構體類型的變量作為返回值a:abc10011098.01000Zhang\0\0\0\0\0t:abc10011098.02000Zhang\0\0\0\0\01002,Chang,1202.01002Chang\01202.010021202.0Chang\0\0\0\0\01002Chang\01202.0structstu{ intnum;

charname[10];

charsex;

struct { intyear; intmonth; intday; }birthday;

floatscore;};structstu{ intnum;

charname[10];

charsex;

structdate { intyear; intmonth; intday; }birthday;

floatscore;};結構體類型的嵌套structdate{ intyear; intmonth; intday;};structstu{ intnum; charname[10];

charsex; structdatebirthday;

floatscore;};可省略“日期”結構體名date或:structstua,*p=&a;a.birthday.year=2002;p->birthday.month=12;(*p).birthday.day=21;numnamesexbirthdayscoreyearmonthdaya:p:[1000]2000100020022112類型定義符typedef類型定義語句typedeftypedef為類型起“綽號”typedefint

INTEGER;這以后就可用INTEGER來代替int作類型說明了INTEGERa,b;inta,b;typedef

某類型“變量”定義形式;并不產生新的數據類型,只是給已有的類型增加新名;“變量”相當的位置為新類型名。typedefdouble

real;reala,b;doublea,b;typedefint*

INTPTR;INTPTRp;int*p;typedefunsignedlongUINT32;UINT32x,y;unsignedlongx,y;這以后就可用real來代替double作類型說明了這以后就可用INTPTR來代替int*作類型說明了

這以后就可用UINT32來代替unsignedlong作類型說明了用typedef為結構體類型起別名typedefstructstu{intnum;charname[10];charsex;floatscore;}

ST;ST

boy1,boy2;structstugirl1,girl2;ST

boy1,boy2;STgirl1,girl2;動態存儲分配C語言常用內存管理庫函數(包含stdlib.h)

函數功能用法malloc分配1塊長度為size字節的連續內存空間(不清零),函數返回該空間的首地址;如分配失敗函數返回0(類型說明符*)malloc(size)calloc分配n塊、每塊長度為size字節的連續內存空間(共size×n字節),并將該空間中的內容全部清零,函數返回該空間的首地址;如分配失敗函數返回0(類型說明符*)calloc(n,size)free釋放ptr所指向的一塊內存空間,ptr是由malloc或calloc函數所分配空間的地址,即是這兩個函數的返回值(或類型轉換后的返回值)free(ptr)(ptr為任意基類型的指針)動態存儲分配例float*q,*r;char*pc;structstudent*ps;q=(float

*)malloc(4);

/*分配4字節的空間,用于保存float型數據*/pc=(char

*)malloc(100);

/*分配100字節的空間,用于保存char型數組*/r=(float

*)calloc(5,4); /*分配5塊每塊4字節的空間,共20字節

用于保存含5個元素的float型數組*/ps=(structstudent*)calloc(10,

sizeof(structstudent)); /*分配10塊每塊為一個structstudent類型數據大小的空間,用于保存10個元素的structstudent型數組*/練習#include<stdio.h>#include<string.h>#include<stdlib.h>main(){ char*p;inti; p=(char*)malloc(sizeof(char)*20);

strcpy(p,"welcome");

for(i=6;i>=0;i--) putchar(*(p+i)); printf("\n");

free(p);}1000...'w''e''l''c''o''m''\0''e'p:[1000]2000

100610071001eememoemoclew鏈表鏈表18[0]200019[4000]500015[]400012[2000]1000datanextdatanextdatanext1000

datanext鏈表各元素的邏輯結構與存儲結構一般不一致。以鏈接方式存儲的線性表structnode{ intdata;

structnode*next;};datanextX[5000]頭結點一般增加頭結點以方便編程3000鏈表處理編程套路鏈表處理編程套路(設結點結構體類型別名為SNODE,成員為data和next;頭結點指針為h):

SNODE*p;

/*有時類型別名為:NODE、SLIST、STYPE等,視題目而定*/

p=h->next;while(p) /*或寫為:while(p!=0)注意不是

while(*p)*/{

處理p->data;/*有時數據成員名為:s,視題目而定*/ p=p->next; }鏈表的遍歷/*依次輸出鏈表中的數據,h是頭結點的地址*/voidoutlist(SNODE*h){ SNODE*p; p=h->next;

while(p) /*也可寫為while(p!=0)*/ { printf("%d",p->data); p=p->next; }}main(){ inta[N]={19,15,12,18,11};

SNODE*head;/*head保存頭結點的地址*/ head=createlist(a); /*建立鏈表*/ outlist(head); /*輸出鏈表*/ destroylist(head); /*銷毀鏈表*/}習題請編寫函數sumlist,其原型如下:intsumlist(SNODE*h)函數的功能是求上例建立的鏈表中各結點數據域之和,并由函數返回,形參h指向鏈表的頭結點。使main函數對此函數的調用為printf("%d",sumlist(head));則能輸出和。

intsumlist(SNODE*h){ SNODE*p;ints=0; p=h->next;

while(p) { s+=p->data; p=p->next; }

returns;}習題2請編寫函數maxlist,其原型如下:intmaxlist(SNODE*h)函數的功能是求上例建立的鏈表中各結點數據域中

溫馨提示

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

評論

0/150

提交評論