第9章-用戶自己建立數(shù)據(jù)類型_第1頁(yè)
第9章-用戶自己建立數(shù)據(jù)類型_第2頁(yè)
第9章-用戶自己建立數(shù)據(jù)類型_第3頁(yè)
第9章-用戶自己建立數(shù)據(jù)類型_第4頁(yè)
第9章-用戶自己建立數(shù)據(jù)類型_第5頁(yè)
已閱讀5頁(yè),還剩60頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第9章

用戶自己定義數(shù)據(jù)類型

—C程序設(shè)計(jì)本章要點(diǎn)結(jié)構(gòu)體的定義和引用結(jié)構(gòu)體數(shù)組指向結(jié)構(gòu)體類型數(shù)據(jù)的指針鏈表主要內(nèi)容概述定義結(jié)構(gòu)體類型變量的方法(9.1)結(jié)構(gòu)體數(shù)組(9.2)指向結(jié)構(gòu)體類型數(shù)據(jù)的指針(9.3)用指針處理鏈表(9.4)共用體(9.5)用typedef定義類型(9.6)概述C語(yǔ)言的數(shù)據(jù)類型:C數(shù)據(jù)類型基本類型構(gòu)造類型指針類型空類型void字符類型char枚舉類型enum整型實(shí)型單精度型float雙精度型double數(shù)組結(jié)構(gòu)體struct共用體union短整型short長(zhǎng)整型long整型int結(jié)構(gòu)體struct概述

為何引進(jìn)結(jié)構(gòu)體?一類問(wèn)題學(xué)生的學(xué)號(hào)、姓名、性別、年齡等信息圖書(shū)的書(shū)號(hào)、書(shū)名、出版社、價(jià)格等貨物的貨號(hào)、貨名、進(jìn)出貨日期、價(jià)格等這類問(wèn)題中數(shù)據(jù)有何特點(diǎn),如何存儲(chǔ)?特點(diǎn)由幾個(gè)不同類型的數(shù)據(jù)組成一個(gè)有機(jī)整體。這個(gè)整體用一個(gè)數(shù)據(jù)元素表示。存儲(chǔ):需要按一定順序同時(shí)存儲(chǔ)這些不同類型的數(shù)據(jù)。結(jié)構(gòu)體:一組具有不同數(shù)據(jù)類型的數(shù)據(jù)的有序集合。結(jié)構(gòu)體的每個(gè)元素包含若干個(gè)不同數(shù)據(jù)類型的成員。結(jié)構(gòu)體的各個(gè)元素結(jié)構(gòu)相同。定義結(jié)構(gòu)體類型(9.1.1)結(jié)構(gòu)體類型的聲明一般形式:struct[結(jié)構(gòu)體名]{

成員表列};類型名成員名;類型名成員名;

