数据结构与C语言笔记(逐步完善)
1.基本概念
一、什么是指针?什么是指针变量?他们有什么关系?
指针:在计算机科学中,指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此将地址形象化的称为“指针”。地址就是内存单元的编号。
答:指针就是地址,地址就是指针。地址就是内存单元的编号。
指针变量:存放地址的变量称为指针变量。指针变量是一种特殊的变量,它不同于一般的变量,一般的变量存放的是数据本身,而指针变量存放的是数据的地址。
答:存放地址的变量称为指针变量。
指针和指针变量的关系:指针和指针变量是两个不同的概念,但要注意的是,通常我们叙述时会把指针变量简称为指针。
可一同补充说明问题:
1、指针就是地址,地址就是指针。
2、地址就是内存单元的编号。存放地址的变量称为指针变量。
3、指针和指针变量是两个不同的概念,但要注意的是,通常我们叙述时会把指针变量简称为指针。
二、数据结构的基本概念
-
数据
数据是信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。
-
数据元素
数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。一个数据元素可由若干数据项组成,数据项是构成数据元素的不可分割的最小单位。
-
数据对象
数据对象是具有相同性质的数据元素的集合。
-
数据类型
数据类型是一个值的集合和定义在此集合上的一组操作的总称。
- 原子类型。其值不可再分的数据类型。
- 结构类型。其值可以再分解为若干成分(分量)的数据类型。
- 抽象数据类型。抽象数据组织及与之相关的操作。
-
数据结构
数据结构是相互之间存在一种或多种特定关系的数据元素的集合。在任何问题中,数据元素都不是孤立存在的,他们之间存在某种关系,这种数据元素之间的关系成为结构。数据结构包括三方面的内容:逻辑结构、存储结构和数据的运算。
三、算法有哪些特点?算法和程序的主要区别是什么?
算法:是对特定问题求解步骤的一种描述,它是指令的有限序列,其中的每条指令标识一个或多个操作。
算法的五个重要特性。
- 有穷性。一个算法必须总在执行有穷步之后结束,且每一步都可在有穷时间内完成。
- 确定性。算法中的每条指令必须有确切的含义,对于相同输入只能得到相同的输出。
- 可行性。算法中描述的操作都可以通过已经实现的基本运算执行有限次来实现。
- 输入。一个算法有零个或多个输入,这些输入取自于某个特定的对象的集合。
- 一个算法有一个或多个输出,这些输出是与输入有着某种特定关系的量。
通常,设计一个“好”的算法应考虑达到以下目标。特质。
- 正确性。算法应能够正确地解决求解问题。
- 可读性。算法应具有良好的可读性,以帮助人们理解。
- 健壮性。输入非法数据时,算法能适当地做出反应或进行处理,而不会产生莫名其妙的输出结果。
- 效率与低存储量需求。效率是指算法执行的时间,存储量需求是指算法执行过程中所需要的最大存储空间,这两者都与问题的规模有关。
程序:程序是计算机指令的有序集合,是算法用某种程序设计语言的表述,是算法在计算机上的具体实现。
算法和程序的主要区别。
- 算法是解决问题的步骤,程序是计算机指令的有序集合。算法是程序的灵魂。
- 程序是结果,算法是手段。
- 程序 = 数据结构 + 算法。算法是程序设计的核心,算法的好坏很大程度上决定了一个程序的效率。先选出一个好算法,再配上一种合适的数据结构,这样程序的效率会大大提高。
四、什么是二叉树?请简述二叉树的五种基本形态。
-
. 什么是二叉树?
答: 二叉树是另一种树形结构,其特点是每个结点至多只有两棵子树(即二叉树中不存在度大于2的结点),并且二叉树的子树也有左右之分,其次序不能任意颠倒。 -
. 请简述二叉树的五种基本形态。
- 空二叉树。
- 只有一个根结点的二叉树。
- 只有左子树。
- 只有右子树。
- 完全二叉树。
2.易忽略的知识点注意事项补充
一、C语言scanf()函数补充
例1:scanf("%d%d",&a,&b);//需要用&接收。
- 说明:该函数之所以用变量地址作参数,是由C语言中参数的单向传递规则决定的。
- %d表示十进制整数。
例2:单精度浮点、双精度浮点。
scanf("%f",&x); //f格式符
scanf("%lf",&x); //double数据需要用%lf
接收。
- 用于十进制小数形式输入实数。
- %f 用于输入float型实数。
- %lf用于输入double型实数。
- 输入double型数据,必须使用%lf
☆ ☆ ☆需要注意的问题 ☆ ☆ ☆
1、可以指定输入数据所占的宽度,但是不能指定输入数据的精度。
-
例一:
- scanf("%6f",&x); //正确
- scanf("%6.2f",&y); //错误
-
例二拓展
- 1中说明scanf可以指定宽度,不能指定精度。%2d%2d
- 输入:12345678
- 输出a:12
- 输出b:34
- 输出a+b:46
- 结论:当指定宽度之后,就无需再使用空格或回车进行分隔了。
#include <stdio.h>
int main(void) {
//scanf("%2d%2d", &a, &b);//连续输入多个参数,输入时不带空格。
int a, b;
scanf("%2d%2d", &a, &b);
printf("%d\n", a);
printf("%d\n", b);
printf("%d\n", a + b);
return 0;
}
/**
开始运行...
12345678
12
34
46
运行结束。
*/
2、格式控制字符串中的普通字符,必须原样输入。
-
scanf("%d%d", &a, &b);
程序运行时,应输入:123 456或者 123换行456
-
scanf("%d,%d", &a, &b);//连续输入参数。
程序运行时,应输入:123,456(需要携带逗号“,”)
3、scanf函数本身并不能显示输入提示信息,而只能借助于printf函数显示。
- 内容过于简单,不进行案例展示。
4、scanf函数的格式控制字符串的末尾,不能添加“\n”,否则运行时不能正常退出。
- 内容过于简单,不进行案例展示。
5、scanf函数,用%c格式符输入字符型数据时,每个字符之前不需要分隔符。
- 内容过于简单,不进行案例展示。
LAST补充:不常用格式说明符
- u格式符
用于输入无符号十进制整数。 - o格式符
用于输入无符号八进制整数。 - x格式符
用于输入无符号16进制整数。 - e格式符
用于10进制指数形式输入实数。
二.C语言其他输入函数拓展。
1.C语言有多个函数可以从键盘获得用户输入,它们分别是:scanf,getchar,gets
- scanf():和 printf() 类似,scanf() 可以输入多种类型的数据。
- getchar()、getche()、getch():这三个函数都用于输入单个字符。
- gets():获取一行数据,并作为字符串处理。
三、赋值问题
1.赋值计算中出现的整型小坑。
- 注意:在这里25/3会默认识别为int整型,记为8。故后面赋值给float一样会以8进行赋值。
#include <stdio.h>
int main(void) {
float d,f;
int i,k;
i=f=k=d=25/3;
//超级大坑,25/3其实会归属为整型,记为8
printf("%5.2f\n", d);
// 8.00
printf("%3d%3d%5.2f%5.2f", i,k,f,d);
// 8 8 8.00 8.00
return 0;
}