补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.

Slides:



Advertisements
Similar presentations
电子成绩单项目实现.
Advertisements

第10章 结构体与链表 本章要点: 结构体类型与结构体变量的定义 结构体变量的引用与初始化 结构体数组 链表处理 共用体类型和枚举类型
第一章 C语言概述 计算机公共教学部.
第三章 鏈結串列 Linked List.
计算机硕士专业基础—C语言 赵海英
資料結構與C++程式設計進階 資料結構概論 講師:林業峻 CSIE, NTU 6/ 7, 2010.
数据结构与算法 数据结构与算法实验
第八章 类和对象.
第九章 系 统 安 全 性 9.1 结构体 9.2 结构体型数组  9.3 结构体型指针 9.4 内存的动态分配 9.5 共用体
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置-(6) 4-2 鏈結串列的基礎-(7)
Linked List Operations
單向鏈結串列 Singly Linked Lists.
第2章 线性表 线性结构 是一个数据元素的有序集合。.
第4章 串 串的基本概念和C语言的串函数 串的存储结构 动态数组实现的顺序串 串的模式匹配算法——BF算法 主要知识点.
第6章 佇列(Queues) 6-1 佇列的基礎 6-2 佇列的表示法 6-3 環狀佇列 6-4 雙佇列.
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
第7章 结构体、联合体和枚举类型 本章导读 本章主要知识点 《 C语言程序设计》 (Visual C++ 6.0环境)
C语言程序设计 第十二章 位运算.
C程序设计 第9章 自定义数据类型 主讲教师: 鲁 萍 西安建筑科技大学 理学院.
程式設計 博碩文化出版發行.
C 程式設計— 結構 台大資訊工程學系 資訊系統訓練班.
第11章 查找 主要知识点 查找的基本概念 静态查找表 动态查找表 哈希表.
佇列 (Queue).
计算概论 第二十一讲 文件操作 北京大学信息学院.
编译原理与技术 类型检查 2018/11/21 《编译原理与技术》-类型检查.
结构体和共用体 2 梁春燕 华电信息管理教研室.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
Chap 9 结构 9.1 构建手机通讯录 9.2 结构变量 9.3 结构数组 9.4 结构指针.
第12章 樹狀搜尋結構 (Search Trees)
第9章 自訂資料型態 – 結構 9-1 結構資料型態 9-2 結構陣列 9-3 指標與結構 9-4 動態記憶體配置 9-5 聯合資料型態
STRUCTURE 授課:ANT 日期:2010/5/12.
C++语言程序设计 C++语言程序设计 第四章 数组及自定义数据类型 C++语言程序设计.
Ch.3 栈和队列 黄刘生 中国科学技术大学计算机系 国家高性能计算中心(合肥)
第九章 结构体和共用体 结构体的定义 结构体的使用 共用体的定义 共用体的使用 主讲:李祥 时间:2015年10月.
C语言程序设计 李祥.
第2章 线性表 线性表抽象数据类型 顺序表 主要知识点 单链表 循环单链表 循环双向链表 静态链表 设计举例.
第十章 C高级程序应用—链表* 10.1链表的基本概念 10.2单向链表 10.3双向链表 10.4应用举例.
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第五章 指针 5.1 指针的概念和定义 5.2 指针运算 5.3 指针和数组 5.4 字符串指针 5.5 指针数组 5.6 指向指针的指针
第十二章 文件 12.1 C文件概述 文件:存储在外部介质上数据的集合,是操作系统数据管理的单位 文件分类 按文件的逻辑结构: 按存储介质:
第3章 堆栈和队列 堆栈 堆栈应用 队列 队列应用 优先级队列 主要知识点.
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
多维数组与指针 用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。但在概念上和使用上,多维数组的指针比一维数组的指针要复杂一些。 1. 多维数组元素的地址 先回顾多维数组的性质,可以认为二维数组是“数组的数组”,例 : 定义int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
THE C PROGRAMMING LANGUAGE
第13章 结构体的应用 13.1 了解由用户构造的数据类型 13.2 结构体类型说明及结构体变量 13.3 结构体数组
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
Struct結構 迴圈
自我參考結構 (self-reference – 1)
7.1 广义表的概念 广义表是n(n≥0)个数据元素组成的序列,其中每个数据元素或是单个数据元素(简称原子),或仍然是一个广义表 。
C语言程序设计.
第十章 用户自定义数据类型 目录 学生信息管理系统的开发 结构体数据类型的概述 结构体变量的使用 结构体数组
OOP6 結構Struct 黃兆武.
目录 9.1 结构体类型 9.2 共用体类型 9.3 枚举类型 9.4 类型声明符typedef 1.
第十章 结构体与链表 西安工程大学.
第1章 绪论 北京师范大学 教育技术学院 杨开城.
第7章 樹與二元樹(Trees and Binary Trees)
第三章 数据抽象.
C语言程序设计 李祥 QQ:
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 类型、对象、运算符和表达式.
第二章 基本数据类型 ——数据的表示.
第13章 文 件.
第七章  数 组.
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置-(6) 4-2 鏈結串列的基礎-(7)
第十二章 位运算.
第18讲 从C到C++ 计算机与通信工程学院.
第9章 C++程序设计初步 9.1 C++的特点 9.2 最简单的C++程序 9.3 C++的输入输出 9.4 函数的重载
安排座位.
第十二章 C与C C转入C++时不需改变的内容 12.2 C转入C++的一些与类无关的 新特性
Presentation transcript:

补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名

一、概述 数组:同类型数据的集合; C构造类型 结构体:不同类型数据的集合; 共用体:不同类型的量共用存储单元。 若:表示学生多门课成绩,各门课成绩数据类型一 致,适合用数组表示。 若:对一系列整数排序,适合用数组表示。

若:编程处理若干学生的基本情况;其中每个学生 的基本情况由若干项组成,而各项的类型可能 相同或不同。 项目: 学号 姓名 性别 出生日期 成绩 电话号码 数据: 类型: 长整/字串 字串 字符 字串 整型 字串 该例中构成每个学生基本情况的数据类型不同, 可采用结构体这种数据类型实现。 210510 Li Feng M 1984.5.4 680 029-8482500

二、定义结构体类型和定义结构体变量 1. 定义结构体类型 定义一般形式:struct 结构体名 { 类型标识符 成员名1; 类型标识符 成员名2; ┇ 类型标识符 成员名n; } ; 其中: 1) struct 结构体名组成具体的结构体类型标识符,可用这个结构体类型标识符去定义变量等对象; 2) 结构体名、成员名应符合标识符命名规则; 3) 类型标识符确定各成员类型;

注意: 1) 成员的类型也可是已定义过的结构体类型; 如:struct date /*该结构体有3个成员*/ { int m; int d; int y; }; struct student /*该结构体有6个成员*/ { long num; char name[20]; char sex; struct date birthday; /*成员类型:结构体*/ float score; char tel[15]; } ;

2)自引用结构 struct node { int data; struct node *next; /*链节成员*/ }; 其中: 成员data用于存放一个节点的具体数据; 成员next是指针类型,用于存放下一节点指针, 最后一个节点的next 成员存放空指针NULL; 成员next是指向与自身同一类型的结构,这种结 构称为自引用结构。(只有指针成员可自引用)

2. 定义结构体类型的变量 三种定义方法: 1) 先定义结构体类型,再用类型标识去定义变量 struct student stu1, stu2;  struct student是已定义的结构体类型标识符;  stu1、stu2是所定义的结构体变量;编译时将为 结构体变量分配各自的存储空间; 2) 定义类型的同时定义变量 struct student { …; /*各成员的定义*/ …; } stu1, stu2;

3) 不使用结构体名,定义类型的同时定义变量 struct /*无结构体名*/ { …; …; } stu1, stu2; 说明:  结构体变量可以是局部的或全局的。  结构体变量存储空间大小为各成员长度之和; 如变量stu1存储字节数:4+20+1+6+4+15=50

三、结构体变量的引用 数组引用的单位是元素,而不能引用整个数组。 结构体变量引用的单位则是成员,同样结构体 变量不能被整体引用。 引用形式:结构体变量名 . 成员名 其中:成员运算符’ . ’ : 一级,自左而右;

struct student { long num; char name[20]; } stu1 ; stu1.num 引用结构体变量stu1的num成员; stu1.name[i] 引用name成员的第i个元素;

【例】定义结构体变量存放两位学生的基本情况, 计算平均成绩,并以大写形式输出name成员。 四、结构体变量的初始化 定义结构体变量的同时用初值表给出初值。 【例】定义结构体变量存放两位学生的基本情况, 计算平均成绩,并以大写形式输出name成员。 #include "stdio.h" struct student /*定义全局结构体类型*/ { long num; char name[20]; float score; }; main( ) /*↓按成员顺序给出初值*/ { struct student stu1={109031,"Li Feng",89.0}, stu2={109032,"Wang Li",71.0}; float aver; int i; …; }