……如:structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};;不可或缺說(shuō)明:上述定義僅僅聲明一個(gè)結(jié)構(gòu)體類型,還未定義結(jié)構(gòu)體變量,還未分配內(nèi)存。標(biāo)識(shí)符表示定義結(jié)構(gòu)體類型變量的方法(9.1)定義結(jié)構(gòu)體變量的三種方式:1.先聲明結(jié)構(gòu)體類型再定義變量聲明結(jié)構(gòu)體類型struct結(jié)構(gòu)體名{

類型名成員名;類型名成員名;

……};定義結(jié)構(gòu)體變量struct結(jié)構(gòu)體名變量名表列;如:structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};structstudentstu1,stu2;定義結(jié)構(gòu)體類型變量的方法(9.1)2.在聲明類型的同時(shí)定義變量struct結(jié)構(gòu)體名{

類型名成員名;類型名成員名;

……}變量名列表;structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;struct{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;3.直接定義結(jié)構(gòu)體類型變量struct{

類型名成員名;類型名成員名;

…….}變量名列表;定義結(jié)構(gòu)體類型變量的方法(9.1)內(nèi)存分配在定義了結(jié)構(gòu)體變量后,系統(tǒng)為之分配的內(nèi)存單元字節(jié)數(shù)是結(jié)構(gòu)體變量中各個(gè)成員的字節(jié)數(shù)之和。例如:stu1和stu2在內(nèi)存中各占63個(gè)字節(jié)(4+20+1+4+4+30=63)。namenumsexagescoreaddr4字節(jié)4字節(jié)20字節(jié)1字節(jié)4字節(jié)30字節(jié)……..namenumsexagescoreaddr4字節(jié)4字節(jié)20字節(jié)1字節(jié)4字節(jié)30字節(jié)……..stu2stu1structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;定義結(jié)構(gòu)體類型變量的方法關(guān)于結(jié)構(gòu)體類型的說(shuō)明:類型和變量是不同的概念類型:確定一類數(shù)據(jù)的結(jié)構(gòu)與性質(zhì);變量:數(shù)據(jù)類型:不分配內(nèi)存;變量:分配內(nèi)存類型:不能賦值、存取、運(yùn)算;

變量:可以運(yùn)算結(jié)構(gòu)體變量的成員可以單獨(dú)使用,相當(dāng)于普通變量。成員名可以與程序中的變量名相同,互不干擾。結(jié)構(gòu)體可以嵌套,成員也可以是一個(gè)結(jié)構(gòu)體。定義嵌套的結(jié)構(gòu)體類型時(shí),應(yīng)滿足先定義后引用的原則。numnamebirthdaymonthdayyearstructstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;floatscore;例structdate{intmonth;intday;intyear;};structstudent{intnum;charname[20];structdatebirthday;}stu;結(jié)構(gòu)體變量的引用結(jié)構(gòu)體變量的引用除了賦值運(yùn)算外,不能整體引用結(jié)構(gòu)體變量,只能引用其成員。成員引用方式:結(jié)構(gòu)體變量名.成員名例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;stu1.num=10;stu1.score=85.5;stu1.score+=stu2.score;stu1.age++;.成員運(yùn)算符,優(yōu)先級(jí)最高,從左到右對(duì)結(jié)構(gòu)體變量的成員可以像普通變量一樣進(jìn)行各種運(yùn)算。例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;printf(“%d,%s,%c,%d,%f,%s\n”,stu1);()stu1={101,“WanLin”,‘M’,19,87.5,“DaLian”};()if(stu1==stu2)……..()結(jié)構(gòu)體變量的引用結(jié)構(gòu)體變量的引用不能將一個(gè)結(jié)構(gòu)體變量作為一個(gè)整體進(jìn)行輸入輸出,對(duì)結(jié)構(gòu)體變量的輸入輸出應(yīng)對(duì)其成員逐個(gè)進(jìn)行。例1:結(jié)構(gòu)體變量的輸入輸出。#include<stdio.h>//例1structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};intmain(){structstudentstu;\\定義結(jié)構(gòu)體student變量scanf("%d\n",&stu.num);gets();scanf("%c%d%f\n",&stu.sex,&stu.age,&stu.score);gets(stu.addr);printf("%d\n%s\n%c\n%d\n%.1f\n%s\n",stu.num,,stu.sex,stu.age,stu.score,stu.addr);return0;}輸入:1001LiQiangM1880

200BeijingRoad輸出:1001LiQiangM1880.0

200BeijingRoad結(jié)構(gòu)體變量的引用結(jié)構(gòu)體變量的引用可以將一個(gè)結(jié)構(gòu)體變量的值賦值給另一個(gè)結(jié)構(gòu)體變量例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;stu2=stu1;()結(jié)構(gòu)體變量的引用結(jié)構(gòu)體變量的引用結(jié)構(gòu)體嵌套時(shí)逐級(jí)引用,直至最低級(jí)。例structdate{intmonth;intday;intyear;};structstudent{intnum;charname[20];structdatebirthday;}stu1,stu2;可以這樣訪問(wèn)其成員:stu1.birthday.year不能用stu1.birthday來(lái)直接訪問(wèn)stu1變量中的成員birthday,因?yàn)閟tu1.birthday本身是一個(gè)結(jié)構(gòu)體變量。結(jié)構(gòu)體變量的初始化形式一:struct結(jié)構(gòu)體名{類型名成員名;類型名成員名;

……};struct結(jié)構(gòu)體名結(jié)構(gòu)體變量={初始數(shù)據(jù)};例structstudent{intnum;charname[20];charsex;intage;charaddr[30];};structstudentstu1={112,"WangLin",'M',19,"200BeijingRoad"};結(jié)構(gòu)體變量的初始化結(jié)構(gòu)體變量的初始化形式二:struct結(jié)構(gòu)體名{

類型名成員名;類型名成員名;

……}結(jié)構(gòu)體變量={初始數(shù)據(jù)};例structstudent{intnum;charname[20];charsex;intage;charaddr[30];}stu1={112,"WangLin",'M',19,"200BeijingRoad"};

