)
数据结构 —— 研究 数据 与 数据 之间的关系数据结构的内容 学生这些数据术语 姓名数据是描述客观事物的符号 年龄数据元素是组成数据的、有一定意义的基本单位数据项一个数据元素可以由若干个数据项组成数据项数据项是数据不可分割的最小单位数据对象是性质相同的数据元素的集合是数据的子集数据结构是相互之间存在一种或多种特定关系的数据元素的集合一句话数据结构 就是研究 “数据元素” 与 “数据元素” 之间的关系单个学生 —— 数据元素一个具有一定意义的基本单位数据对象学生这种类型关系逻辑关系 —— 反应的是数据与数据之间对应关系集合元素与元素之间同属一类线性元素与元素之间一对一的0 - 1 - 2 - 3除了起始元素结尾元素线性关系中每个元素都有自己的一个前驱节点和后继节点树形层次图形元素与元素之间多对多应用场景地图抢票软件程序设计好数据最终还得存储到计算机中怎么把具有逻辑关系的数据存储到计算机存储结构内存上怎么存储1.顺序存储2.链式的存储结构存储一组整数数据0 1 2 3 4 5 6 7 8 9 //学号具有线性逻辑关系的一组数据int sno[10] {0,1,2,3,4,5,6,7,8,9};顺序存储数组缺点增删优点随机访问方便链式的存储结构链 —— 铁链 狗链优点增删缺点访问需要遍历索引结构看书 —— index目录-索引专门维护一个索引表散列哈希结构 —— 哈希查找哈希表值 --散 ——哈希函数—— 位置散ssanint sno[10] {0,1,2,3,4,5,6,7,8,9};学号//增加一个学号 ——int sno1[11] {0,1,2,3,4,6,7,8,9,10};思路1. 新创建一个 多一个元素的数组2. 将原数组中数据拷贝过来 然后再新加一个数值3. 释放原有空间删除一个学号int sno1[10] {0,1,2,3,4,6,7,8,9};链式的方式增加一个学号 ——int sno1[11] {0,1,2,3,4,6,7,8,9,10};同一逻辑关系的数据可以用不同存储结构存储但是不同存储结构对应处理思路逻辑存储也不同。用什么样的算法 取决于 处理怎样关系逻辑存储的数据数据结构与算法算法是解决特定问题求解步骤的描述。在计算机中表现为指令的有限序列并且每条指令表示一个或多个操作。算法 —— 就是解决问题的步骤是解决问题思路的具体描述算法特性一个算法这些是需要考虑的方面1. 输入2. 输出3. 有穷性4. 确定性5. 可行性好算法1. 正确性2. 可读性3. 健壮性鲁棒性4. 时间效率和存储量低时间复杂度 和 空间复杂度内存CPUGPU具体的数据结构与算法线性表———一对一的数据结构顺序存储 —— c语言cjavapython数组顺序表算法1. 创建 2. 增 3. 删 4. 改 5. 查 6. 销毁创建int a[10];int *p malloc(sizeof(int)*10);增加数据 inputArray插入数据删除数据 deleteArray改 modifyArray //找到 修改查 findArray //销毁堆区数组销毁空间销毁链式链表的方式来实现线性结构实现//链表的元素特点描述节点结点——包含a. 数据b. 下一个节点的地址算法1. 创建 链表创建----空链表2. 增 3. 删 4. 改 5. 查 6. 销毁空链表 带头链表头节点 首节点 尾节点操作1. 创建 2. 增 3. 删 4. 查 5. 改 6. 销毁1. 创建 —— 创建空链表struct node * linklist_create(void){struct node *phead malloc(sizeof(struct node));//创建一个节点 //充当头节点//头节点数据域不关心指针域 为NULL//头节点 带出来return 头节点的地址 head}2. 增插入数据头插 —— 指的是每次的节点都插入到头节点的后面void linklist_insert_head(node_t *phead, data_t data){//1. 创建新节点//2. 把data数据放到数据域中//3. 连起来1pNew-next phead-next;2phead-next pNew;return;}遍历变量int is_empty(node_t *phead){//判断 phead NULLreturn phead-next NULL;}linklist_print(node_t *phead){//有效性验证//1. phead 有可能传的是NULL//2. 空链表 //判断phead-next NULLp phead-next;while (p ! NULL){//打印此时所在节点数据域}}尾插 —— 指的是每次的节点都插入到尾节点的后面实现void linklist_insert_tail(node_t *phead, data_t data){//1. 创建新节点//2. 把data数据放到数据域中//3. 连起来//遍历找到尾节点node_t *p phead;while (p-next ! NULL){p p-next;}//写法1p-next pNew;pNew-next NULL;//写法2pNew-next p-next;p-next pNew;return;}4. 查遍历这个节点node_t *linklist_find_key(node_t *phead, data_t key){//节点地址返回}5. 修改找到位置上修改node_t *linklist_update(node_t *phead, data_t old, data_t new){//节点地址返回}6. 删除 删除某个节点int linklist_delete_head(node_t *phead){//1. 删除让头节点的指针域 指向首节点的下个节点node_t *p phead-next;phead-next p-next;//2. 释放 p 指向这个节点现在的首节点free(p);p NULL;}尾删 —— 每次删除的都是尾节点int linklist_delete_tail(node_t *phead){//思路//单向链表//让p停在尾节点的前一个节点node_t *p phead;while (p-next-next ! NULL){p p-next;}free(p-next);p-next NULL; //p所在节点成为了新的尾节点}