下面是我在学习数据结构时的一些经验和感受,谢谢大家分享!
1.数据结构链表
数组存储需要连续的内存空间,如果需要太多内存,可以通过链表来实现,链表是离散存储。 2.数据结构图 求最短路径等不能通过链表,属实现,只能通过图实现。3.数据存储一般分两步
特定的数据类型(数据本身) 特定的存储结构(数据和数据的关系) 数据结构=个体+个体的关系 算法=对存储数据的操作4.算法
解题的方法和步骤 衡量算法的标准 (1)时间复杂度:大概程序要执行的次数,而非执行的时间。 (2)空间复杂度:执行过程中大概所占的最大内存。 (3)难易程度:容易看懂,应用。 (4)健壮性:稳定性。5.数据结构的地位
简单的可以说成数据库是数据结构狭义的简单化实现。学好数据结构,类似于数据库的实现会非常容易。 程序=数据的存储+数据的操作+计算机执行的语言。 但是学了数据结构不一定能做出什么东西,只会在以后的学习中提供更大的帮助。 6.指针 指针式c语言的灵魂,即地址 是内存单元的编号,从o开始的非负整数,(0--FFFFFFFF)即(1到4G-1) 指针变量时存放内存单元地址的变量,指针的本质是操作受限的分负整数。指针的一个好处:在传参的时候可以节省内存,节省时间,如果要将一个200个字节的结构体数据传递给另外一个函数,如果用首地址指针就只需要4个字节就可以完成。
7.如何通过(无返回值)被调函数改变主调函授的值 (1)实参为相关变量地址 (2)形参以相关变量类型为类型的指针变量。 (3)在被调函数中可以通过*形参变量名的方式改变主函数的值。 8.将一个整数转换为变量地址 (int *)0xFFFFFFFF;表示将0xFFFFFFFF强制转换为地址变量9.类能够比结构体更好的实现目标函数实现,结构体函数实现由缺陷。
结构体是用户根据实际需要自己定义的复合数据类型。 10.java中可以给一个字符串变量直接赋值,但是C++里面不可以,只能通过strcpy实现(加上#include <string.h>头文件) java:st.name="lisi"; C++ :strcpy(st.name,"lisi");11.结构体变量不能加减,只能赋值,st1=st2;
普通结构体变量结构体指针变量作为函数参数传递。12.跨函数使用内存只能通过动态分配实现,因为动态分配的内存在释放之间都存在,而其他局部变量,函数结束,寿命也跟着结束,但是如果不释放,很可能造成内存泄露,这就是操作系统时间越长运行越慢的原因。
13.存储方式: 线性结构: 连续存储(数组) 离散存储(链表) 定义: n个节点离散分配 彼此通过指针连接 每个节点只有一个前驱结点,每个节点只有一个后续节点 首节点没有前驱结点,尾节点没有后续节点 专业术语: 首节点:第一个有效节点 尾节点:最后一个有效节点 头结点:第一个有效节点之前的那个节点,头结点并没有有效数据,头结点是为了方便对链表的操作。头结点的数据类型和首节点是一样的。 头指针:指向头结点的指针变量 尾指针:指向尾节点的指针变量 确定一个链表只需要头指针一个参数:因为可以通过头指针推算出链表的其他所有信息。 链表的分类: 单链表 双链表:每一个节点有两个指针域 循环链表:能通过任何一个节点找到其他所有节点的单链表 非循环链表 算法: 遍历 查找 销毁 清空 删除 求长度 排序线性结构中最常用的是堆栈和队列
非线性结构:树,图
14.数组的定义 struct arr { int * pBase; //存储数组第一个元素的地址 int len; //数组所能容纳的最大元素的个数 int cnt; //当前数组有效元素个数 };void init_arr(struct arr* pArr,int length); //初始化,需要指定对谁初始化,就是初始化数组的地址,长度等
{ pArr->pBase=(int*)malloc(sizeof(int)*length); //注意要加<malloc.h>if(NULL==pArr->pBase){printf("动态内存分配失败!\n"); exit(-1);//终止整个程序}else{pArr->len=length; pArr->cnt=0;}}bool append_arr();//追加
bool insert_arr();//插入bool delete_arr();int get();bool is_empty();bool is_full();void sort_arr();void show_arr();void inversion_arr();