結(jié)構(gòu)體變量的初始化結(jié)構(gòu)體變量的初始化形式三:

struct{類型名成員名;類型名成員名;

……}結(jié)構(gòu)體變量={初始數(shù)據(jù)};例struct{intnum;charname[20];charsex;intage;charaddr[30];}stu1={112,"WangLin",'M',19,"200BeijingRoad"};

結(jié)構(gòu)體變量的初始化結(jié)構(gòu)體變量的初始化例9.1對(duì)結(jié)構(gòu)體變量初始化.//例9.1

#include<stdio.h>intmain(){structstudent

{longintnum;

charname[20];

charsex;

charaddr[20];

}a={10101,"LiLin",'M',"123BeijingRoad"};

/*對(duì)結(jié)構(gòu)體變量a賦初值*/

printf(“No.:%ld\nname:%s\nsex:%c\naddress:%s\n”,a.num,,a.sex,a.addr);

return0;}運(yùn)行結(jié)果:No.:10101name:LiLinsex:Maddress:123BeijingRoad結(jié)構(gòu)體數(shù)組(9.2)結(jié)構(gòu)體數(shù)組的定義形式一:structstudent{intnum;charname[20];charsex;intage;};structstudentstu[2];形式二:structstudent{intnum;charname[20];charsex;intage;}stu[2];形式三:struct{intnum;charname[20];charsex;intage;}stu[2];numnamesexagenumnamesexagestu[0]stu[1]29B分行初始化:structstudent{intnum;charname[20];charsex;intage;};structstudentstu[3]={{100,"WangLin",'M',20},{101,"LiGang",'M',19},{110,"LiuYan",'F',19}};全部初始化時(shí)數(shù)組大小可省結(jié)構(gòu)體數(shù)組初始化分行初始化:struct{intnum;charname[20];charsex;intage;}stu[]={{100,"WangLin",'M',20},{101,"LiGang",'M',19},{110,"LiuYan",'F',19}};分行初始化:structstudent{intnum;charname[20];charsex;intage;}stu[]={{100,"WangLin",'M',20},{101,"LiGang",'M',19},{110,"LiuYan",'F',19}};結(jié)構(gòu)體數(shù)組(9.2)順序初始化:structstudent{intnum;charname[20];charsex;intage;};structstudentstu[]={100,"WangLin",'M',20,101,"LiGang",'M',19,110,"LiuYan",'F',19};

structstudent{intnum;charname[20];charsex;intage;}stu[3];stu[1].age++;strcpy(stu[0].name,"ZhaoDa");結(jié)構(gòu)體數(shù)組引用引用方式:結(jié)構(gòu)體數(shù)組名[下標(biāo)].成員名結(jié)構(gòu)體數(shù)組(9.2)結(jié)構(gòu)體數(shù)組的每個(gè)元素都是一個(gè)結(jié)構(gòu)體變量,使用規(guī)則如同一般的結(jié)構(gòu)體變量。結(jié)構(gòu)體數(shù)組例9.2對(duì)候選人得票的統(tǒng)計(jì)程序。設(shè)有3個(gè)候選人,每次輸入一個(gè)得票的候選人的名字,要求最后輸出各人得票結(jié)果。#include"stdio.h"http://例9.2程序1#include"string.h"#defineN100structperson{charname[20];intcount;}leader[3]={"Li",0,"Zhang",0,"Fun",0};voidmain(){inti,j;charleader_name[20];for(i=1;i<=N;i++){scanf("%s",leader_name);for(j=0;j<3;j++) if(strcmp(leader_name,leader[j].name)==0) leader[j].count++;}for(i=0;i<3;i++)printf("%5s:%d\n",leader[i].name,leader[i].count);}namecountLiZhangFun000指向結(jié)構(gòu)體類型數(shù)據(jù)的指針(9.3)指向結(jié)構(gòu)體變量的指針一個(gè)結(jié)構(gòu)體變量的指針就是該變量所占內(nèi)存的起始地址。例9.3指向結(jié)構(gòu)體變量的指針的應(yīng)用#include<string.h>//例9.3#include<stdio.h>

structstudent{longnum;charname[20];

charsex;floatscore;};intmain()

{

structstudentstu_1;

structstudent*p;p=&stu_1;stu_1.num=89101;strcpy(stu_1.name,"LiLin");

stu_1.sex='M';stu_1.score=89.5;

printf("No.:%ld\nname:%s\nsex:%c\nscore:%f\n",stu_1.num,stu_1.name,stu_1.sex,stu_1.score);printf("No.:%ld\nname:%s\nsex:%c\nscore:%f\n",(*p).num,(*p).name,(*p).sex,(*p).score);

return0;}運(yùn)行結(jié)果:No.:89101

name:LiLinsex:Mscore:89.500000No.:89101

name:LiLinsex:Mscore:89.500000不等于*p.score指向結(jié)構(gòu)體類型數(shù)據(jù)的指針(9.3)指向結(jié)構(gòu)體變量的指針引用結(jié)構(gòu)體變量的成員的三種方法:(設(shè)p是某結(jié)構(gòu)體變量的指針)結(jié)構(gòu)體變量.成員名(*p).成員名p->成員名(*p).num,(*p).name,(*p).sex,(*p).score)

p->num,p->name,p->sex,p->score->

指向運(yùn)算符,優(yōu)先級(jí)最高,從左到右指向結(jié)構(gòu)體類型數(shù)據(jù)的指針(9.3)指向結(jié)構(gòu)體變量的指針例3指向結(jié)構(gòu)體變量的指針的應(yīng)用#include<string.h>//例3#include<stdio.h>

intmain()

{structstudent{longnum;charname[20];

charsex;floatscore;};

structstudentstu_1;

structstudent*p;p=&stu_1;stu_1.num=89101;strcpy(stu_1.name,"LiLin");

stu_1.sex='M';stu_1.score=89.5;

printf("No.:%ld\nname:%s\nsex:%c\nscore:%f\n",stu_1.num,stu_1.name,stu_1.sex,stu_1.score);printf("No.:%ld\nname:%s\nsex:%c\nscore:%f\n",p->num,p->name,p->sex,p->score);

return0;}指向結(jié)構(gòu)體類型數(shù)據(jù)的指針(9.3)結(jié)構(gòu)體數(shù)組與指針請(qǐng)分析以下幾種運(yùn)算:(設(shè)p指向結(jié)構(gòu)體某個(gè)結(jié)構(gòu)體變量)p->np->n++++p->n(p++)->n(++p)->np所指向的結(jié)構(gòu)體變量的成員n。(p->n)++++(p->n)

先引用p指向的結(jié)構(gòu)體變量的成員n,p再增值。p先增值,再引用p指向的結(jié)構(gòu)體變量的成員n。指向結(jié)構(gòu)體類型數(shù)據(jù)的指針(9.3)結(jié)構(gòu)體數(shù)組與指針例9.4用指針?lè)ú僮鹘Y(jié)構(gòu)體數(shù)組。#include<stdio.h>//例11.4(程序1)

structstudent

{intnum;

charname[20];

charsex;

intage;

};

intmain()

{structstudentstu[3]={{10101,"LiLin",'M',18},{10102,"ZhangFun",'M',19},

{10104,"WangMing",'F',20}};

structstudent*p;

printf("No.Namesexage\n");

for(p=stu;p<stu+3;p++)

printf("%-10d%-20s%-8c%-4d\n",p->num,p->name,p->sex,p->age);

return0;

}運(yùn)行結(jié)果:No.Namesexage10101LiLinM18

10102ZhangFunM1910104WangMingF20

#include<stdio.h>//例11.4(程序2)

structstudent

{intnum;

charname[20];

charsex;

intage;

};

intmain()

{structstudentstu[3]={{10101,"LiLin",'M',18},{10102,"ZhangFun",'M',19},

{10104,"WangMing",'F',20}};

structstudent*p;

printf("No.Namesexage\n");

for(p=stu;p<stu+3;)

printf("%-10d%-20s%-8c%-4d\n",(p++)->num,(p++)->name,

(p++)->sex,(p++)->age);

return0;

}?#include<stdio.h>//例9.4(程序3)

typedef

structstudent

{intnum;

charname[20];

charsex;

intage;

}Student;

intmain()

