C语言程序设计课件第12章
C语言程序设计第五版谭浩强 ppt课件
Ctrl+KV--------块移动
Ctrl+KY-------块删除 Ctrl+KH--------块隐藏
窗口操作:
F5-----窗口缩放 F6-----窗口切换
程序调试:
<>
F8-----Step over
F7-------Trace into
/* example1.1 calculate the sum of a and b*/
#include <stdio.h>
预处理命令
/* This is the main program */
void main() { int a,b,sum; /*定义变量*/ 函数
注释
的
a=10;
和
b=24;
sum=add(a,b);
空类型void
短整型short 整型int 长整型long 单精度型float
双精度型double
<
定义类型typedef
C语言程序设计
第一章 C语言概述
§1.3 简单的C程序介绍
例1.1 第一个程序This is a c program .
/* example1.1 The first C Program*/
第一章 C语言概述
C语言结构特点
❖函数与主函数
程序由一个或多个函数组成
必须有且只能有一个主函数main(),可以放在程序中任一 位置
程序执行从main开始,在main中结束,其它函数通过嵌 套调用得以执行。
❖程序语句
C程序由语句组成 用“;”作为语句终止符
❖注释
/* */为注释,不能嵌套
C语言运算符丰富(附录C)
《C语言程序设计》(第2版)苏小红-13章 12
2021/7/31
40/60
struct sample {
short i; char ch; float f; };
union sample {
short i; char ch; float f; };
2021/7/31
共用体
【例12.8】
printf("%d\n", sizeof(struct sample));
Before function call:1999/04/23 After function call:2000/05/22
指针作函数形参 实参必须为地址值
2021/7/31
33/60
struct date
{
int year; int month;
结构体变量
int day; };
作函数返回值
struct date Func(struct date p)
2021/7/31
【例12.3】利用 结构体数组计 算每个学生的 平均分
25/60
结构体指针的定义和初始化
如何定义指向结构体变量的指针?
pt STUDENT stu1; STUDENT *pt; pt = &stu1;
等价于
STUDENT *pt = &stu1;
stu1 成员1 成员2 成员3 成员4
i ch
f
8个字节
printf("%d\n", sizeof(union sample));
0x0037b00
cfih
4个字节 41/60
共用体
sizeof(union number)取决于占空间最多的那个成员 变量
同一内存单元在每一瞬时只能存放其中一种类型的成员 起作用的成员是最后一次存放的成员,不能作为函数参数 不能进行比较操作,只能对第一个成员初始化
C语言教案第12章PPT课件
3
03.12.2020
三、教学环境:
采用多媒体教学环境:黑板、投影、程序编 制、演示、调试等。
四、参考教材:
[1]C程序设计,谭浩强,清华大学出版社
[2] The C Programming Language (Second Edition)
,Brian W.Kernighan & Dennis M.Ritchie
[3] C语言大全,王子恢等译 电子工业出版社
五、课程验收:平时、实验、作业、期末
六、教学时数:48/15 4
03.12.2020
第一章 程序设计基础
5
03.12.2020
一、计算机基础知识
1、计算机系统组成 2、计算机基本工作过程 3、DOS基本知识
2.1 C程序的组成结构及特性
一、程序结构
程序一:
main() { printf(“This is a c program. \n”); }
17
03.12.2020
程序二:
# include <stdio.h>
main()
/*求两数之和*/
{int a,b,sum; /*定义变量*/
a=123;b=456;
2006年2月
1
03.12.2020
教师பைடு நூலகம்况及联系方式:
计算机科学与技术学院
计算机语言教研室
王庆北
Add:综合实验楼214房间 E-mail:zyzy@
Tel:
2
03.12.2020
一、教学内容: C语言程序设计的基本语法、基本句
法、基本结构和基本程序设计方法。
c语言程序设计12上半部分习题课_动态跟踪调试
10.四边形的边长为 四边形的边长为a,b,c,d及一对对角 四边形的边长为 及一对对角 之各angel,求四边形的面积。 之各 ,求四边形的面积。
double QuaArea(double a, double b, double c, double d, double e) { double s = (a+b+c+d)/2.; double area; area = sqrt((s-a)*(s-b)*(s-c)*(s-d)a*b*c*d*cos(e)*cos(e)); return area; } 有问题吗? 有问题吗?
补充题2.求分段函数 补充题 求分段函数
#include<stdio.h> int main() { double x, y; printf("please input x\n"); scanf("%lf", &x); if (x<1){ y = x; printf ("%lf", y); } else if (1<=x && x<10){ y = 2*x - 1; printf ("%lf\n", y); } else { y = 3*x - 11; printf ("%lf\n", y); } return 0; }
第三章习题讲解
2.设a=1,b=2,c=3,则u的值为: 设 的值为: , 的值为
u=a?b:c; u=2 u=(a=2)?b+a:c+a; u=4
3.设a=1,b=2,c=0,则下列表达式的值为: 设 ,则下列表达式的值为:
a && ! ((b || c) && !a) 1 ! (a && b) || c? a || b : a && b && c 0 ! (a+b<c) && b<=c*a-b 0
《C语言程序设计》课件
探讨C语言中的表达式,包括算术表达式和逻辑表达式。
控制流语句
if语句
介绍if语句的用法和 语法结构,以及如 何进行条件判断。
switch语句
解释switch语句的 工作原理和用法, 以处理多个条件分 支。
for循环
讨论for循环的语法 和使用方法,以便 重复执行特定的代 码块。
while循环
《C语言程序设计》PPT 课件
探索C语言程序设计的基本概念、结构和关键要点,为学习者打下坚实的基础。 通过简洁而实用的演示,带您深入了解C语言的奥秘。
概述C语言程序设计
基本概念
介绍C语言的基本概念, 如变量、数据类型和控制 流语句。
程序结构
详细解释C语言程序的基 本结构,包括预处理、编 译、汇编、链接和执行的 过程。
详解while循环的用 法,以便在满足特 定条件时重复执行 代码。
函数
1
函数概念
介绍函数的概念和作用,以及如何定义和声明函数。
2
函数调用和传参
解释如何调用函数并将参数传递给函数,以实现代码的模块化。
3
递归函数
讨论递归函数的原理和应用,以及递归的优缺点。
数组
数组定义
解释如何在C语言中定义数组, 以及如何进行初始化和访问数 组元素。
多维数组
探索多维数组的概念和用法, 以处理更复杂的数据结构。
数组指针
详细解释数组指针的概念和用 法,以访问和操作数组元素。
字符串
字符数组
介绍字符串的表示方法和处理方法,包括字符数组和字符串函数。
字符串常量
讨论字符串常量的定义和使用,以及转义字符的作用。
字符串函数
探索常用的字符串函数,如strcpy、strcat和strlen。
C语言程序设计(何钦铭_颜晖_主编)ppt课件
printf("%d, %x\n", 012, 012);
return 0;
}
0……01010
精选ppt课件2021
32
例6-2(2) 输入整型数据
# include <stdio.h> int main(void) {
int a, b;
input a, b: 17 17 15 17 f, 17
printf("input a, b:");
'\n' '\101' '\x41' 'A'
所有字符都可以用转义字符表示
精选ppt课件2021
26
6.2.2 变量
在程序运行过程中,其值可以被改变的量。
变量必须先定义,后使用 定义变量时要指定变量名和数据类型 变量应该先赋值,后引用
精选ppt课件2021
27
变量名:合法的标识符
变量的定义
整型、实型、字符型数据的存储
6.1.2 基本数据类型
整型、实型、字符型
精选ppt课件2021
4
6.1.1 数据的存储-整型数据
设整数在内存中用2个字节存储
1 000 0001 1000 0001 0 000 0001 1000 0001
符号位 1:负数 0:正数
精选ppt课件2021
5
数值的表示方法-原码 反码 补码
16或32位
short [int] unsigned short [int] 16位
long [int] unsigned long [int]
32位
有符号 short
1 000 0000 0000 0000 -32768 -215
C语言程序设计教程ppt课件(2024)
使用嵌套的for循环打印九九乘法表。
23
04
数组与字符串处理
2024/1/30
24
一维数组定义和操作
2024/1/30
01
一维数组定义
类型说明符 数组名
[常量表达式];
02
一维数组初始化
在定义数组时对数 组元素赋以初值;
04
一维数组操作
包括赋值、输入输
03
出、排序、查找等
。
一维数组引用
do-while循环
与while循环类似,但至少会执行一次 循环体。
示例
int i = 0; do { printf("%d ", i); i; } while (i < 10);
语法
do { // code to be executed } while (condition);
2024/1/30
19
赋值运算符
包括赋值运算符(=)和复合赋 值运算符(+=、-=、*=、/=、 %=),用于为变量赋值或进行 运算后赋值。
12
类型转换与运算顺序
2024/1/30
类型转换
当不同类型的数据进行运算时,需要进行类型转换,包括自 动类型转换和强制类型转换。自动类型转换由编译器自动完 成,而强制类型转换需要使用类型转换运算符。
0。
free函数
用于释放已分配的内存空间 ,避免内存泄漏。
2024/1/30
36
指针在数组、字符串等数据结构中应用
指针与数组
数组名本质上是一个指向数组首元素的指针;通过指针可 以访问和修改数组元素。
指针与字符串
字符串在C语言中以字符数组的形式存储,指针可以方便 地操作字符串。
c语言程序设计第三版谭浩强第十二章位运算
29
程序如下: 运行情况如下: #include <stdio.h> a=157653,n=3 void main() 15765 3 { unsigned a,b,c; 75765 int n; scanf(“a=%o,n=%d”,&a,&n); b=a<<(16-n); c=a>>n; c=c|b; 运行开始时输入八进制数157653 157653, 运行开始时输入八进制数157653, printf(“%o\n%o”,a,c); 即二进制数1101111110101011 即二进制数1101111110101011 } 循环右移3位后得二进制数0111101111110101 循环右移3位后得二进制数0111101111110101 即八进制数75765 即八进制数75765
14
即等效于以下两步:
① 执行前两个赋值语句:“a=a∧b;”和“b =b∧a;”相当于b=b∧(a∧b)。 ② 再执行第三个赋值语句: a=a∧b。由于a的 值等于(a∧b),b的值等于(b∧a∧b), 因此,相当于a=a∧b∧b∧a∧b,即a的值等 于a∧a∧b∧b∧b,等于b。 a得到b原来的值。
9
应用:按位或运算常用来对一个数据的某 些位定值为1。例如:如果想使一个数a 的低4位改为1,只需将a与017进行 按位或运算即可。 例: a是一个整数(16位), 有表达式:a | 0377 则低8位全置为1,高8位保留原样。
10
12.1.3“异或”运算符( 12.1.3“异或”运算符(∧)
异或运算符∧也称XOR运算符。它的规则是: 若参加运算的两个二进制位同号则结果为0(假) 异号则结果为1(真)
5
按位与的用途: 按位与的用途: (1) 清零
C语言程序设计教程(第5版)王秀鸾全册PPT课件
ANSI 标准
2. C语言的特点
(1)语言简洁、紧凑,使用方便、灵活。 (2)支持结构化程序设计 。 (3)运算符丰富。 (4)数据类型丰富。 (5)较强的编译预处理功能。 (6)C语言的可移植性好。 (7)C语言本身既有一般高级语言的优点,又有低级 (汇编)语言的特点 。 (8)语法限制不太严格,程序设计自由度大。
printf(“sum is %d \n”,sum ); /* 输出sum的值 */
}
程序的运行结果为:
sum is 8
【例1.5】求两个整数中的较小者
#include “stdio.h”
main( )
/* 主函数 */
{ int x,y,m;
/* 定义变量 */
int fun(int a,int b);
1.1 程序设计的基本概念
1.1.2程序设计的一般过程
① 分析、理解问题 ② 解决方案(大致的思路),建立数学模型 ③ 求解步骤和流程(算法)(文字、符号等的描述) ④ 使用程序设计语言编写源程序 ⑤ 运行调试程序 ⑥ 整理输出结果,写出相关文档
分析 问题
确定处 理方案
确定操 作步骤
编写 程序
图1.1 程序设计的一般过程
1.2.2 初识C语言程序
(1) C程序的构成 【例1.4】求两个整数m与n的和。
#include “stdio.h”
main( )
/* 主函数 */
{int m,n,sum;/* 定义变量m,n, sum*/
m=5; n=3; /* 给变量m,n赋值 */
sum=m+n; /* 求m+n的值,并赋给变量sum */
上机运 行程序
整理 结果
C语言程序设计(李圣良)章 (12)
实验指导 任务二
(1) 调试下面求解一元二次方程的程序,按要求输入数据
多次运行程序,写出每次的运行结果。
# include <stdio.h> # include <math.h> main() { float a,b,c,d,x1,x2,p,q;
printf("a,b,c="); scanf("%f%f%f",&a,&b,&c); d=b*b-4*a*c; if (d>=0) { x1=(-b+sqrt(d))/(2*a);
实验指导
实验内容
任务一
(1) 调试下面,用相应格式输出各种类型数据的程序,写
出运行结果。
# include <stdio.h>
main()
{
int a=98; float x=1234.567; char ch='H';
printf("%d\n",a);
printf("%c\n",a);
printf("%f\n",x);
实验指导
实验内容
任务一 调试如下程序,输入三个数,输出最大数。写出程序的运 行结果,思考每次程序运行的流程。
实验指导
# include <stdio.h>
main()
{
int a,b,c;
printf("a,b,c=");
scanf("%d%d%d",&a,&b,&c);
if (a>b)
if (a>c)
实验指导 (2) 上面的程序无论输入什么数据,输出面积结果都是 0.00。将对应公式的赋值语句改为“s=1.0/2*(a+b)*h; ”就 会得到正确的结果,请解释原因。修改程序后,调试正确并求 上底为1.2、下底为4.8、高为3.6的梯形的面积,写出运行结 果。 原因:
计算机C语言顺序结构程序设计课件
3.2 格式输入与输出函数
在使用C语言函数时,要用预编译命令“#include”将有关的“头文件”包含 到用户源文件中。在头文件中包含了与用到的函数有关的信息。例如,使用 标准输入输出库函数时,要用到“stdio.h”文件,文件后缀中的“h”是head 的缩写,#include命令都是放在程序的开头,因此这类文件被称为“头文 件”。在调用标准输入输出库函数时,文件开头应有以下预编译命令: #include<stdio.h> 或 #include "stdio.h" stdio.h是standard input & output的缩写,它包含了标准I/O库有关的变量 定义和宏定义。
3.2.2 格式输入函数(scanf( ))
1.scanf( )函数的一般格式 scanf(格式控制,地址表列) 格式控制:同printf()函数; 地址表列:由若干个地址组成,可以是变量的地址,或字符串的首地址。
上一页 下一页 返 回
字符串尾部加上一个转义字符‘\0’(空字符,其ASCII码值为0)作为字符 串的结束标志,系统据此判断字符串是否结束。字符串常量中不能直接包 括单引号、双引号和反斜线“\”。 【例3.6】 用scanf( )函数输入数据。 【程序代码】 #include "stdio.h" main( ) { int a,b,c; scanf("%d%d%d",&a,& b,&c); printf("%d,%d,%d\n",a,b,c); } 运行结果如下:
【例3.8】 输出单个字符。
【程序代码】
#include "stdio.h"
C语言程序设计课件:C 程序基本结构
值,然后利用printf()进行输出。
# include <stdio.h>
int main()
{
/* 定义字符型变量,并给它们赋初值 */
char c1, c2, c3, c4, c5, c6, c7;
c1 = 'C';
c2 = 'h';
c3 = 'i';
入和输出函数,
函数scanf()和printf()来完成数据的格式输
入和输出操作,其作用是向默认的输入设备
(键盘)和输出设备(终端或显示器)输入
或输出若干个任意类型的数据。
1.printf()函数的功能
printf()函数称为格式输出函数,最末一个字母
f 即为“格式”(format)之意,格式输出函
控制语句、复合语句、空语句与类.
介绍这些基本语句及其在顺序结构中的应用,
可以使读者对C 程序有一个初步的认识,为
以后的学习打下基础
(1)表达式语句:表达式语句由表达式加上分号“;”组成,运
行结果可以得到表达式的值。其一般形式为:
表达式;
例如:x=y+z; 赋值语句;
i++; 自增1 语句,i 值增1
/* 输出原码 */
printf("原码是:%c%c%c \n", c1, c2, c3);
/* 对字符进行译码运算 */
c1 = c1 + 6;
c2 = c2 + 6;
c3 = c3 + 6;
/* 输出译码结果 */
printf("密码是:%c%c%c \n", c1, c2, c3);
c语言程序设计教程第七道第十二章课后练习题
目录习题7 (1)选择题 (1)2.程序填空题 (3)习题8 (5)1.填空题 (5)习题9 (9)选择题 (9)程序填空题 (12)习题10 (13)选择题 (13)习题11 (15)选择题 (15)程序填空题 (18)习题12 (20)选择题 (20)程序填空题 (22)习题7选择题(1)在C语言中,引用数组元素时,其数组下标的数据类型允许是(C)。
A.整型常量B.整型表达式C.整型常量或整型表达式D.任何类型表达式(2)若有说明:int a[0];则对数组元素的正确引用是(D)。
A.a[10];B.a[3.5]C.a(5)D.a[10-10](3)设有数组定义:char array[]=”china”;则数组array所占的空间为(C)。
A.4个字节 B.5个字节 C.6个字节 D.7个字节(4)若二维数组a有m列,则在a[i][j]的元素个数为(B)A.J*m+IB.i*m+jC.i*m+j-1D.i*m+j+1(5)若有说明:int a[][3]={1,2,3,4,5,6,7};则a数组第一维的大小是(B)。
A.2 B.3 C.4 D.无确定值(6)以下不正确的定义语句是(B)。
A.double x[5]={2.0,4.0,6.0,8.0,10.0};B. int y[5]={0,1,3,5,7,9};C. char c1[]={‘1’,’2’,’3’,’4’,’5’};D. char c2[]={‘\x10’,’\xa’,’\x8’};(7)以下不能对二维数组a进行正确的初始化的语句是(C)。
A. int a[2][3]={0};B. int a[][3]={{1,2},{0}};C. int a[2][3]={{1,2},{3,4},{5,6}};D. int a[][3]={1,2,3,4,5,6};(8)以下能对二维数组a进行正确初始化的语句是(B)。
A. int a[2][]={{1,0,1},{5,2,3}};B. int a[][3]={{1,2,3},{4,5,6}};C. int a[2][4]={{1,2,3},{4,5},{6}};D. int a[][3]={{1,0,1},{ },{1,1}}; \\D中间初始值不存在,{}的初始化是错误的(9)以下不能正确的字符串赋初值的语句是(A)。
教学课件:《C语言程序设计》(第4版)苏小红
#include <stdio.h> int main()
{
printf("%d\n", 1+1);
return 0;
}
既非英语,也非机器语言,但更像英语 高级语言程序必须通过编译器或解释器翻译成机器语言形
式的目标代码,才能被计算机识别和执行 易学、易用、易读、易懂、强大、可移植
21/37
高级语言的 发展历程
00000101
00000001
00000000
17/37
问题12:如何让程序员远离二进
制?
Both learn a third-party language
用助记符代表机器指令的操作码
– 用一个汇编器(Assembler)将这些符号翻译成机器可识
别、可执行的二进制指令——汇编过程
汇编语言(Assembly Language)
– 奥秘:高速的检索演算能力及其海量的存储能力 (200万棋谱)
年6月底,在英国著名的布莱切利庄园举 行了一场国际人工智能机器测试竞赛
– 由俄罗斯专家设计的“叶甫根尼”电脑程序脱颖而 出
– 其29.2%的回答均成功“骗过”了测试者,被视为 目前世界上最接近人工智能的机器
• 机器语言(Machine Language)
– 用机器语言编写的一组机器指令的集合,称为 机器代码(Machine Code),简称机器码
– 用一系列二进制0和1组成的二进制代码代表不
同的机器指令
– 机器语言编写的1+1程序——犹如天书计!算机的母语
10111000 00000001
是什么?
00000000
眼睛和耳朵
大脑
11/37
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 这种插入方法无需定义tail指向最后一个结点,代码最简洁
方法3:按序插入法的关键是:
• 首先要通过搜索找到新结点的插入位置,这在后面有序插入 算法中介绍
• 假设找到的插入位置是在p1指针所指的结点后,在p2指针所 指的结点前插入
• 则关键的语句为:p1->next=p; 和 p->next=p2;
用结构化程序设计的思想,将系统分成5大功能模块:
• 显示基本信息
• 基本信息管理: 插入、删除、修改学生记录3个子模块
• 学生成绩管理:计算学生总分、根据总分排名两个子模块
• 考试成绩统计:求课程最高分、最低分、平均分3个子模块
• 根据条件查询:根据学号、姓名、名次查询3个子模块
2020/1/29
一个元素结点前面插入,同时遍历链表结束的条件不是
p==NULL,而是p在向后移动过一次以后,再一次满足p==head
引申:双链表(选讲)
• 区别:如果一个链表中各个结点的指针域有两个,分别指向
其直接前趋和直接后继,就成为双向链表,第一个结点指向前
趋的指针和最后一个结点指向后继的指针均为空指针
• 变化:在插入和删除时需要修改的指针数量比单链表要加倍
p==NULL而是p在向后移动过一次以后,再一次满足p==head。
(2)带表头结点的单链表:
• 为什么要带表头:单链表中插入或删除一个结点时一定要考 虑是否需要修改头指针,操作不方便
• 改进方法:在单链表真正的第一个结点前面增加一个附加结 点,其数据域通常不放什么有用信息,该结点称为表头结点
• 好处:插入或删除时无需考虑修改头指针的问题 • 变化:用遍历思想访问时终止条件不变但多1次指针的移动
11
逆 置
演示
过 程
其他类型的单链表
(1)单循环链表:
• 为什么要循环:单链表如果丢失了头指针则无法访问链表 • 改进方法:将单链表最后一个结点的指针域由空指针改为指
向链表的第一个结点形成一个循环链 • 好处:从任意一个结点位置开始均可以遍历整个单链表 • 变化:用遍历思想进行访问时链表结束的终止条件不是
为直接使用list.h中定义的各种单链表操作的函数,需 要对node.h和prepare.h两个文件中的内容作相应改造
文件的选择:用二进制文件存储学生的信息
• 在file.h中定义3个主要的函数: • void createFile( ):建立初始的数据文件 • struct node * readFile(struct node *head):将文件中的内
typedef int Type;
struct Node {
结点的数据成员名data, 结类点型的为指Ty针pe成员名next,类 型为struct Node*
Type data;
struct Node *next;
};
特别提醒:next前的*号不能丢失,否则就成为死循环定义啦!
作,从而保证无论Type代表何种类型,链表的基本操作不变 • (3)list.h:定义了单链表的各种操作,包括用3种方法建立链
表、插入、删除、查找、遍历、逆置等基本操作 • (4)li12_1.c:测试单链表各种应用的完整程序,包含了以上
3个文件,其中定义了菜单函数,运行函数和主函数
2020/1/29
2020/1/29
数据域
4
指针域
单链表的 一个结点
单链表
这是最重要
一个单的链头表指示针例:
最后一个结点的指 针域值为0(NULL)
1
2
3
40
链表结构的优点是:
• 系统不必为应用程序分配一组连续的空间,可以充分利用系 统的零散空间;有一个元素就生成一个结点,空间不浪费
• 如果内存空间足够大,理论上这一批数据的容量不受限制
在VC++下运行程序进行演示
2020/1/29
18
本章小结
本章主要介绍了单链表的各种操作及一个管理系统 的实现。
关于单链表:
• (1)如何用指针和结构体递归定义形成单链表,对单链 表的各种操作:建立、遍历、插入、删除、查找、逆置等 方法进行了详细介绍并用完整的代码实现
• (2)强调代码重用思想,对结点的数据类型用自定义类 型标识符Type来表示,定义特定的基本操作,从而保证了 单链表各种操作的实现函数的代码的通用性
• 关键代码:
• while(p&&!equal(p->data,data,1))
•
p=p->next;
2020/1/29
9
动 态
演示
过 程
单链表
单链表的插入:向一个单链表中插入以给定值为数据域 信息的结点。
常见的插入方法有两种:
• ①直接在链表尾部插入 • ②依照数据域的值有序(非递减有序或非递增有序)插入 • 无论哪一种方法的插入,都需要通过指针申请一个新结点空
• 关键代码的: 一个输出函数
• for(p = head; p; p = p->next) • printNode(p->data);
动 态
演示
过 程
单链表的查找:在该单函链数表是中根搜据索结点是的否数存据在这样的结点,
其数据域或数据域域的类某型一定项义等的于一给个判定断待元搜索的值。
• 查找返回:若存在则素返值回是指否向相该等结的点函的数指针,否则返回空指针
逆置 • 其他类型的链表结构简介
学生档案成绩管理系统的设计与实现:
• 如何划分模块,每一个模块的具体功能是什么 • 数据类型的定义 • 用文件实现数据的永久存储 • 系统的完整实现
2020/1/29
3
单链表
为什么需要链表结构?
• 一批类型相同的数据用数组存储所存在的问题:
• (1)定义静态数组时必须指定数组的元素个数,此后无法更 改数组大小,可能造成空间浪费或不足
间,然后将该结点通过修改特定结点的指针域插入链表中
单链表的删除:从单链表中删除指定值的结点
• 首先要用遍历的思想查找该值的结点是否在单链表存在 • 一定要有一个指向待删除结点前趋结点位置的指针以便删除
2020/1/29
尾 插
演示
过 程
序 插
演示
过10 删 程除
演示
过 程
单链表
单链表的逆置:将原单链表中各结点的指向关系置反
• (2)用指针可以申请动态数组,空间不会浪费或不足,但仍 然是需要连续的存储空间
• (3)在数组中插入或删除元素时需要大量移动元素,效率低
什么是链表结构?
• 与数组不同,数组元素逻辑上相邻物理地址上也相邻,而链 表结构其数据元素作为一个个结点的数据域,结点中另有指 针域存储逻辑上相邻的其他元素的起始地址,单链表较常用
14
学生成绩档案管理系统的 设计与实现
为实现该系统,需要解决以下问题:
• ① 数据的表示,用什么样的数据类型能正确、合理、全面地 表示学生的信息,每个学生必须要有哪些信息。
• ② 数据的存储,用什么样的结构存储学生的信息,有利于可 扩充性并方便操作。
• ③ 数据的永久保存问题,数据以怎样的形式保存在磁盘上, 避免数据的重复录入。
• 逐个申请结点空间 • 对每个结点的数据域赋值 • 每个结点的指针域如何赋值取决于建立方法 • 将新结点加入到链表中,即修改链表中某一个结点的指针域
方法1:后插法的关键是:
• 新结点的指针域值一定为空,因为它是新的最后一个结点 • 头指针只要修改一次,即在空链状态下插入第一个点时修改 • 保证tail指针始终指在当前链表的最后一个结点处,即新结点
• 原来的前趋变后继 • 原来的第一个结点变成最后一个结请点在VC++下运行完 • 原来的最后一个结点变成第一个结整点程序进行演示 • 并且所有相邻结点的指向关系都要置反
单链表的完整操作:完整程序由4个文件组成:
• (1)node.h:定义链表结点的类型,Type代表结点的数据域类型 • (2)prepare.h:定义结点的数据成员类型中需要的一些基本操
•
int total;
•
int rank;
• };
• typedef struct Student Type;
存储结构的选择:一维数组还是单链表?
• 无论从内存空间的使用效率上,还是操作的便捷程度上,单
链表结构要优于数组结构,以Type为结点的数据域类型
2020/1/29
16
学生成绩档案管理系统的 设计与实现
容读出置于单链表中 • void saveFile(struct node *head):将链表中各结点的值依
次写入文件
2020/1/29
17
学生成绩档案管理系统的 设计与实现
完整的程序用两级菜单四层多个函数5个文件实现:
• ① 修改后的node.h(见12.2.1节) • ② 修改后的prepare.h(见12.2.2节) • ③file.h(见12.2.3节) • ④list.h(见12.1.8节的第3个文件,无需改动) • ⑤li12_2.c,系统实现的最主要文件
(一)单链表的建立:
• 常用的有3种建立方法: • 后插法:新结点插入在链表的最尾部,作为新的尾结点 • 前插法:新结点插入在链表的最前部,作为新的第一个结点 • 按序插入法:新结点插入在链表的特定部位保持元素值有序
2020/1/29
6
单链表
无论是哪一种建立方法,共同的操作是:
• 最主要的是指向第一个结点的头指针,有时需要设一个指向 最后一个结点的尾指针以方便操作,注意头指针该如何修改
2020/1/29
12
其他类型的单链表