教材-课外书籍推荐
高一凡(伪算法→真代码)
数据结构概述
定义
我们如何把现实生活中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排序)而执行的相应操作,这个相应的操作也叫算法
数据结构 = 个体 + 个体的关系
算法 = 对存储数据的操作
算法
解题的方法和步骤
衡量算法的标准
1.时间复杂度
大概程序要执行的次数,而非执行的时间
2.空间复杂度
算法执行过程中大概所占用的最大内存
3.难易程度
4.健壮性
数据结构的地位
数据结构是软件中最核心的课程
程序 = 数据的存储 + 数据的操作 + 可以被计算机执行的语言
最后编辑于2015年8月18日23:10:06
预备知识
指针
指针的重要性:
指针是C语言的灵魂
定义
地址
地址就是内存单元的编号
从0开始的非负整数
范围: 0--FFFFFFFF(0——4G-1)
指针:
指针就是地址,地址就是指针
指针变量是存放内存单元地址的变量
指针的本质是一个操作受限的非负整数
分类:
1.基本类型的指针
2.指针和数组的关系
最后编辑于2015年8月19日23:06:51
结构体
为什么会出现结构体
为了表示一些复杂的数据,而普通的基本类型变量无法满足要求
什么叫结构体
结构体是用户根据实际需要自己定义的复合数据类型
如何使用结构体
两种方式
struct Student st = {1000, "zhangsan", 20};
struct Student * pst;
1.
st.sid
2.
pst->sid
pst所指向的结构体变量中的sid这个成员
注意事项
结构体变量不能加减乘除,但可以相互赋值
普通结构体变量和结构体指针变量作为函数传参的问题
跨函数使用内存---通过动态内存分配实现
一般情况下,自定义函数结束后内存释放,唯有动态分配的内存在没有遇见free函数的情况下,自定义函数结束了,但内存仍然存在。
最后编辑于2015年8月20日23:00:44
模块一:线性结构[把所有的结点用一根直线穿起来]
连续存储[数组]
1. 什么叫数组
元素类型相同,大小相同
2. 数组的优缺点
离散存储[链表]
定义:
n个结点离散分配
彼此通过指针相连
每个节点只有一个前驱节点,每个节点只有一个后续节点
首节点没有前驱结点,尾节点没有后续节点
专业术语:
首节点:
第一个有效节点
尾节点:
最后一个有效节点
头结点:
头结点是数据类型和首结点类型一样
第一个有效节点之前的那个节点
头结点并不存放有效数据
加头结点的目的主要是为了方便对链表的操作
头指针:
指向头结点的指针变量
尾指针:
指向尾节点的指针变量
如果希望通过一个函数对链表进行处理,我们至少需要接受链表的哪些信息:
只需要一个参数:头指针
因为我们通过头指针可以推算出链表的其他所有信息
分类:
单链表
双链表:
每一个节点有两个指针域
循环链表
能通过任何一个节点找到其他所有的结点
非循环链表
算法:
遍历
查找
清空
销毁
求长度
排序
删除节点
插入节点
算法:
狭义的算法是与数据的存储方式密切相关
广义的算法是与数据的存储方式无关
泛型:
利用某种技术达到的效果就是:不同的存储方式,执行的操作是一样的
链表排序算法
1 for(i=0,p=pHead->pNext; i<len-1; ++i,p=p->pNext) 2 { 3 for(j=i+1,q=p->pNext; j<len; ++j,q=q->pNext) 4 { 5 if(p->data > q->data)//类似于数组中的 a[i] > a[j] 6 { 7 t = p->data;//类似于数组中的:t = a[i]; 8 p->data = q->data;//类似于数组中的:a[i] = a[j]; 9 q->data = t;//类似于数组中的 a[j] = t; 10 } 11 } 12 }
链表的优缺点:
线性结构的两种常见应用之一 栈
线性结构的两种常见应用之二 队列