{Studentstu[3]={{10101,"LiLin",'M',18},

{10102,"ZhangFun",'M',19},

{10104,"WangMing",'F',20}};

Student*p;

printf("No.Namesexage\n");

for(p=stu;p<stu+3;)

printf("%-10d%-20s%-8c%-4d\n",p->num,p->name,p->sex,(p++)->age);

return0;

}指向結(jié)構(gòu)體類型數(shù)據(jù)的指針(9.3)注意:(1)如果p的初值為stu,即指向第一個(gè)元素,則p加1后p就指向下一個(gè)元素。例如:

(++p)->num先使p自加1,再得到它指向的元素的num成員值。(p++)->num先得到p->num的值,然后使p自加1,指向stu[1]。指向結(jié)構(gòu)體類型數(shù)據(jù)的指針(9.3)用結(jié)構(gòu)體變量和指向結(jié)構(gòu)體的指針作函數(shù)參數(shù)將一個(gè)結(jié)構(gòu)體變量的值傳遞給另一個(gè)函數(shù)的三種方法:用結(jié)構(gòu)體變量的成員作實(shí)參用結(jié)構(gòu)體變量作實(shí)參用指向結(jié)構(gòu)體變量的指針作實(shí)參,將結(jié)構(gòu)體變量的地址傳給對(duì)應(yīng)的形參用結(jié)構(gòu)體變量和指向結(jié)構(gòu)體的指針作函數(shù)參數(shù)例9.5有一個(gè)結(jié)構(gòu)體變量stu,內(nèi)含學(xué)生學(xué)號(hào)、姓名和三門(mén)課的成績(jī)。要求在main函數(shù)中為其賦值,在另一個(gè)函數(shù)print中輸出其值。(用結(jié)構(gòu)體變量作函數(shù)參數(shù)。)#include<stdio.h>//例9.5

#include<string.h>

#defineFORMAT"%d\n%s\n%f\n%f\n%f\n"

structstudent

{

intnum;

charname[20];

floatscore[3];

};指向結(jié)構(gòu)體類型數(shù)據(jù)的指針(9.3)intmain()

{

voidprint(structstudent);

structstudentstu;

stu.num=12345;

strcpy(,"LiLi");

stu.score[0]=67.5;

stu.score[1]=89;

stu.score[2]=78.6;

print(stu);

return0;

}

voidprint(structstudentstu)

{printf(FORMAT,stu.num,,

stu.score[0],stu.score[1],stu.score[2]);

printf("\n");

}運(yùn)行結(jié)果:12345LiLi67.50000089.00000078.599998注意:結(jié)構(gòu)體變量數(shù)組成員的引用方法。指向結(jié)構(gòu)體類型數(shù)據(jù)的指針(9.3)例9.6將例9.5改用指向結(jié)構(gòu)體變量的指針作參數(shù)。#include<stdio.h>//例9.6

#defineFORMAT"%d\n%s\n%f\n%f\n%f\n"structstudent{intnum;

charname[20];

floatscore[3];

};intmain()

{voidprint(structstudent*);

/*形參類型修改成指向結(jié)構(gòu)體的指針變量*/

structstudentstu={12345,"LiLi",67.5,89,78.6};

print(&stu);/*實(shí)參改為stu的起始地址*/

return0;}

voidprint(structstudent*p)/*形參類型改為指針類型*/

{printf(FORMAT,p->num,p->name,

p->score[0],p->score[1],p->score[2]);

/*用指針變量調(diào)用各成員的值*/

printf("\n");}運(yùn)行結(jié)果:12345LiLi67.50000089.00000078.599998指向結(jié)構(gòu)體類型數(shù)據(jù)的指針(9.3)例4設(shè)一個(gè)學(xué)生的記錄包括學(xué)號(hào),姓名和成績(jī)?nèi)?xiàng),將n個(gè)學(xué)生的記錄按成績(jī)從高到低的順序排列。程序:

程序指向結(jié)構(gòu)體類型數(shù)據(jù)的指針(9.3)例5設(shè)一個(gè)學(xué)生的記錄包括學(xué)號(hào),姓名和成績(jī)?nèi)?xiàng),將n個(gè)學(xué)生的記錄按成績(jī)從高到低的順序排列,同時(shí)當(dāng)成績(jī)相同時(shí),按名字的字母字典順序從高到低順序排序。測(cè)試數(shù)據(jù)程序:

