版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
第7章復合數(shù)據(jù)類型和類型定義結(jié)
構(gòu)
類
型聯(lián)
合
類
型枚
舉
類
型類
型
定
義7.1
結(jié)構(gòu)類型(復習引入)現(xiàn)實生活中,每個事物都有若干個屬性,且
各
自
的
類
型
不
同
。例如,學生成績登記表,表中每個學生都有學號、姓名、總分和名次等屬性。其中學號用長整型表示;姓名用字符串表示;總分用浮點數(shù)表示;名次用整數(shù)表示。對于這樣的數(shù)據(jù)形式,可以用結(jié)構(gòu)體類型
來描述。7.1
結(jié)構(gòu)定義、引用和初始化一
、
結(jié)構(gòu)類型定義的一般形式:
P229struct
結(jié)構(gòu)標識符{數(shù)據(jù)類型成員名1;數(shù)據(jù)類型成員名2;數(shù)據(jù)類型成員名n;};其中:struct是關鍵字,結(jié)構(gòu)標識符和各成員由用戶自行命名;關鍵字
struct連同其后的結(jié)構(gòu)標識符一起稱為結(jié)構(gòu)類型名或結(jié)構(gòu)名;各成
員的定義語句放在花括號中構(gòu)成復合語句,花括號后面的分號是
整個定義語句的結(jié)尾。用
途
:
把、不、同類型
的
數(shù)
據(jù)
組
合
成
一
個
整
體
——構(gòu)造出新的數(shù)據(jù)類型structaccount{
longid;charname[20];structdate
Date;dateyear;month;day;struct{
intint
int例如定義一個日期的結(jié)構(gòu)體類型:例
如
定
義
一
個
銀
行
存
款
帳
戶
的
結(jié)
構(gòu)
體
類
型
:float
money;struct
stuchar
num[5],
name[10],int
age;float
score;char
speciality[20];};結(jié)構(gòu)類型定義擋遠結(jié)構(gòu)的組織形式,確見了該類型的內(nèi)存分
配模式,但不分配內(nèi)存!二
、結(jié)構(gòu)類型存儲模式:
P230例sex;內(nèi)存分配模式說明:P230●
結(jié)構(gòu)體成員的類型可以是簡單類型、數(shù)組類型或者是結(jié)構(gòu)體類
型
等
任
何
數(shù)
據(jù)
類
型●
結(jié)構(gòu)體類型的定義只是描述結(jié)構(gòu)體的組織形式,并沒
有分配一段內(nèi)存單元來存放各數(shù)據(jù)項規(guī)員。只有定義
了這種類型的變量,系統(tǒng)才為變量分配內(nèi)存空間,
占據(jù)存儲單元。●
結(jié)構(gòu)體類型定義可以在函數(shù)的內(nèi)部,其作用域僅限于該函數(shù)內(nèi)部;也可以定義在函數(shù)的外部,其作用域是從定義處開始到本文件結(jié)束
?!?/p>
在定義結(jié)構(gòu)體類型時,數(shù)據(jù)類型相同的成員可以在
一行中說明,成員間用逗號分開。三、
結(jié)構(gòu)體類型變量、結(jié)構(gòu)數(shù)組和結(jié)構(gòu)指針的定義:
P231某個結(jié)構(gòu)體類型一經(jīng)定義
就可以指明該種結(jié)構(gòu)體的具體對象,即定義該種類型的
變
量
。定
義
結(jié)
構(gòu)
體
類
型
的
變
量
的
三
種
方
法
:●
先定義結(jié)構(gòu)體類型,再定義該種類型的變
量
。●
在定義結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體變量?!?/p>
直接定義結(jié)構(gòu)體類型變量。1、
結(jié)構(gòu)類型的作用域應用該類型定義變量或應用該類型變量的有效位置(1)局部結(jié)構(gòu)類型的作用域函數(shù)名(
)struct
stul局部結(jié)構(gòu)類型作用域從定義處至該函數(shù)結(jié)束從定義處開始,直到其所在源程序文件結(jié)束。{.…};函數(shù)名(){
……(2)全局結(jié)構(gòu)類型的作用域全局結(jié)構(gòu)類型作用域struct
stu2三、
結(jié)構(gòu)變量、結(jié)構(gòu)數(shù)組、結(jié)構(gòu)指針的定義(1)先定義結(jié)構(gòu)類型,再進行變量定義一般形式
struct
結(jié)構(gòu)
名成員列表};struct
結(jié)構(gòu)名
變量名表列;struct
student
例
define
STUDENT
struct
student{
int
num;char
name[20
{
int
num;char
sex;
char
name[20];char
sex;int
age;
int
age;};
};struct
student
s
STUDENT
st1,s[5],*p;STUDENTdefine
STUDENT
structSTUDENTint
num;char
name[20];char
sex;int
age;};STUDENT
st1,s[5],*p;思考:結(jié)構(gòu)指針p所占空間大小是多少個字節(jié)?4
個
字
節(jié)結(jié)構(gòu)數(shù)組s[5]的內(nèi)存分配形式為:1ullnaimeSeXagenu1lnaineSeXagestudent29B(2)定義結(jié)構(gòu)類型的同時定義變量一般形式:struct
結(jié)構(gòu)名成員列表表列;struct
student{
int
num;char
name[20];char
sex;int
age;}stul,stu2[2],*p;例變量名表列;例
struct{
int
num;char
name[20];char
sex;int
age;}st1,s[5],*p;(
3
)
應
用
無
名
結(jié)
構(gòu)
類
型
直
接
定
義
變
量一
般
形
式
:struct成員列表用無名結(jié)構(gòu)直接定義
變量只能一次。注意:這
種
形
式
由
于
省
略了結(jié)構(gòu)體名,因此
以后不能用它再來
定
義
其
它
變
量
。說
明
:結(jié)構(gòu)體變量的定義在函數(shù)的數(shù)據(jù)說明部分進行,也可以在函數(shù)的外部定義。但都必須是類型定義在前,變量定義在
后
。結(jié)構(gòu)體變量一經(jīng)定義,在程序運行時,系統(tǒng)將按照結(jié)
構(gòu)
體
類
型
定
義
時
的
內(nèi)
存
模
式
為
結(jié)
構(gòu)
體
變
量
分
配
一
定的存儲單元。一個結(jié)構(gòu)體變量在內(nèi)存中占用存儲空間的實際字節(jié)數(shù),就
是
結(jié)
構(gòu)
體
類
型
定
義
時
各
個
成
員
項
所
占
字
節(jié)
數(shù)
的
總
和
,可以利用sizeof
運算符求出一個結(jié)構(gòu)體類型數(shù)據(jù)的長度。(4)嵌套結(jié)構(gòu)定義(a)
當結(jié)構(gòu)類型的成員屬于一復雜類型時,稱該結(jié)構(gòu)類型為嵌套結(jié)構(gòu)。(b)
嵌套結(jié)構(gòu)有以下兩種形式:例
struct
date{
int
month;int
day;例
struct
studentint
num;char
name[20];structdate
{
int
month;int
day;int
year;}birthday;}stu;numnamebirthdamonthdayyearchar
name[20];struct
date
birthday;
}stu;int
year;
};struct
student{
int
num;(5)
結(jié)
構(gòu)
體
變
量
的
初
始
化結(jié)構(gòu)體類型變量在定義時也可以直接對其進行初始化??梢栽谥鞒绦蛑卸x并直接初始化結(jié)構(gòu)體變量。P237【例7.2】一個汽車檔案中包括汽車的編號、顏色和型號。輸入一個
汽車編號,由find()函數(shù)進行查找,根據(jù)查找結(jié)果輸出查找到汽車的
信息。#include
<stdio.h>struct
sample{
int
num;char
color;char
type;}
car[]={
101,'G','c',210,'Y','m',105,'R',T,220,'B','s',308,'W','b',0,\0',^\0'};、結(jié)構(gòu)成員的訪問一
、
引用結(jié)構(gòu)體變量的成員項:一般情況下對結(jié)構(gòu)體變量的使用,是用結(jié)構(gòu)體的各個成
員
項
來
參
加
各
種
運
算
和
操
作
。引用結(jié)構(gòu)體變量中的成員項的形式為:結(jié)
構(gòu)
體
變
量
名
.
成
員
項
名例
如
:
將
日
期
2
0
2
1
年
5
月
1
2
日
賦
給struct
date型
變
量Date
l
可表示成:Date1.
year=2021;Date1.
month=5;Date1.
day=12;說
明
:“.
”是一個運算符,表示對結(jié)構(gòu)體變量的成員進行訪問運算,它的優(yōu)先級為最高級,結(jié)合方向是從
左到右。結(jié)構(gòu)體成員項是結(jié)構(gòu)體中的一個數(shù)據(jù),對其進行何種運算是由它的類型決定,
允許參加運算的種類與同類型的簡單變量的種類相同。如
果
一
個
結(jié)
構(gòu)
體
成
員
本
身
又
是
一
個
結(jié)
構(gòu)
體
類
型
變
量則要通過兩個“.”運算符來訪問該結(jié)構(gòu)成員的結(jié)構(gòu)成員。如
下
面
的
賦
值
語
句
是
合
法
的
:wang=zhang;注意:不
允
許
用
賦
值
語
句
將
一
組常
量
直
接
賦
值
給
一
個
結(jié)
構(gòu)
體變量。如下面的賦值語句是不合法的:二、
一個結(jié)構(gòu)體變量作為一個整體來引用。C語言允許兩個相同類型的結(jié)構(gòu)體變量之間相互賦值,這
種
結(jié)
構(gòu)
體
變
量
之
間
賦
值
的
過
程
是
一
個
結(jié)
構(gòu)
體
變
量
的
成員項的值賦給另一個結(jié)構(gòu)體變量的相應部分。wang=【例7.1x】
結(jié)構(gòu)變量的初始化struct
studentchar
number[5],*name;char
sex;struct
date{
int
year;
int
month;
int
day;}birthday;
float
score;char
speciality[11];char
school[31];};main()s
truct
student
st1={'1001","Liming",'0',1983,10,25,573,"Computer","3th
High
School,Beijing"'};三
、
結(jié)
構(gòu)
體
數(shù)
組
和
結(jié)
構(gòu)
體
指
針(1)、結(jié)構(gòu)體數(shù)組:當數(shù)組中的元素是結(jié)構(gòu)體類型的
就構(gòu)成了結(jié)構(gòu)體數(shù)組。結(jié)構(gòu)體數(shù)組是具有相同結(jié)
構(gòu)
體
類
型
的
變
量
集
合
。(2)、結(jié)構(gòu)體指針指
向
結(jié)
構(gòu)體
類
型
變
量
的
指
針
稱
為
指
向
結(jié)
構(gòu)體
的指針或結(jié)構(gòu)體指針
。訪
問
結(jié)
構(gòu)
體
指
針
所
指
向
的
結(jié)
構(gòu)
體
變量
的成員可以采用以下兩種方法:方法1:(*結(jié)構(gòu)體指針名入成員項名方法2:
結(jié)構(gòu)體指針名->成員頁名struct
student
s[5];例如:
(*s).name,
(*s).sex,
(*s).age或
者
s->name,
(s+1)->sex,
s[2].
segstruct
student
s[5],*p=s;例如:
(*p).name,
(*p).sex,
(*p).age或者
p->name,
Ip->sex,
p->sex7.13結(jié)構(gòu)變量、結(jié)構(gòu)數(shù)組的賦值、輸入和輸出
7.14結(jié)構(gòu)類型數(shù)據(jù)在函數(shù)間的傳遞(1)P236
【例7.1】結(jié)構(gòu)變量的賦值、輸入和輸出(2)結(jié)構(gòu)體數(shù)組的賦值、輸入和輸出P241
【例7.6】建立一個小通訊錄:input()用于輸入通訊
錄數(shù)據(jù),
display()用于輸出通訊錄,主程序通過結(jié)構(gòu)
數(shù)組名調(diào)用input()和display(。P241
【例7.6】建立一個小通訊錄:
input()用于輸入通訊錄數(shù)據(jù),display()用于輸出通訊錄,主程序通過結(jié)構(gòu)數(shù)組名調(diào)用
input()和displayO。#include
<stdio.h>#define
MAX10struct
telephone{char
name[20];
char
mobile[12];
char
phone[12];};input(struct
telephone
*p){int
i;for(i=0;i<MAX;i++){printf("Name?");gets(p->name);if
(p->name[0]==^\0')
return(i);/*提前結(jié)束輸入*printf("Mobile?");scanf("%*c%s",p->mobile);printf("Telephone?");scanf("%*c%s%*c",p->phone);};return
MAX;}void
display(struct
telephone
*p,int
n){
int
i;for(i=0;i<n;i++,p++)printf("%-20s%-
12s%-
12s\n",p->name,p->mobile,p->phone);main(){struct
telephonetx[MAX];
int
n;n=input(tx);display(tx,n);/*輸出通訊錄*/一、
返回值方式被調(diào)用函數(shù)可以通過返回一個結(jié)構(gòu)變量或一個結(jié)構(gòu)指
針的方式向調(diào)用函數(shù)傳遞結(jié)構(gòu)型數(shù)據(jù)。返回結(jié)構(gòu)變量
的函數(shù)稱為結(jié)構(gòu)型函數(shù),屬于基本類型函數(shù);返回結(jié)
構(gòu)指針的函數(shù)稱為結(jié)構(gòu)指針型函數(shù),屬于指針型函數(shù)o①
結(jié)構(gòu)型函數(shù)說明或定義結(jié)構(gòu)型函數(shù)的一般形式為:struct
結(jié)構(gòu)標識符函數(shù)名(形參表)例如,struct
student
function(int
x,int
y){......}就定義了一個struct
student結(jié)構(gòu)類型的函數(shù),它可以將一個
結(jié)構(gòu)變量返回到調(diào)用函數(shù)。②
結(jié)構(gòu)指針型函數(shù)說明或定義結(jié)構(gòu)指針型函數(shù)的一般形式為:struct結(jié)構(gòu)名*函數(shù)名(形參表)例如,struct
student
*function(int
x,int
y){
......}定義了一個結(jié)構(gòu)指針型函數(shù)function(),它可以將一
個結(jié)構(gòu)指針返回到調(diào)用函數(shù)。結(jié)構(gòu)類型數(shù)據(jù)在函數(shù)間的傳遞1、用結(jié)構(gòu)變量的成員作參數(shù)—
值傳遞2
、用指向結(jié)構(gòu)變量或數(shù)組的指針作參數(shù)—
地址傳遞3
、用結(jié)構(gòu)變量作參數(shù)--多值傳遞(效率低)小結(jié)結(jié)構(gòu)體聲明及結(jié)構(gòu)體類型變量的定義、初始化(a)結(jié)構(gòu)體類型的定義形式注意的問題:①
每個成員都必須有自己的數(shù)據(jù)類型,位置上連續(xù)同類型的結(jié)構(gòu)成員可
以出現(xiàn)在一條語句中,并共用同一個類型關鍵字。②
結(jié)構(gòu)類型的成員可以是基本數(shù)據(jù)類型的變量、數(shù)組或指針,也可以是已定義
結(jié)構(gòu)類型的變量、數(shù)組或指針。③
結(jié)構(gòu)成員可以和程序中其他標識符同名,也可以和另一個結(jié)構(gòu)的成員同名。④
結(jié)構(gòu)類型定義的位置,可以在函數(shù)內(nèi)部,也可以在函數(shù)外部。在
函數(shù)內(nèi)部定義的結(jié)構(gòu)類型,只能在函數(shù)內(nèi)部使用。在函數(shù)外部定
義的結(jié)構(gòu)類型,其有效范圍是從定義處開始,直到它所在的源程
序文件結(jié)束。(b)結(jié)構(gòu)體變量的說明——三種方法。(c)結(jié)構(gòu)體變量的初始化小結(jié)結(jié)構(gòu)體變量成員的引用(a)同一類型的結(jié)構(gòu)體變量可相互賦值(b)引用結(jié)構(gòu)體成員(在無嵌套的情況下,訪問結(jié)構(gòu)成員的方法)若已定義了一個結(jié)構(gòu)變量及指向它的指針,可以用以下三種形式訪
問該結(jié)構(gòu)變量的成員:①結(jié)構(gòu)變量名.成員名、②結(jié)構(gòu)指針名->成員名、③(*結(jié)構(gòu)指針名
).成員名(c)結(jié)構(gòu)體變量的賦值、輸入和輸出(d)結(jié)構(gòu)數(shù)組的賦值、輸入和輸出
(e)結(jié)構(gòu)類型數(shù)據(jù)在函數(shù)間的傳遞用遞歸結(jié)構(gòu)處理鏈表1.遞歸結(jié)構(gòu)如果一個結(jié)構(gòu)類型的某些成員是該結(jié)構(gòu)類型的變量、數(shù)
組或指針,稱之為遞歸結(jié)構(gòu),也叫自嵌套結(jié)構(gòu)。使用最
多的遞歸結(jié)構(gòu)是:結(jié)構(gòu)的一個成員是指同本結(jié)構(gòu)類型的指針。例如:struct
node{int
data;struct
node
*next;這種遞歸結(jié)構(gòu)在處理諸如鏈表這樣數(shù)據(jù)結(jié)構(gòu)時特別有用2.鏈表的概念鏈表是一種很有用的動態(tài)數(shù)據(jù)結(jié)構(gòu),單向鏈表是一種最簡單
的鏈表,它由若干個節(jié)點首尾相接而成,每個節(jié)點有兩個域
:數(shù)據(jù)域data存放數(shù)據(jù),指針域next存放下一節(jié)點的首地
址。鏈頭指針
節(jié)點1
節(jié)點2
節(jié)點3
鏈尾單向鏈表中的節(jié)點可用如下遞歸結(jié)構(gòu)來描述:struct
node{
int
data;struct
node
*next;};通過指針將各個節(jié)點鏈接起來,就構(gòu)成單向鏈表。headdatanextdata
data
datanext
nextNLL3.動態(tài)鏈表的基本操作動態(tài)鏈表的特點是各節(jié)點所需要的存儲空間是用動態(tài)內(nèi)存分
配的方式獲得的,每個節(jié)點都沒有名字,對鏈表的操作只
能通過指針進行。動態(tài)鏈表的主要操作包括建立鏈表、刪
除節(jié)點、插入節(jié)點和鏈表的輸出。①
建立鏈表建立鏈表的過程是先建立鏈表的頭節(jié)點,并將該頭節(jié)點作為尾節(jié)點,然后不斷增加新節(jié)點,將新增的節(jié)點連接
在當前尾節(jié)點的后面而作為新的尾節(jié)點。為此,需要設
置三個指針,
h指向鏈表的頭節(jié)點,
p指向新建節(jié)點,q
指向
尾節(jié)點。hdata
next
data
nextTp
(新建節(jié)點)建立鏈表的算法(1)通過動態(tài)內(nèi)存分配申請一段存儲空間存放頭節(jié)點,將該存儲空
間的起始地址存放在指針h中,且其數(shù)據(jù)域和指針域均為空并使p
和q同時指向頭節(jié)點,表示該節(jié)點既是頭節(jié)點、也
是當前節(jié)點、又是尾節(jié)點;(2)輸入一個數(shù)a;(3)若a為0,則進入⑥;否則,進入④;(4),再申請一段空間存放下一個新建節(jié)點,起始地址存放在指
針p中,稱之為p節(jié)點。將數(shù)a存入p節(jié)點的data域,并將p節(jié)點
的首地址存入q節(jié)點的next域,這樣,p節(jié)點就被鏈接在q節(jié)
點之后。再通過將首地址p存入指針q使新建節(jié)點成為新的
尾節(jié)點。(5)繼續(xù)輸入下一個數(shù)a,
返回③;(6)結(jié)束循環(huán),并在尾節(jié)點的next域放入NULL,
作為鏈表結(jié)束的標記;(7)將鏈表的頭指針h返回調(diào)用函數(shù)。②
輸出鏈表輸出鏈表的過程是根據(jù)鏈表的頭節(jié)點找到下一個節(jié)點,先輸
出其data域中的數(shù)據(jù),然后根據(jù)其next域中的地址,取出后繼節(jié)點,輸出其data域中的數(shù)據(jù)。如此不斷選取下一個節(jié)點,
直到鏈表末尾。輸出鏈表的算法(1)根據(jù)調(diào)用程序傳遞來的鏈表首地址找到該鏈表的頭節(jié)點1(2)由頭節(jié)點next域中的地址找到下一個節(jié)點p;(3)若節(jié)點p的next域中的地址值不是NULL,
則進入下一步;否則,進入⑤;(4),輸出節(jié)點p的data域中的數(shù)據(jù),并由該節(jié)點next域中的地址
找到下一個節(jié)點,回到③;(5)返回調(diào)用函數(shù)。P244
【例7.7】先建立一個單向鏈表,將鍵盤輸入的整數(shù)1、2、
3、4、5、6、7、8、9、10依次存入該鏈表各個節(jié)點的數(shù)據(jù)
域中,當輸入整數(shù)0時,結(jié)束建立鏈表的操作。然后依次
輸出鏈表中的數(shù)據(jù),直到鏈表末尾。用一個結(jié)構(gòu)指針型
函數(shù)creatlist()來建立鏈表,以便將該鏈表的頭指針返回
調(diào)用函數(shù)。在函數(shù)creatlist()中先申請頭書點的存儲空間,
用指針h
存放該空間的首地址;然后不斷申請下一個節(jié)點的存
儲空間,其d
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)村旱地合同(2篇)
- Unit3Sport and Fitness(詞匯短語句式)-2025屆高三人教版英語一輪復習闖關攻略(解析版)
- 2021-2026年中國天然植物殺蟲劑市場深度分析及投資戰(zhàn)略咨詢報告
- 2025陽泉市豆類種植收購合同
- 2024年度天津市公共營養(yǎng)師之二級營養(yǎng)師能力測試試卷B卷附答案
- 2024年度天津市公共營養(yǎng)師之三級營養(yǎng)師強化訓練試卷B卷附答案
- 2024年度四川省公共營養(yǎng)師之二級營養(yǎng)師每日一練試卷B卷含答案
- 中國魚豆腐行業(yè)市場調(diào)查研究報告
- 2020-2025年中國注射用鹽酸頭孢替安市場前景預測及投資規(guī)劃研究報告
- 2025年純棉紗卡項目可行性研究報告
- 人教版美術五年級上冊《第2課 色彩的和諧》說課稿2
- 2024年6月浙江省高考歷史試卷(真題+答案)
- 住友(SWS)汽車連接器(Connectors)產(chǎn)品配套手冊
- 辦公樓室內(nèi)裝飾工程施工設計方案技術標范本
- 2023年香港華夏杯六年級競賽初賽數(shù)學試卷
- 高中數(shù)學放縮法
- 上海市閔行區(qū)2024-2025學年八年級(上)期末物理試卷(解析版)
- 2024年國考行測真題-言語理解與表達真題及完整答案1套
- 人教版三年級上冊數(shù)學期末測試卷可打印
- 醫(yī)療高級職稱評審論文答辯
- 設計服務保障措施方案
評論
0/150
提交評論