五、指针与结构体 指向结构体变量的指针 一个结构体变量的指针是该变量存储区域的起 始地址,它指向结构体这个整体。 在程序中可定义一个指向同类型结构体的指针 变量,并将该指针变量指向某结构体变量,之后便 可利用指针变量访问各成员。

【例】利用结构体指针,对某学生基本情况赋值并输出。 main( ) { struct student { long num; char name[20]; float score; } stu1, *p; stu1.num=99001; strcpy(stu1.name, "Li Feng"); stu1.score=89.5; p=&stu1; printf("num:%ld\n", (*p).num); printf("name:%s\n", (*p).name); printf("score:%7.2\n", (*p).score); } YS stu1 p &stu1 468 472 473 ┇ 491 492 99001 89.5 name[0] name[1] ┇ name[19]

说明: 1) 当p=&stu1; 且保持不变时, (*p).num表示访问p所指向变量的num成员; 其中:*号为2级,括号可保证先使p与*结合。 2) 当p=&stu1; 且保持不变时有: stu1.num  (*p).num  p->num 3) ->称为指向成员运算符;1级,自左而右; p->num中->代替了*和. 运算符,看着更直观; 如: p->score:访问p所指向变量的score成员; p->name[i]:访问p指向变量的name成员第i个元素。

4)指针在使用前必须赋初值,使其指向一个确切的地址。 赋值的方法 指向一个变量的地址。 struct student stu1, *p; p=&stu1; 用malloc开辟一个新的空间。

动态内存分配和释放 建立和维护动态数据结构需要实现动态内存 分配;如在链表中插入节点需要先申请一段存储 区域,而删除一个节点需要释放该节点原先占用 的存储区域,这可由标准函数实现。 内存分配函数原形: void *malloc(unsigned size); 功能:在内存申请一块长度为size个字节的空间; 若申请成功,该函数返回指向存储块起始 地址的指针,该指针类型为void *;否则返 回空指针(NULL)。 内存释放函数原形:void free(void *p); 功能:释放p所指向的内存块。

{ struct student *head; int i, len; main( ) { struct student *head; int i, len; len=sizeof(struct student); /*求类型长*/ head=(struct student *)malloc(len); /*申请新节点*/ ┇ free(head); /*释放被删除节点的存储区*/ }

用typedef定义类型的别名 关键字typedef可用来为类型标识符建立一个 别名,这个别名同样可用于变量、数组、函数等 对象的声明。 使用一般形式:typedef 原类型名 新类型名; 其中:原类型名可以是标准的或用户定义的; 新类型名即为别名,别名通常大写; 意义: 1) 用较短的别名代替用户定义的结构体类型名; 2) 使程序具有更好的通用性。

datatype data; struct node *next; }lklist; lklist *head ;<=> 如:typedef float REAL; /*定义类型别名*/ REAL x, y; /*用类型别名定义变量*/ 如:typedef unsigned long ULONG; ULONG a, b; 如: typedef int datatype; typedef struct node { datatype data; struct node *next; }lklist; lklist *head ;<=> struct node *head ;

综合练习 例 输入10个学生的学号、姓名和成绩,输出学生的成绩等级和不及格人数。 每个学生的记录包括学号、姓名、成绩和等级 要求定义和调用函数set_grade根据学生成绩设置等级,并统计不及格人数 等级设置: A :85-100;B:70-84;C:60-69;D:0-59

调用set_grade返回主函数后,主函数中结构数组stu的元素的grade成员已经被赋值 例 源程序 int set_grade(stud * p) { int i, n = 0; for(i = 0; i < N; i++, p++){ if(p->score >= 85) p->grade = 'A'; else if(p->score >= 70) p->grade = 'B'; else if(p->score >= 60) p->grade = 'C'; else{ p->grade = 'D'; n++; } return n; #define N 10 typedef struct student{ int num; char name[20]; int score; char grade; }stud; int main(void) { stud stu[N], *ptr; ptr = stu; /* 输入 略 */ count = set_grade( ptr ); … } 调用set_grade返回主函数后,主函数中结构数组stu的元素的grade成员已经被赋值