【数据结构学习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 结构体名字  +变量名;

结构体的赋值:

网上拷贝例子如:

  1. struct stuff {  
  2.         char job[20];  
  3.         int age;  
  4.         float height;  
  5. }Huqinwei;  

可通过:

  1. struct stuff Huqinwei = {"manager",30,185};  /来直接赋值/

或者:

  1. Huqinwei.job[0] = 'M';  
  2. Huqinwei.job[1] = 'a';  
  3. 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的个数,便可以统计出闰年的个数了。

由此的是通过了空间的开销来换取计算时间的技巧。

一般来说时间复杂度运用多。空间复杂度运用少。




0 0
原创粉丝点击