Lecture 0 --基本说明

本文介绍了数据结构的基础概念,包括C语言指针、typedef的使用方法及其与指针结合的特殊情形;同时对比了C语言与C++在动态存储分配与释放上的区别,并对C++的引用进行了说明。此外,还探讨了算法的时间复杂度评估方法,通过实例讲解了如何确定算法的时间复杂度。

Abstract:本章所记录的知识是后面章节需要的前导知识,请务必仔细读本章,理解涉及的知识点,方便后面章节的学习。本次数据结构笔记主要参考殷人昆的《数据结构(C语言描述)》这本书,需要的语言基于C,但是在C++的环境中进行编译,就是建立C++的项目在里面跑C语言的程序。

 

1.C语言指针

  http://www.cnblogs.com/HurryXin/p/6547831.html

 

2.typedef

  自己感觉主要功能时重命名形式,看一下几个例子:

(1)

  typedef int DataType;  

  这里是将int重命名为DataType类型。可以这么理解,DataType a这里的a是int型的,与int a是等价的。

  那为什么会使用typedef呢?

  设想在一个程序中定义了a这个int型变量,写了一大堆代码,结果最后发现我要用float或者其他的数据类型,那就慢慢一个一个换吧,凡是相关的全部换掉。但是使用typedef就容易多了,只需要将typedef int DataType;的int转换成float即可。

(2)

1 typedef struct {
2     DataType a;
3     int n;
4 }SeqList;

  定义的结构体名字叫SeqList,以后可以使用SeqList定义新的变量。

 

3.typedef与指针的特殊情况

  这里主要解释两种用法,具体的代码先不体现以后会有的:

(1)

  typedef struct node{

    }LinkNode,*LinkList;  

  看到这种定义不知道是否很困惑,这里的typedef为什么后面跟着两个参数,这里简单理解为将struct node重命名为两个,但是两者又不一样。

  LinkNode可以理解为一个数组其中的一个节点,而*LinkList则是该数组节点的地址,看着很难理解,画个图吧!

  LinkNode与LinkList其实内容相同,但是又不完全相同。

(2)

  LinkNode * Search(…);

  这里被调函数为什么返回值是LinkNode*呢?主要是本函数是返回一个指针,所以使用LinkNode*。那用LinkList的时候该怎么办?这里仅需要把LinkNode*改成LinkList即可,注意不是LinkList*。但是建议使用LinkNode*,以后涉及的操作主要是删除等,所以最好返回节点而不是节点的地址。

 

4.C++部分知识介绍

(1)首先对比C语言与C++动态存储分配与释放命令

 

C语言

C++

动态分配

(DataType*)malloc(sizeof(DataType)); //简单变量

(DataType*)malloc(sizeof(DataType)*Size); //数组

new DataType; //简单变量

new DataType[Size]; //数组

动态释放

free(p);

delete p; //简单变量

delete [] p; //数组

(2)报错函数

1 #include <stdlib.h>
2 #include <iostream.h>
3 
4 void Error(char *message){
5  cerr<<”Error:”<<message<<endl;
6  exit(1);
7 }

(3)C++引用

  这里的引用仅需要理解为重命名,但是只要发生在被调函数中,举个栗子:

  void initList(SeqList &L){

  };

  这里的&L可以理解为重命名,其中把传入的参数不管是什么如何用L统一表示。注意C中是没有这种用法的,所以说基于C语言但是用C++的环境跑代码。

 

5.时间复杂度度量

 1 void example(float x[][m],int m){
 2     float  sum[m];
 3     int i;
 4     int j;
 5     for(i=0;i<m;i++){
 6         sum[i]=0.0;
 7         for(j=0;j<m;j++)
 8             sum[i]=sum[i]+x[i][j];
 9     }
10     for(i=0;i<m;i++)
11         count<<"Line"<<i<<":"<<sum[i]<<endl;
12 }

  这里可以看出,float sum[m];     int i;      int j;与其他操作不同,该表自己详细研究一下,可以得出结论。

  一般情况用大O表示时间复杂度。

  基本做法就是T(n)<=O(f(n))也可以根据循环大体推算出最后结果。

 1 void example(float a[],int& n){
 2     int i;
 3     int j;
 4     int k=0;
 5     for(i=0;i<n;i++)
 6         for(j=i+1;j<n;j++)
 7             if(a[i]==a[j])
 8                 a[j]=delTag;
 9     for(i=0;i<n;i++)
10         if(a[i]!=delTag){
11             if(i!=k)
12                 a[k]=a[i];
13             k++;
14         }
15 }

  这里的O(n2)当出现两个的O(n)时取最大值T(n)=O(max{f(n),g(n)})=O(n2)

  算法时间复杂度排序:

    c<log2n<n<nlog2n<n2<n3<2n<3n<n!

  其中c,log2n,n,nlog2n都不错,n2,n3还可接受,2n,3n,n!就不能算是好的算法了。

 

   转载请注明出处,O(∩_∩)O谢谢!

转载于:https://www.cnblogs.com/HurryXin/p/6802829.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值