?? tc13.dat
字號:
第10章 結構與鏈表
為將不同數據類型、但相互關聯的一組數據,組合成一個有機整體使用,C語言提供一種稱為“結構”的數據結構.
10.1 結構類型與結構變量的定義
10.2 結構變量的引用與初始化
10.3 結構數組
10.4 指向結構類型數據的指針
10.5 鏈表處理──結構指針的應用
10.6 共用型和枚舉型
10.7 定義已有類型的別名
10.1 結構類型與結構變量的定義
C語言中的結構類型,相當于其它高級語言中的“記錄”類型.
10.1.1 結構類型定義
struct 結構類型名 /* struct是結構類型關鍵字*/
{數據類型 數據項1;
數據類型 數據項2;
…… ……
數據類型 數據項n;
}; /* 此行分號不能少!*/
[案例10.1] 定義一個反映學生基本情況的結構類型,用以存儲學生的相關信息.
/*案例代碼文件名:AL10_1.C.*/
/*功能:定義一個反映學生基本情況的結構類型*/
struct date /*日期結構類型:由年、月、日三項組成*/
{int year;
int month;
int day;
};
struct std_info /*學生信息結構類型:由學號、姓名、性別和生日共4項組成*/
{char no[7];
char name[9];
char sex[3];
struct date birthday;
};
struct score /*成績結構類型:由學號和三門成績共4項組成*/
{char no[7];
int score1;
int score2;
int score3;
};
(1)“結構類型名”和“數據項”的命名規則,與變量名相同.
(2)數據類型相同的數據項,既可逐個、逐行分別定義,也可合并成一行定義.
例如,本案例代碼中的日期結構類型,也可改為如下形式:
struct date
{int year, month, day;
};
(3)結構類型中的數據項,既可以是基本數據類型,也允許是另一個已經定義的結構類型.
例如,本案例代碼中的結構類型std_info,其數據項“birthday”就是一個已經定義的日期結構類型date.
(4)本書將1個數據項稱為結構類型的1個成員(或分量).
10.1.2 結構變量定義
用戶自己定義的結構類型,與系統定義的標準類型(int、char等)一樣,可用來定義結構變量的類型.
1.定義結構變量的方法,可概括為兩種:
(1)間接定義法──先定義結構類型、再定義結構變量
例如,利用[案例10.1]中定義的學生信息結構類型std_info,定義了一個相應的結構變量student:
struct std_info student;
結構變量student:擁有結構類型的全部成員,其中birthday成員是一個日期結構類型,它又由3個成員構成.
注意:使用間接定義法定義結構變量時,必須同時指定結構類型名.
(2)直接定義法──在定義結構類型的同時,定義結構變量
例如,結構變量student的定義可以改為如下形式:
struct std_info
{……
} student;
同時定義結構類型及其結構變量的一般格式如下:
struct [結構類型名]
{ ……
} 結構變量表;
2.說明
(1)結構類型與結構變量是兩個不同的概念,其區別如同int類型與int型變量的區別一樣.
(2)結構類型中的成員名,可以與程序中的變量同名,它們代表不同的對象,互不干擾.
10.2 結構變量的引用與初始化
[案例10.2] 利用[案例10.1]中定義的結構類型struct std_info,定義一個結構變量student,用于存儲和顯示一個學生的基本情況.
/*案例代碼文件名:AL10_2.C*/
#include"struct.h"
/*定義并初始化一個外部結構變量student */
struct std_info student={"000102","張三","男",{1980,9,20}};
main()
{ printf("No: %s\n",student.no);
printf("Name: %s\n",student.name);
printf("Sex: %s\n",student.sex);
printf("Birthday: %d-%d-%d\n",student.birthday.year,
student.birthday.month, student.birthday.day);
}
程序運行結果:
No: 000102
Name: 張三
Sex: 男
Birthday:1980-9-20
1.結構變量的引用規則
對于結構變量,要通過成員運算符“.”,逐個訪問其成員,且訪問的格式為:
結構變量.成員 /*其中的“.”是成員運算符*/
例如,案例中的student.no,引用結構變量student中的no成員;student.name引用結構變量student中的name成員,等等.
如果某成員本身又是一個結構類型,則只能通過多級的分量運算,對最低一級的成員進行引用.
此時的引用格式擴展為:
結構變量.成員.子成員.….最低1級子成員
例如,引用結構變量student中的birthday成員的格式分別為:
student.birthday.year
student.birthday.month
student.birthday.day
(1)對最低一級成員,可像同類型的普通變量一樣,進行相應的各種運算.
(2)既可引用結構變量成員的地址,也可引用結構變量的地址.
例如,&student.name ,&student .
2.結構變量的初始化
結構變量初始化的格式,與一維數組相似:
結構變量={初值表}
不同的是:如果某成員本身又是結構類型,則該成員的初值為一個初值表.
例如,[案例10.2]中的student={"000102", "張三", "男", {1980,9,20}}.
注意:初值的數據類型,應與結構變量中相應成員所要求的一致,否則會出錯.
10.3 結構數組
結構數組的每一個元素,都是結構類型數據,均包含結構類型的所有成員.
[案例10.3] 利用[案例10.1]中定義的結構類型struct std_info,定義一個結構數組student,用于存儲和顯示三個學生的基本情況.
/*案例代碼文件名:AL10_3.C*/
#include"struct.h"
/*定義并初始化一個外部結構數組student[3] */
struct std_info student[3]={{“000102”,“張三”,“男”,{1980,9,20}},
{“000105”,“李四”,“男”,{1980,8,15}},
{“000112”,“王五”,“女”,{1980,3,10}} };
/*主函數main()*/
main()
{ int i;
/*打印表頭: " "表示1個空格字符*/
printf("No. Name Sex Birthday\n");
/*輸出三個學生的基本情況*/
for(i=0; i<3; i++)
{ printf("%-7s",student[i].no);
printf("%-9s",student[i].name);
printf("%-4s",student[i].sex);
printf("%d-%d-%d\n",student[i].birthday.year,
student[i].birthday.month, student[i].birthday.day);
}
}
[程序演示]
程序運行結果:
No. Name Sex Birthday
000102 張三 男 1980-9-20
000105 李四 男 1980-8-15
000112 王五 女 1980-3-10
與結構變量的定義相似,結構數組的定義也分直接定義和間接定義兩種方法,只需說明為數組即可.
與普通數組一樣,結構數組也可在定義時進行初始化.初始化的格式為:
結構數組[n]={{初值表1},{初值表2},...,{初值表n}}
例如,本案例中的結構數組student[3].
10.4 指向結構類型數據的指針
結構變量在內存中的起始地址稱為結構變量的指針.
10.4.1 指向結構變量的指針
[案例10.4] 使用指向結構變量的指針來訪問結構變量的各個成員.
/*案例代碼文件名:AL10_4.C*/
#include“struct.h”
struct std_info student={“000102”,“張三”,“男”,{1980,9,20}};
main()
{ struct std_info *p_std=&student;
printf("No: %s\n", p_std->no);
printf("Name: %s\n", p_std->name);
printf("Sex: %s\n", p_std->sex);
printf("Birthday: %d-%d-%d\n", p_std->birthday.year,
p_std->birthday.month, p_std->birthday.day);
} [程序演示]
通過指向結構變量的指針來訪問結構變量的成員,與直接使用結構變量的效果一樣.一般地說,如果指針變量pointer已指向結構變量var,則以下三種形式等價:
(1)var.成員
(2)pointer->成員
(3)(*pointer).成員 /* “*pointer”外面的括號不能省!*/
注意:在格式(1)中,分量運算符左側的運算對象,只能是結構變量,;而在格式(2)中,指向運算符左側的運算對象,只能是指向結構變量(或結構數組)的指針變量,否則都出錯.
思考題:如果要求從鍵盤上輸入結構變量student的各成員數據,如何修改程序?
10.4.2 指向結構數組的指針
[案例10.5] 使用指向結構數組的指針來訪問結構數組.
/*案例代碼文件名:AL10_5.C*/
#include"struct.h"
/*定義并初始化一個外部結構數組student */
struct std_info student[3]={{"000102","張三","男",{1980,5,20}},
{"000105","李四","男",{1980,8,15}},
{“000112”,“王五”,“女”,{1980,3,10}} };
main()
{ struct std_info *p_std=student;
int i=0;
/*打印表頭*/
printf("No. Name Sex Birthday\n");
/*輸出結構數組內容*/
for( ; i<3; i++, p_std++)
{ printf("%-7s%-9s%-4s", p_std->no, p_std->name, p_std->sex);
printf("%4d-%2d-%2d\n", p_std->birthday.year,
p_std->birthday.month, p_std->birthday.day);
}
} [程序演示]
如果指針變量p已指向某結構數組,則p+1指向結構數組的下一個元素,而不是當前元素的下一個成員.
另外,如果指針變量p已經指向一個結構變量(或結構數組),就不能再使之指向結構變量(或結構數組元素)的某一成員.
10.4.3 指向結構數據的指針作函數參數
[案例10.6] 用函數調用方式,改寫[案例10.5]:編寫一個專門的顯示函數display(),通過主函數調用來實現顯示.
/*案例代碼文件名:AL10_6.C*/
#include"struct.h"
/*定義并初始化一個外部結構數組student */
struct std_info student[3]={{"000102","張三","男",{1980,5,20}},
{"000105","李四","男",{1980,8,15}},
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -