版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第9章
用戶自己定義數(shù)據(jù)類型
—C程序設(shè)計本章要點結(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語言的數(shù)據(jù)類型:C數(shù)據(jù)類型基本類型構(gòu)造類型指針類型空類型void字符類型char枚舉類型enum整型實型單精度型float雙精度型double數(shù)組結(jié)構(gòu)體struct共用體union短整型short長整型long整型int結(jié)構(gòu)體struct概述
為何引進結(jié)構(gòu)體?一類問題學生的學號、姓名、性別、年齡等信息圖書的書號、書名、出版社、價格等貨物的貨號、貨名、進出貨日期、價格等這類問題中數(shù)據(jù)有何特點,如何存儲?特點由幾個不同類型的數(shù)據(jù)組成一個有機整體。這個整體用一個數(shù)據(jù)元素表示。存儲:需要按一定順序同時存儲這些不同類型的數(shù)據(jù)。結(jié)構(gòu)體:一組具有不同數(shù)據(jù)類型的數(shù)據(jù)的有序集合。結(jié)構(gòu)體的每個元素包含若干個不同數(shù)據(jù)類型的成員。結(jié)構(gòu)體的各個元素結(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];};;不可或缺說明:上述定義僅僅聲明一個結(jié)構(gòu)體類型,還未定義結(jié)構(gòu)體變量,還未分配內(nèi)存。標識符表示定義結(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.在聲明類型的同時定義變量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)體變量中各個成員的字節(jié)數(shù)之和。例如:stu1和stu2在內(nèi)存中各占63個字節(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)體類型的說明:類型和變量是不同的概念類型:確定一類數(shù)據(jù)的結(jié)構(gòu)與性質(zhì);變量:數(shù)據(jù)類型:不分配內(nèi)存;變量:分配內(nèi)存類型:不能賦值、存取、運算;
變量:可以運算結(jié)構(gòu)體變量的成員可以單獨使用,相當于普通變量。成員名可以與程序中的變量名相同,互不干擾。結(jié)構(gòu)體可以嵌套,成員也可以是一個結(jié)構(gòu)體。定義嵌套的結(jié)構(gòu)體類型時,應(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)體變量的引用除了賦值運算外,不能整體引用結(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ōu)先級最高,從左到右對結(jié)構(gòu)體變量的成員可以像普通變量一樣進行各種運算。例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)體變量的引用不能將一個結(jié)構(gòu)體變量作為一個整體進行輸入輸出,對結(jié)構(gòu)體變量的輸入輸出應(yīng)對其成員逐個進行。例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)體變量的引用可以將一個結(jié)構(gòu)體變量的值賦值給另一個結(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)體嵌套時逐級引用,直至最低級。例structdate{intmonth;intday;intyear;};structstudent{intnum;charname[20];structdatebirthday;}stu1,stu2;可以這樣訪問其成員:stu1.birthday.year不能用stu1.birthday來直接訪問stu1變量中的成員birthday,因為stu1.birthday本身是一個結(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對結(jié)構(gòu)體變量初始化.//例9.1
#include<stdio.h>intmain(){structstudent
{longintnum;
charname[20];
charsex;
charaddr[20];
}a={10101,"LiLin",'M',"123BeijingRoad"};
/*對結(jié)構(gòu)體變量a賦初值*/
printf(“No.:%ld\nname:%s\nsex:%c\naddress:%s\n”,a.num,,a.sex,a.addr);
return0;}運行結(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ù)組大小可省結(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ù)組名[下標].成員名結(jié)構(gòu)體數(shù)組(9.2)結(jié)構(gòu)體數(shù)組的每個元素都是一個結(jié)構(gòu)體變量,使用規(guī)則如同一般的結(jié)構(gòu)體變量。結(jié)構(gòu)體數(shù)組例9.2對候選人得票的統(tǒng)計程序。設(shè)有3個候選人,每次輸入一個得票的候選人的名字,要求最后輸出各人得票結(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)體變量的指針一個結(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;}運行結(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ōu)先級最高,從左到右指向結(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ù)組與指針請分析以下幾種運算:(設(shè)p指向結(jié)構(gòu)體某個結(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用指針法操作結(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;
}運行結(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,即指向第一個元素,則p加1后p就指向下一個元素。例如:
(++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ù)將一個結(jié)構(gòu)體變量的值傳遞給另一個函數(shù)的三種方法:用結(jié)構(gòu)體變量的成員作實參用結(jié)構(gòu)體變量作實參用指向結(jié)構(gòu)體變量的指針作實參,將結(jié)構(gòu)體變量的地址傳給對應(yīng)的形參用結(jié)構(gòu)體變量和指向結(jié)構(gòu)體的指針作函數(shù)參數(shù)例9.5有一個結(jié)構(gòu)體變量stu,內(nèi)含學生學號、姓名和三門課的成績。要求在main函數(shù)中為其賦值,在另一個函數(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");
}運行結(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);/*實參改為stu的起始地址*/
return0;}
voidprint(structstudent*p)/*形參類型改為指針類型*/
{printf(FORMAT,p->num,p->name,
p->score[0],p->score[1],p->score[2]);
/*用指針變量調(diào)用各成員的值*/
printf("\n");}運行結(jié)果:12345LiLi67.50000089.00000078.599998指向結(jié)構(gòu)體類型數(shù)據(jù)的指針(9.3)例4設(shè)一個學生的記錄包括學號,姓名和成績?nèi)?,將n個學生的記錄按成績從高到低的順序排列。程序:
程序指向結(jié)構(gòu)體類型數(shù)據(jù)的指針(9.3)例5設(shè)一個學生的記錄包括學號,姓名和成績?nèi)?,將n個學生的記錄按成績從高到低的順序排列,同時當成績相同時,按名字的字母字典順序從高到低順序排序。測試數(shù)據(jù)程序:
程序?qū)W號姓名成績這些數(shù)據(jù)你怎么存放、取出、刪除?用指針處理鏈表(9.4)鏈表鏈表是一種基本且重要的數(shù)據(jù)結(jié)構(gòu),是動態(tài)地進行存儲分配的一種結(jié)構(gòu)。為何引進鏈表?數(shù)組存在的問題長度固定原因:靜態(tài)存儲分配插入刪除操作不方便原因:數(shù)據(jù)連續(xù)存儲鏈表的原理利用指針使得數(shù)據(jù)可以不連續(xù)存儲。動態(tài)存儲分配用指針處理鏈表(9.4)線性鏈表的組成:結(jié)點:存放用戶需要的實際數(shù)據(jù)和鏈接結(jié)點的指針。頭指針:存放第一個結(jié)點的地址,即指向第一個結(jié)點。表末標志:空指針NULL
利用結(jié)構(gòu)體建立鏈表:
structstudent
{longnum;
floatscore;
structstudent*next;}*head;結(jié)點類型頭指針變量head1249用指針處理鏈表(9.4)鏈表的訪問例:需要訪問學號為10101,及10107學生的成績: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建立一個簡單鏈表,它由3個學生數(shù)據(jù)的結(jié)點組成,輸出各結(jié)點中的數(shù)據(jù)。運行結(jié)果:1010189.51010390.01010785.0intmain()//例9.7
{structstudenta,b,c,*head,*p;
a.num=10101;a.score=89.5;//建立三個結(jié)點
b.num=10103;b.score=90;
c.num=10107;c.score=85;
head=&a;//鏈表結(jié)點的鏈接
a.next=&b;
b.next=&c;
c.next=NULL;
p=head;//p指向第一個結(jié)點
do
{printf("%ld%5.1f\n",p->num,p->score);
p=p->next;//移動p指向下一個結(jié)點
}
while(p!=NULL);//循環(huán)至遇表末標記
return0;
}#include<stdio.h>
structstudent
{longnum;
floatscore;
structstudent*next;
};用指針處理鏈表(9.4)處理動態(tài)鏈表所需的函數(shù)庫函數(shù)提供動態(tài)地開辟和釋放存儲單元的有關(guān)函數(shù):malloc函數(shù)函數(shù)原型:void*malloc(unsignedintsize);作用:在內(nèi)存的動態(tài)存儲區(qū)中分配一個長度為size的連續(xù)空間。返回值:一個指向分配域起始地址的指針(類型為void)。如果此函數(shù)未能成功地執(zhí)行(內(nèi)存空間不足),則返回空指針(NULL)。calloc函數(shù)函數(shù)原型:void*calloc(unsignedn,unsignedsize);作用:在內(nèi)存的動態(tài)存儲區(qū)中分配n個長度為size的連續(xù)空間。返回值:一個指向分配域起始地址的指針;如果分配不成功,返回NULL。用指針處理鏈表(9.4)處理動態(tài)鏈表所需的函數(shù)calloc函數(shù)用calloc函數(shù)可以為一維數(shù)組開辟動態(tài)存儲空間,n為數(shù)組元素個數(shù),每個元素長度為Size。free函數(shù)函數(shù)原型:voidfree(void*p);作用:釋放由p指向的內(nèi)存區(qū),使這部分內(nèi)存區(qū)能被其他變量使用。free函數(shù)無返回值。注意:使用以上庫函數(shù)需包含頭文件stdlib.h用指針處理鏈表(9.4)建立動態(tài)鏈表基本思想:在程序執(zhí)行過程中從空表開始建立一個鏈表,即一個一個地開辟結(jié)點和輸入各結(jié)點數(shù)據(jù),并建立起前后相鏈的關(guān)系。建立一個新結(jié)點的步驟:1.開辟新結(jié)點的存儲空間;2.將新結(jié)點鏈接到鏈表中;3.向新結(jié)點輸入數(shù)據(jù)(第2、3步順序可對調(diào))要點:新結(jié)點的鏈接,表頭的處理,表末標記用指針處理鏈表(9.4)例9.8寫一函數(shù)建立一個存儲若干學生數(shù)據(jù)的單向動態(tài)鏈表算法說明:約定學號不會為零,如果輸入的學號為0,則表示數(shù)據(jù)已輸入完。初始化:初始化鏈表為空表,head=NULL;指針變量:p1:指向新結(jié)點p2:指向新結(jié)點的前一個結(jié)點開辟新結(jié)點:使用函數(shù)malloc(Size)表頭的處理:令頭指針指向第一個建立的結(jié)點head=p1。新結(jié)點的鏈接:第二個結(jié)點起,令前一個結(jié)點的指針成員
p2->next=p1,接著使p2指向新鏈入的結(jié)點p2=p1。數(shù)據(jù)結(jié)束的判斷:當讀入的學號p->num等于0時,退出循環(huán)。表末標記的設(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)更簡潔的建表方法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)輸出鏈表算法思想:定義一個指針變量p;通過頭指針得到鏈表第一個結(jié)點的地址:p=head;用指針變量p,從第一個結(jié)點起逐個指向鏈表的每個結(jié)點,輸出其數(shù)據(jù)。指針移動操作:p=p->next;遇表末標記,則鏈表輸出完畢。用指針處理鏈表(9.4)例9.9編寫一個輸出鏈表的函數(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語言的數(shù)據(jù)類型:C數(shù)據(jù)類型基本類型構(gòu)造類型指針類型空類型void字符類型char枚舉類型enum整型實型單精度型float雙精度型double數(shù)組結(jié)構(gòu)體struct共用體union短整型short長整型long整型int共用體union共用體(9.5)共用體用途:使幾個不同類型的變量共占一段內(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)存,長度=最長成員所占字節(jié)數(shù)共用體變量任何時刻只有一個成員存在共用體共用體共用體變量引用引用方式:與結(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ī)則不能整體引用共用體變量,只能引用其成員。共用體變量中起作用的成員是最后一次存儲的成員。不能在定義共用體變量時初始化??梢杂靡粋€共用體變量為另一個變量賦值。共用體變量的地址和它的各成員的地址都是同一地址。如,&a,&a.i,&a.ch,&a.f都是同一個地址值。例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);(編譯通過,運行結(jié)果不對)
共用體共用體變量引用說明可以使用指向共用體變量的指針。共用體與結(jié)構(gòu)體可以互相嵌套??梢远x共用體數(shù)組。共用體例9.12設(shè)有若干個人員的數(shù)據(jù),其中有學生和教師。學生的數(shù)據(jù)中包括:姓名、號碼、性別、職業(yè)、班級。教師的數(shù)據(jù)包括:姓名、號碼、性別、職業(yè)、職務(wù)??梢钥闯?,學生和教師所包含的數(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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年唐山港集團股份有限公司招聘筆試參考題庫含答案解析
- 2025年上海市汽車修理有限公司招聘筆試參考題庫含答案解析
- 2025年遼寧臺安縣城市建設(shè)集團招聘筆試參考題庫含答案解析
- 2025年中國郵政中國集郵總公司招聘筆試參考題庫含答案解析
- 二零二五年度第三章國際服務(wù)貿(mào)易政策執(zhí)行要點2篇
- 寧夏回族自治區(qū)事業(yè)單位聯(lián)考招聘高頻重點提升(共500題)附帶答案詳解
- 2024能源科技公司儲能系統(tǒng)采購合同
- 大連市青少年記者學會招錄大學生實習就業(yè)人才高頻重點提升(共500題)附帶答案詳解
- 2024版設(shè)備采購合同格式
- 國網(wǎng)2025年高校畢業(yè)生招聘通信產(chǎn)業(yè)集團限公司招聘170人歷年高頻重點提升(共500題)附帶答案詳解
- 礦業(yè)公司薪資福利制度
- JGJT411-2017 沖擊回波法檢測混凝土缺陷技術(shù)規(guī)程
- 污水管網(wǎng)溝槽槽鋼支護專項方案
- 公司客戶服務(wù)應(yīng)急預案
- 三年級道德與法制上學期期末考試質(zhì)量分析集合3篇
- 水工-建筑物課件
- 裝修增減項單模板
- 義務(wù)教育英語課程標準2022年版新增詞匯記背
- 人教版高中物理必修二全冊同步課時練習
- 張克非《公共關(guān)系學》(修訂版)筆記和課后習題詳解
- 世界技能大賽選拔賽3D數(shù)字游戲藝術(shù)項目技術(shù)文件
評論
0/150
提交評論