数据结构中的C/C++
2018/4/7
1.对于数据结构,大部分书籍还是以C、C++作为实现,因此,在用的公司的笔试中,有的题目中的代码,由这两种语言叙述。不要求能熟练使用,但至少要看懂基础代码吧。两年没怎么用,可以说是忘得差不多了。简略复习一波:
C语言:
结构体:用户自定义的可用的数据类型,它允许我们存储不同类型的数据项。
[注意:结构体只能定义成员变量,但是不能定义成员函数,但是却可以定义函数指针]
定义一个二叉树结构:
struct BTNode
{
int value;
struct BTNode *lchrild;
struct BTNode *rchrild;
};
[这里没有用“typedef定义别名”]
创建刚才定义的结构:
- struct BTNode btNode;
- struct BTNode *btNode;
btNode = (BTNode*)malloc(sizeof(BTNode));
这两种方式是不同的
- 后者 btNode 是一个指针变量,有必要时可以指向别的节点,而前者不行;
- 前者取值用btNode.value,后者用btNode->value[也可以用(*btNode).value]
对于结构体,C++与C的不同之处:【参考[1]】
1.struct关键字:在C语言中,定义结构体变量的时候,struct不能省略。但是在C++之中则可以省略struct。也就是说,C语言中struct BTNode btNode,C++中BTNode btNode即可;
2.成员函数:C语言中的结构体只能定义成员变量,但是不能定义成员函数。然而在C++中既可以定义成员变量又可以定义成员函数;
3.成员初始化:不能直接初始化C中的结构数据成员,但我们可以在C ++中初始化;
4.静态成员: C结构不能有静态成员,但C++中允许使用;
5.sizeof运算符:该运算符将为C中的空结构生成0,而在C ++中为空结构生成1;
6.访问修饰符: C结构没有访问修饰符,因为这些修饰符不被语言支配。C ++结构的访问修饰符默认为public,C++中的struct是可以继承与被继承的
总的来说,其实就是面向过程与面向对象导致的区别。
今日错题集:
1.栈是逻辑结构可以顺序存储也可以链式存储,只要满足后进先出。
2.若额外空间相对于输入数据量来说是常数”则称此算法为原地工作(也就是说:数据量变化时,不再开辟新的的空间,只是在现有的空间进行处理计算)。
暂时到这,未完待续。
线性表
2018/4/7
1.线性表的两种表示形式
顺序表
链表
2.两种实现的差异:
- 空间分配:
顺序存储结构:指定的是用一段地址连续的存储单元一次存储线性表的数据元素。空间分配只能预先进行,也就是静态分配。线性表的长度应该小于等于数组的长度;空间利用率高(局部性原理,连续存放,命中率高),但是当元素个数远少于预先分配的空间时,空间浪费巨大;分小了易发生上溢。
链式存储结构:地址散落分布,动态分配,只要存储器还有空间,就不会发生存储溢出问题。但是因为需要“记忆”下一个节点的位置,节点的存储空间利用率要比顺序存储低一些。- 查找访问:顺序表支持随机访问,查找效率高,存取时间的性能为O(1);后者相反,O(n)
- 删除增加:顺序表插入或者删除一个元素时,整个表需要遍历移动元素来重新排一次顺序,效率低,O(n);后者相反,O(1)。
3.使用场景
- 频繁的查找却很少的插入和删除操作可以用顺序表存储,堆排序,二分查找适宜用顺序表.
- 如果频繁的插入和删除操作很少的查询就可以使用链表存储(但是尾插尾删较多使用顺序表。)
- 顺序表适宜于做查找这样的静态操作;链表适宜于做插入、删除这样的动态操作。
- 若线性表长度变化不大,如果事先知道线性表的大致长度,比如一年12月,一周就是星期一至星期日共七天,且其主要操作是查找,则采用顺序表;若线性表长度变化较大或根本不知道多大时,且其主要操作是插入、删除,则采用链表,这样可以不需要考虑存储空间的大小问题。
4.双链表与单链表的比较
- 在单链表中,有了next指针,这就使得我们要查找下一结点的事件复杂度为O(1)。可是如果我们想要查找的是上一节点的话,那最坏的时间复杂度就是O(n),我们每次都要从头开始遍历寻找。
为了克服单向性这一缺点,设计出了双向链表。双向链表(double linked list)是在单链表的每个结点中,再设置一个指向其前驱结点的指针域。
5.循环链表
循环链表解决了一个很麻烦的问题,如何从当中一个结点出发,访问到链表的全部结点。
6.链表中,有的实现由头结点,有的没有头结点
有头结点的,头指针head指向头结点,但是头结点的值为空,头指针head始终不为空,head->next为null时,链表才为null
没有头结点的,头指针直接指向第一个节点,也就是说,不带头结点的链表,所有节点都存储值,head为null,链表就为null
可以分别使用顺序表和链表实现几大排序算法
7.java中的线性表
线性表对应着下图里的List【参考[2]】
- ArrayList底层是数组实现的,底层元素在内存中是按顺序排列的,ArrayList是Java中顺序表的体现。
- LinkedList就是以双向链表的方式实现的,LinkedList的常见方法的使用
- Vector支持同步,适合于需要线程安全的场合,但是效率比ArrayList差
- java.util包数据结构互相转换
暂时到这,未完待续。
栈、队列
树
图
排序
2018/4/14
数据结构复习之顺序表以及链表的方式实现常用的几种排序算法
查找
参考
[1]C与C++结构体的区别
[2]Java数据结构之线性表