程序?qū)W號(hào)姓名成績(jī)這些數(shù)據(jù)你怎么存放、取出、刪除?用指針處理鏈表(9.4)鏈表鏈表是一種基本且重要的數(shù)據(jù)結(jié)構(gòu),是動(dòng)態(tài)地進(jìn)行存儲(chǔ)分配的一種結(jié)構(gòu)。為何引進(jìn)鏈表?數(shù)組存在的問(wèn)題長(zhǎng)度固定原因:靜態(tài)存儲(chǔ)分配插入刪除操作不方便原因:數(shù)據(jù)連續(xù)存儲(chǔ)鏈表的原理利用指針使得數(shù)據(jù)可以不連續(xù)存儲(chǔ)。動(dòng)態(tài)存儲(chǔ)分配用指針處理鏈表(9.4)線性鏈表的組成:結(jié)點(diǎn):存放用戶需要的實(shí)際數(shù)據(jù)和鏈接結(jié)點(diǎn)的指針。頭指針:存放第一個(gè)結(jié)點(diǎn)的地址,即指向第一個(gè)結(jié)點(diǎn)。表末標(biāo)志:空指針NULL

利用結(jié)構(gòu)體建立鏈表:

structstudent

{longnum;

floatscore;

structstudent*next;}*head;結(jié)點(diǎn)類型頭指針變量head1249用指針處理鏈表(9.4)鏈表的訪問(wèn)例:需要訪問(wèn)學(xué)號(hào)為10101,及10107學(xué)生的成績(jī):head=1249printf(“%ld%5.1f”,head->num,head->score);printf(“\n%ld%5.1f”,head->next->next->num,head->next->next->score);結(jié)果:1010189.51010785.0用指針處理鏈表(9.4)例9.7建立一個(gè)簡(jiǎn)單鏈表,它由3個(gè)學(xué)生數(shù)據(jù)的結(jié)點(diǎn)組成,輸出各結(jié)點(diǎn)中的數(shù)據(jù)。運(yùn)行結(jié)果:1010189.51010390.01010785.0intmain()//例9.7

{structstudenta,b,c,*head,*p;

a.num=10101;a.score=89.5;//建立三個(gè)結(jié)點(diǎn)

b.num=10103;b.score=90;

c.num=10107;c.score=85;

head=&a;//鏈表結(jié)點(diǎn)的鏈接

a.next=&b;

b.next=&c;

c.next=NULL;

p=head;//p指向第一個(gè)結(jié)點(diǎn)

do

{printf("%ld%5.1f\n",p->num,p->score);

p=p->next;//移動(dòng)p指向下一個(gè)結(jié)點(diǎn)

}

while(p!=NULL);//循環(huán)至遇表末標(biāo)記

return0;

}#include<stdio.h>

structstudent

