1、typedef的使用
a.语法
typedef 原名 别名;。
typedef struct student {int num;char name[20];char sex;
}stu,*pstu;//stu相当于struct student这个类型,*pstu相当于struct student *
别名的理解方法:若是字母前面有符号,类似于*
,将*
直接放到struct
结构体名后面即可,此时再将形成的结果:struct
结构体名 *
,与最后的字母划等号即可。此时的字母就是对应类型的别名。后面就可以使用该别名定义变量。
起别名的目的是为了实现:代码即注释。
typedef重命名的规则:重新起的名字后来出现,所以放在后面。
使用的代码
//给结构体类型起别名,叫stu,给结构体指针类型起别名:pstu
typedef struct student {int num;char name[20];char sex;
}stu,*pstu;//stu相当于struct student这个类型,*pstu相当于struct student *
typedef int INTEGER;
int main()
{stu s = { 1001,"wangle",'M' };//等价于struct student s = { 1001,"wangle",'M' }pstu p;//等价于struct student *p;等价于stu*p;INTEGER i = 10;p = &s;printf("i=%d,p->num=%d\n", i, p->num);//p是结构体指针return 0;
}
2、C++中的引用
a.语法:
在传递时,传递变量名。
在接收时,格式为:变量类型 引用符号(&) 形参名。
此时在子函数中,改变此形参值时,也会影响外部函数的变量 。
使用的代码
#include<stdio.h>
void modifynum(int& b)//形参接收
{b = b + 1;
}
int main()
{int a = 10;modifynum(a);//实参传递printf("a=%d\n", a);return 0;
}
注意:指针的类型是:指向空间类型 *
一旦引用,则形参与实参就是同一个变量,互相影响。
使用的代码
#include<stdio.h>
#include<stdlib.h>
#include<stdlib.h>
void modifynum(int& b)//形参接收
{b = b + 1;
}
void modify_pointer(int*& p)//指针的引用
{p =(int*)malloc(20);p[0] = 5;
}
int main()
{int a = 10;modifynum(a);//实参传递printf("a=%d\n", a);int* p = NULL;modify_pointer(p);//指针的传递printf("p[0]=%d", p[0]);return 0;
}
3、逻辑结构与存储结构
a.逻辑结构
集合、线性、树形、图形结构
b.存储结构
顺序、链式、索引、散列存储。
b-1:顺序存储
数组属于顺序存储。
存储元素一个按着一个,对应的地址下标也是逐步递增的。
优点:
可以实现随机存取,每个元素占用最少空间。(想取哪个元素,通过对应下标访问即可)
缺点:
只能使用整块的存储单元,会产生较多的碎片。
b-2:链式存储
每个数据单元是一个结构体,结构体分为两部分,一个存储具体的数据,另一个存储后面一个数据单元
对应的地址。
优点:
充分利用所有的存储单元,不会出现碎片现象
缺点:
需要额外存储空间存放下一节点的指针,只能实现顺序存取。(需要通过前一个节点中的地址,才能访
问到下一节点,即不能直接访问到所需的节点)
4、时间复杂度
a.算法
定义:
对特定问题求解步骤的描述
特性:
有穷、确定、可行、输入、输出
b.时间复杂度
时间复杂度是通过运行次数来反映。格式为:O(f(n))
。这里的f(n)
就是运行次数的函数
示例一:
示例二:
示例三:
示例四:
示例五:
示例六:
例题
5、空间复杂度
定义
空间复杂度S(n):指算法运算过程中使用的辅助空间的大小
算法原地工作:指算法所需的辅助空间是常量,即为O(1)