【数据结构学习1】关于typedef,struct,&,局部全局变量,时间复杂度
来源:互联网 发布:淘宝seo pdf 编辑:程序博客网 时间:2024/05/22 05:17
【这个博客东西大部分是别人的东西,我只是学习记录并做一个整理,如果博客中有侵犯您的著作权,请告知删除,谢谢】
1,关于typedef 的使用 如:
typedef char* PCHAR;
PCHAR pa, pb; (这样PCHAR便可以作为char*来使用)
如:
struct tagPOINT1
{
int x;
int y;
};
然后用struct tagPOINT1 p1;来创建p1;
typedef struct tagPOINT
{
int x;
int y;
}POINT;
POINT p1; 这样便可以直接把当作 typedef struct tagPOINT POINT p1来使用
(疑问是:结构体尾部是什么意思 也就是POINT 表达的是什么意思?为什么不是使用tagPOINT?)
2,复习一下结构体:struct 结构体名{
结构体所包含的变量或数组
}(尾部可加变量);
结构体名字可以不写,但是后续不可以直接拷贝。struct 结构体名字 +变量名;
结构体的赋值:
网上拷贝例子如:
- struct stuff {
- char job[20];
- int age;
- float height;
- }Huqinwei;
可通过:
- struct stuff Huqinwei = {"manager",30,185}; /来直接赋值/
或者:
- Huqinwei.job[0] = 'M';
- Huqinwei.job[1] = 'a';
- Huqinwei.age = 27; /通过结构体.元素 来访问。
另外通过第一次上机自己的实验发现,直接可以 struct stuff 名字=Huqinwei 来通过存在结构体整体赋值!
那怎么回到刚刚的疑问:为什么 通过typedef struct后,直接定义是可以通过 变量名来定义?也就是上面的POINT!
通过网络解释,也就是说 typedef给了这个结构一个新的名字,然后可以直接通过POINT 来定义,也就是说POINT 相当于原来的struct xxxxx;
3,数据结构中的一些表示:
(1)typedef int Status;如上面所说的,typedef可以相当于define一样,将一个变量定义成类型。
关于书中的ElemType 则表示该数据类型由用户自行定义,也就是说c语言头文件中,不含这个命令,不要混淆,可以通过typedef来实现。
(2)&的使用:在书上说这表示引用参数,百度中例子。(另外也有用于指针以及scanf等中的取地址的作用)
voidfun1(int a){a ++;}void fun2(int &a){ a++;}现在主函数main中:int a = 10;调用fun1 ----> fun1(a); printf("a = %d", a); 结果: a = 10; 原因,形参在函数完成后就释放了,所以a还是等于10。调用fun2 ----> fun2(a); printf("a = %d", a); 结果: a = 11;原因,由于传递的是实参的引用,别名,所以在函数完成后,实参得到了修改 所以a应该等于11。
此处回忆一下c语言中,局部变量以及全局变量局部变量与全局变量的区别:个人理解是在于作用域的区别。
其实还有储存的区别。
全局变量作用域:定义的地方到程序结束。在主函数外定义的为全局变量,若要在主函数中定义全局变量则要在 变量类型前加 extern 。
局部变量:在函数中,主函数中的变量均为局部变量,局部变量之间互不干扰。在函数中定义的局部变量仅在函数中有效,出了函数,便相当于不存在。
例子理解:
------------------------
int a=1; /*全局变量*/
void fun(void)
{int a,b;
a=5;b=a+3; /*局部变量*/
printf("a=%da=%d\n",a,b);
}
int main()
{int b=3;
fun();
printf("a=%da=%d",a,b);
}
此程序运行结果,显示:a=5b=8
a=1b=3
由此可以得出,当局部变量作用时,全局变量被屏蔽。局部变量只限于一定作用域。
提出疑问:如果在局部变量存在,是否通过某种方式使用全局变量,来取消屏蔽?
(查询网络得:在c++中可以使用作用域相关知识来获取,而c中暂时没有办法,只能间接获取。)
(3)关于define的用法总结。
1.宏定义一个变量,如 #define max 10 (注意添加#,没有等号,没有分号。)之后整个程序中的max数值为10。
2.用define来定义一个简单的函数。如 #define min(x,y) ( x>y?y:x ) 注意:宏只是一个简单的文字替换,不是直接将结果带入。
如:若 #define add(a,b) a+b 代码如: 4*add(a,b) 就会出现问题,所以为了安全起见,都会多增加一个括号。
还有如 define p int* 时,如代码 p a,b;本意是将a,b都定义成整型指针,但是实际结果是,a是指针而b不是。
这种情况则运用 上述typedef 来解决这个问题。
其他不涉及,此处有一个很费解的地方,在前辈的博客中看到 undef这个命令,而宏定义在预处理中完成,如果undef存在,则之前都作废。这个命令有什么存在的意义?
4.数据结构中的时间复杂度。
算法效率的度量。另外整个算法的执行时间与该基本操作重复执行次数成正比。时间复杂度:T(n)=O(f(n))
语句的频度:语句重复的次数。
关于O()的推导:
1,无论执行1,2,3等次数的常数阶均用O(1)表示.
2,指数阶例如:
int count=1;
whilt(count<n)
{count=count*2;
}
设执行次数为:x,2^x=n x=log2n.
这里的时间复杂度为:O(logn).
为什么可以把底数2忽略?
网络上的解释是:可以将log2n的2可以通过换底公式变成系数,而根据上面的规则,系数可以忽略。所以这里的2可以忽略!
这里回顾一下换底公式:logaN=log N/log a。
3.平方阶例如:
int i,j;
for(i=0;i<n;i++){
for(j=i;j<n;j++){
时间复杂度为O(1)的程序步骤。
}}
次数=n+(n-1)+(n-2)...........+1 等差数列公式:Sn=n(a1+an)/2
这里计算得:n(1+n)/2 由上述规则得出,忽略系数,只保留最高次项:O(n^2)
4.嵌套类型的时间复杂度计算。
可以计算出总共的次数,在根据规则取舍,但是也可以直接抓住关键的步骤。
常用时间复杂度所耗费的时间:注意 n!>2^n.
关于时间复杂度中,最好情况与最坏情况,一般没有特殊说明的情况下,都指最坏时间复杂度。
5.算法空间复杂度
空间有时候可以用来换取时间。例子,比如说计算2050中,闰年的个数。
可以先建立一个有2050个元素的数组,然后把所有的年份按下标的数字变硬,如果是闰年,此数组项的值就是1,如果不是为0.
然后查找这个数组中含有1的个数,便可以统计出闰年的个数了。
由此的是通过了空间的开销来换取计算时间的技巧。
一般来说时间复杂度运用多。空间复杂度运用少。
- 【数据结构学习1】关于typedef,struct,&,局部全局变量,时间复杂度
- 关于 typedef struct 和 struct
- 关于 typedef struct 和 struct
- 关于 typedef struct 和 struct
- 一道关于时间复杂度的数据结构题目
- 数据结构心得1:时间复杂度
- 一步一步学习数据结构(1)-时间空间复杂度
- 数据结构考研时间复杂度分析学习
- 数据结构和算法--时间复杂度学习总结
- 数据结构和算法学习02-时间复杂度和空间复杂度
- C++学习笔记1 struct和typedef struct
- 数据结构 时间复杂度
- 数据结构时间复杂度
- 数据结构时间复杂度计算
- 数据结构时间复杂度
- 数据结构-时间复杂度
- 数据结构时间复杂度
- 数据结构:时间复杂度
- oracle11g新特性初始区段创建推迟到第一条记录插入表中
- JS制作支付倒计时页面
- 《并发编程的艺术》学习笔记 第1章---并发编程的挑战
- lua与C相互调用
- Spring整合Mybatis(MapperScannerConfigurer方式)
- 【数据结构学习1】关于typedef,struct,&,局部全局变量,时间复杂度
- 嵌入式驱动那年的笔试面试-有干货
- 一款轻量的微信支付组件
- 无奈
- 缓存池 NodePool
- 资源访问 - Resource
- 实现字符串逆序
- lecture2.a --- 神经网络结构的分类
- Linux学习(文件五 )