{longnum;

floatscore;

structstudent*next;

};用指針處理鏈表(9.4)處理動(dòng)態(tài)鏈表所需的函數(shù)庫(kù)函數(shù)提供動(dòng)態(tài)地開(kāi)辟和釋放存儲(chǔ)單元的有關(guān)函數(shù):malloc函數(shù)函數(shù)原型:void*malloc(unsignedintsize);作用:在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配一個(gè)長(zhǎng)度為size的連續(xù)空間。返回值:一個(gè)指向分配域起始地址的指針(類型為void)。如果此函數(shù)未能成功地執(zhí)行(內(nèi)存空間不足),則返回空指針(NULL)。calloc函數(shù)函數(shù)原型:void*calloc(unsignedn,unsignedsize);作用:在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配n個(gè)長(zhǎng)度為size的連續(xù)空間。返回值:一個(gè)指向分配域起始地址的指針;如果分配不成功,返回NULL。用指針處理鏈表(9.4)處理動(dòng)態(tài)鏈表所需的函數(shù)calloc函數(shù)用calloc函數(shù)可以為一維數(shù)組開(kāi)辟動(dòng)態(tài)存儲(chǔ)空間,n為數(shù)組元素個(gè)數(shù),每個(gè)元素長(zhǎng)度為Size。free函數(shù)函數(shù)原型:voidfree(void*p);作用:釋放由p指向的內(nèi)存區(qū),使這部分內(nèi)存區(qū)能被其他變量使用。free函數(shù)無(wú)返回值。注意:使用以上庫(kù)函數(shù)需包含頭文件stdlib.h用指針處理鏈表(9.4)建立動(dòng)態(tài)鏈表基本思想:在程序執(zhí)行過(guò)程中從空表開(kāi)始建立一個(gè)鏈表,即一個(gè)一個(gè)地開(kāi)辟結(jié)點(diǎn)和輸入各結(jié)點(diǎn)數(shù)據(jù),并建立起前后相鏈的關(guān)系。建立一個(gè)新結(jié)點(diǎn)的步驟:1.開(kāi)辟新結(jié)點(diǎn)的存儲(chǔ)空間;2.將新結(jié)點(diǎn)鏈接到鏈表中;3.向新結(jié)點(diǎn)輸入數(shù)據(jù)(第2、3步順序可對(duì)調(diào))要點(diǎn):新結(jié)點(diǎn)的鏈接,表頭的處理,表末標(biāo)記用指針處理鏈表(9.4)例9.8寫(xiě)一函數(shù)建立一個(gè)存儲(chǔ)若干學(xué)生數(shù)據(jù)的單向動(dòng)態(tài)鏈表算法說(shuō)明:約定學(xué)號(hào)不會(huì)為零,如果輸入的學(xué)號(hào)為0,則表示數(shù)據(jù)已輸入完。初始化:初始化鏈表為空表,head=NULL;指針變量:p1:指向新結(jié)點(diǎn)p2:指向新結(jié)點(diǎn)的前一個(gè)結(jié)點(diǎn)開(kāi)辟新結(jié)點(diǎn):使用函數(shù)malloc(Size)表頭的處理:令頭指針指向第一個(gè)建立的結(jié)點(diǎn)head=p1。新結(jié)點(diǎn)的鏈接:第二個(gè)結(jié)點(diǎn)起,令前一個(gè)結(jié)點(diǎn)的指針成員

p2->next=p1,接著使p2指向新鏈入的結(jié)點(diǎn)p2=p1。數(shù)據(jù)結(jié)束的判斷:當(dāng)讀入的學(xué)號(hào)p->num等于0時(shí),退出循環(huán)。表末標(biāo)記的設(shè)置:p2->next=NULL;

圖9-12用指針處理鏈表(9.4)

圖9-13

圖9-14用指針處理鏈表(9.4)

圖9-15圖9-16用指針處理鏈表(9.4)建立鏈表#include<stdio.h>//例9.8#include<stdlib.h>#defineLENsizeof(structstudent)structstudent{longnum;floatscore;structstudent*next;};intmain(){structstudent*creat();

voidprint(structstudent*head);structstudent*head;head=creat();//建立鏈表print(head);//輸出鏈表

return0;}structstudent*creat(

)

//建立鏈表函數(shù){

structstudent*head;

structstudent*p1,*p2;

intn=0;

p1=p2=(structstudent*)malloc(LEN);scanf("%ld%f",&p1->num,&p1->score);head=NULL;while(p1->num!=0)

{n++;

if(n==1)

head=p1;

elsep2->next=p1;

p2=p1;

p1=(structstudent*)malloc(LEN);

scanf("%ld%f",&p1->num,&p1->score);

}

p2->next=NULL;

return(head);}p2->next=NULL;free(p1);return(head);用指針處理鏈表(9.4)更簡(jiǎn)潔的建表方法structstudent*creat(

)

//建立鏈表函數(shù){

structstudent*head=NULL;

structstudent*p1=NULL,*p2=NULL;

p1=p2=(structstudent*)malloc(LEN);scanf("%ld%f",&p1->num,&p1->score);

while(p1->num!=0)

{

if(head==NULL)

head=p1;

else

p2->next=p1;

p2=p1;

p1=(structstudent*)malloc(LEN);

scanf("%ld%f",&p1->num,&p1->score);

}

p2->next=NULL;

free(p1);//釋放p1所指內(nèi)存空間

