数据结构与算法

一、数据结构引入

(一)基础

C语言-结构体-内存(malloc)

(二)要解决的问题

使数据更加有条例

计算机要处理的是完整的信息组合

编程能力-可复用-效率

(三)什么是数据结构

1、可以凌驾于语言之上讨论

2、数据结构研究数据之间的关系

3、数据结构最重要的三个元素:逻辑结构、存储结构以及操作(数据之间的运算)

4、语言是最低要求,数据结构比所有语言出现的早

(四)数据结构基本概念

1、数据

2、数据元素

3、数据结构

数据结构研究的是数据元素之间的关系,数据元素又称数据项

例如:同学之间是线性结构,上下级领导是层级关系

4、逻辑结构

数据的逻辑结构可分为一对一、一对多、多对多

通过找前驱后继区分不同的逻辑结构

5、存储结构

1)顺序存储

利用数组,在一段连续的存储空间存储,前驱后继关系就是数组下标

2)链式存储

通过指针维护前驱后继关系,链式结构非常重要

3)索引存储

4)散列存储

适合查找频率比较高的时候

 二、线性表之顺序表

(一)什么是线性表及顺序表

单链表是线性表

1、线性表

2、线性表概念的标准答案

3、顺序存储-查找多,修改少

例如:图书管理

1)顺序表的优点

存储密度高,逻辑相邻物理相邻,支持随机存取或按地址存取

2)顺序表的不足

3)图书管理系统

结构体套结构体

book:存放图书信息

list:存放图书编号

(二)线性表的基本操作

(三)代码设计

1、sqlist.h

ds定义、提供的运算

2、sqlist.c

实现数据结构运算

3、test.c

数据结构的具体应用

1)结构清晰

2)软件复用

(四)顺序表的实现

1、创建目录

/ds/liner/sqlist

2、定义sqlist,*sqlink

3、线性表的创建

1)sqlist.h

分层操作vsp sqlist.h

2)保证每个文件可以独立的被编译

(五)线性表的创建

malloc申请的空间数组加last

1、创建线性表

2、将线性表清空

3、判断线性表是否为空

4、求线性表的长度

5、memset(L,0,sizeof(sqlist));

6、对代码进行标注

(六)顺序表的实现

1、在某个位置插入一个数

2、打印函数

3、插入元素的位置

4、无效插入情况

5、释放空间函数

6、如果有意测试某个函数,可以进行函数的封装

7、判断文件描述符

8、删除某个位置上的元素

9、顺序表的优缺点

优点:存储密度高、随机存储

缺点:插入删除耗费大

三、线性表之链表

(一)什么是链表及原理

1、单链表的重要性

使用频率非常高

2、头结点的好处

可以很快的找到第一个节点的位置

3、节点定义

指针指向什么数据就是什么类型的指针,单链表的指针指向一个节点,因此设置节点指针。

4、一般的段错误是内存越界或者非法指针

5、给节点分配内存

1)listnode A;

linklist p =&A;

分配的内存在栈上

由编译器自动分配和释放,通常在函数执行完之后释放

A.data

A.next

2)动态分配内存

p=(linklist)malloc(sizeof(listnode));

p->data

p->next

(二)单链表实现-创建

1、单链表的创建

1)输入-1停止输入

2)与顺序表不同,链表建立是动态的未知的。

3)单链表的存储结构

三、单链表实现-尾部插入

1、单链表的插入

2、单链表的打印

四、单链表实现-按位置插入

1、链表的查找

1)按序号查找

从序号0开始

2)按值查找

3)按位置插入

4)链表的删除

pos不合法

2、释放链表之后,H还是指向同样的位置,可以设置linklist类型的free函数,H被free后指向空

返回的指针指向空

接收空指针

改变后的结果

五、单链表的操作实现

(一)链表的反转

(二)链表求相邻两个节点的最大值

1、需要考虑的要素

1)空链表,一个节点,两个节点

2)初始化 sum

3)p,q移动

3、加一个参数,返回最大和

主函数

(三)有序链表的合并

主函数:

函数:

六、栈实现及应用

(一)栈-顺序栈的原理

栈的定义

(二)栈-顺序栈的实现-顺序表

1、创建栈

2、栈的内存

3、出栈

4、释放

因为在创建栈的时候,如果data没成功已经释放了s;

所以释放函数只需要考虑data创建成功一种情况

(三)栈-链式栈原理及实现

1、链式栈是加了限制的链式表

2、删除链表

入栈操作

3、释放一个节点

4、释放栈

七、队列的实现及其应用

(一)顺序队列的原理

1、只能在两端插入删除

2、双端队列

3、循环队列

为了区别队空和队满,要求队列留一个空间

八、链式队列

(一)链式队列的原理

1、链式队列结构体

(二)链式队列的实现

1、删除节点

删除头节点,所以删除后的front保存的是被删除节点的值

九、树及实现(上)

(一)树的概念

(二)二叉树的原理

1、二叉树的性质

2、二叉树的编号

 3、二叉树的存储-顺序结构

可能存在浪费空间的情况

4、二叉树的存储-链式结构

(三)二叉树的运算

1、二叉树的遍历

2、左子树右子树也是二叉树

十、树及实现(下)

(一)二叉树的三种遍历

(二)二叉树的层次遍历

十、查找

(一)查找的原理

1、关键字

2、查找算法

3、衡量标准

4、顺序查找

5、折半查找-有序

6、分块查找-块内无序,块间有序

7、hash查找-查找的元素与地址有关,不需要比较

(二)hash表原理

1、不经过比较,快速得到要找的值

2、建表与存储地址相关

3、冲突-不可避免

4、保留除数法

取不同的数效果不同,质数越大越好(不能太大,余数范围大,浪费内存)

5、冲突

6、质数选取,比m小的最大质数

7、填入的数-申请多大内存空间-定质数-定hash函数

8、发生冲突时-开放地址法

9、发生冲突时-链地址法

十一、排序

(一)排序的原理

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值