return(head);}用指針處理鏈表(9.4)輸出鏈表算法思想:定義一個(gè)指針變量p;通過(guò)頭指針得到鏈表第一個(gè)結(jié)點(diǎn)的地址:p=head;用指針變量p,從第一個(gè)結(jié)點(diǎn)起逐個(gè)指向鏈表的每個(gè)結(jié)點(diǎn),輸出其數(shù)據(jù)。指針移動(dòng)操作:p=p->next;遇表末標(biāo)記,則鏈表輸出完畢。用指針處理鏈表(9.4)例9.9編寫(xiě)一個(gè)輸出鏈表的函數(shù)print.//例9.9voidprint(structstudent*head)//輸出鏈表函數(shù){structstudent*p;printf("\nNow,These%drecordsare:\n",n);p=head;while(p!=NULL){printf("%ld%5.1f\n",p->num,p->score);p=p->next;}}共用體(9.5)C語(yǔ)言的數(shù)據(jù)類型:C數(shù)據(jù)類型基本類型構(gòu)造類型指針類型空類型void字符類型char枚舉類型enum整型實(shí)型單精度型float雙精度型double數(shù)組結(jié)構(gòu)體struct共用體union短整型short長(zhǎng)整型long整型int共用體union共用體(9.5)共用體用途:使幾個(gè)不同類型的變量共占一段內(nèi)存(相互覆蓋)共用體類型定義:union共用體名{成員表列};例uniondata{shorti;charch;floatf;};fchi類型定義不分配內(nèi)存形式一:uniondata{shorti;charch;floatf;}a,b;形式二:uniondata{shorti;charch;floatf;};uniondataa,b,c,*p,d[3];形式三:union{shorti;charch;floatf;}a,b,c;共用體變量的定義fchifchiab共用體變量定義分配內(nèi)存,長(zhǎng)度=最長(zhǎng)成員所占字節(jié)數(shù)共用體變量任何時(shí)刻只有一個(gè)成員存在共用體共用體共用體變量引用引用方式:與結(jié)構(gòu)體類似。共用體指針名->成員名共用體變量名.成員名(*共用體指針名).成員名uniondata{inti;charch;floatf;};uniondataa,b,c,*p,d[3];a.ia.cha.fp->ip->chp->f(*p).i(*p).ch(*p).fd[0].id[0].chd[0].f共用體共用體變量引用引用規(guī)則不能整體引用共用體變量,只能引用其成員。共用體變量中起作用的成員是最后一次存儲(chǔ)的成員。不能在定義共用體變量時(shí)初始化??梢杂靡粋€(gè)共用體變量為另一個(gè)變量賦值。共用體變量的地址和它的各成員的地址都是同一地址。如,&a,&a.i,&a.ch,&a.f都是同一個(gè)地址值。例union{inti;charch;floatf;}a={1,’a’,1.5};()例union{inti;charch;floatf;}a,b;a.i=1;a.ch=‘a(chǎn)’;a.f=1.5;b=a;()

例union{inti;charch;floatf;}a;a=1;()

例a.i=1;a.ch='a';a.f=1.5;printf("%d",a.i);(編譯通過(guò),運(yùn)行結(jié)果不對(duì))

共用體共用體變量引用說(shuō)明可以使用指向共用體變量的指針。共用體與結(jié)構(gòu)體可以互相嵌套。可以定義共用體數(shù)組。共用體例9.12設(shè)有若干個(gè)人員的數(shù)據(jù),其中有學(xué)生和教師。學(xué)生的數(shù)據(jù)中包括:姓名、號(hào)碼、性別、職業(yè)、班級(jí)。教師的數(shù)據(jù)包括:姓名、號(hào)碼、性別、職業(yè)、職務(wù)??梢钥闯?,學(xué)生和教師所包含的數(shù)據(jù)是不同的?,F(xiàn)要求把它們放在同一表格中。共用體算法:讀入position共用體voidmain(

){

inti,n;

printf("Inputthenumberofpeople:");

scanf("%d",&n);

for(i=0;i<n;i++)

{

scanf("%d

%s

%c

%c",&person[i].num,

person[i].name,

&person[i].sex,&person[i].job);

if(person[i].job=='s')

scanf("%d",&person[i].category.banji);

else

scanf("%s",person[i].category.position);}

//例9.12#include<stdio.h>struct{

intnum;

charname[10];

charsex;

charjob;

union

{

intbanji;

charposition[10];

}category;

}person[2];

/*先設(shè)人數(shù)為2*/共用體

printf("\n");

//例11.12

printf("No.

name

sexjobclass/position\n");

for(i=0;i<n;i++)

{

if(person[i].job=='s')

printf("%-10d%-10s%-10c%-410c%-10d\n",person[i].num,

person[i].name,person[i].sex,person[i].job,person[i].category.banji);

else

printf("%-10d%-10s%-10c%-10c%

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論