数据结构与算法学习 第1季01 顺序表 链表

2015年学习计划安排:

http://www.cnblogs.com/cyrus-ho/p/4182275.html

顺序表:顺序存储结构的线性表。所谓顺序存储结构,就是指用一组连续地址的内存单元来存储整张线性表的存储结构。(因此按序遍历数据很方便,直接做指针偏移就可以了。)

常用操作

A)向顺序表中第i个位置插入元素item

1. 判断插入位置是否合法

2. 将i-1以后的元素后移一个元素的位置(注意静态顺序表和动态顺序表的差异)--- 从原来最后一个元素开始操作到原来的第i个元素,依次后移

3. 在第i个位置上放入元素item

4. 顺序表长度+1

B) 删除顺序表中第i个位置的元素

1. 判断删除位置是否合法

2. 从原来第i+1个元素开始操作到原来的最后一个元素,依次前移 --- 这样也顺道删除掉了原来的第i个元素

3. 顺序表长度-1

链表:用一组地址任意的存储单元存储数据的线性表。每个存储单元(结点)除了当前数据元素(存放在结点的数据域)外,还包含指向前(和/或)后一个结点的指针(存储在结点的指针域)。通常有一个表头(head node),其数据域为空,指针域指向第一个结点地址,链表最后一个指针域置NULL。(当然也可以多设置一个表尾结点,数据域为空。)存放指向下一个结点的指针域通常称为next域,存放指向前一个结点的指针域通常称为front域。

常用操作

A) 向链表中next指针q指向的结点后插入结点

1. 创建一个新结点,并用指针p指向该结点

2. 将q指向的结点的next域指针赋值给新结点的next域

3. 将p的值赋值给q指向的结点的next域

B)从链表中扇车q指向的结点

1. 如果q指向的结点是第一个结点(也就是说q是head node的next域),将q所指结点的next域赋值给head node的next域,释放q所指结点

2. 如果q指向的结点的前驱结点A(也就是q所在的结点)已知时(所谓已知就是说指向结点A的指针r已知),将q所指结点的next域赋值给r,释放q所指结点

3. 如果q指向的结点的前驱结点A未知时,需要从链表表头开始遍历链表(当然如果是双向链表则可以用front域来获得A),找到A(判断结点的next域是否为q),再按2操作

插入结点和删除结点可以实现创建链表和销毁链表

顺序表的优势在于构造简单,便于遍历,随机存取快,但是插入和删除的效率低(需要移动一系列元素);链表的优势在于插入和删除的效率通常较高(仅仅是局部的指针变换),特别是表长很大的情况下,但是由于其指向元素的地址不是连续的,所以执行“读取第i个元素”之类的操作时,就必须从表头开始遍历i次(而顺序表可以直接做指针偏移来获得第i个元素)。

时间: 2025-01-03 15:42:35

数据结构与算法学习 第1季01 顺序表 链表的相关文章

数据结构与算法学习 第0季 学前入门

2015年学习计划安排: http://www.cnblogs.com/cyrus-ho/p/4182275.html 数据结构:计算机内部数据的组织形式和存储方法.(不同的数据结构在实现同一个功能的时候,算法的选用不一定一样) 常用的数据结构:一对一 --- 线性结构:一对多 --- 树结构:多对多 --- 图结构 所谓的一对一,就是从前一个数据通过某种方式可以找到下一个数据(最多只有一个).线性结构主要包括:(important!从存储形式上分)顺序表和链表:(从逻辑功能上分)栈和队列.(同

数据结构与算法学习 第1季03 栈 队列 树 图

2015年学习计划安排: http://www.cnblogs.com/cyrus-ho/p/4182275.html 栈:LIFO的线性表 队列:FIFO的线性表 树:(递归定义)n个结点的有穷集合,对非空树,有且仅有一个称为根的结点,n>1时,其余结点分为m个互不相交的有限集,而每一个集合本身也是一棵树,并称为根的子树 图:任意两个数据元素之间都可以存在关系的组织结构 二叉树的存储:可以选择用多重链表的数据结构 二叉树的遍历:先序,中序,后序 图的存储:邻接矩阵(不适于存储稀疏图)与邻接表

数据结构与算法学习 第1季02 链表的基本功能 C++实现

2015年学习计划安排: http://www.cnblogs.com/cyrus-ho/p/4182275.html 尝试用C++实现了双向链表类LinkList,基本功能是在位置i插入结点和删除位置i的结点. 首先是结点类,每个结点有数据data,指向前一个结点的指针front和指向后一个结点的指针next class Node { public: int data; Node* next; Node* front; public: Node(); Node(int data); Node(

数据结构与算法学习之路:背包问题的贪心算法和动态规划算法

一.背包问题描述: 有N种物品和一个重量为M的背包,第i种物品的重量是w[i],价值是p[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包重量,且价值总和最大. 二.解决方法: 1.贪心算法:贪心算法基于的思想是每一次选择都作当前最好的选择,这样最后的结果虽然不一定是最优解,但是也不会比最优解差很多. 举个例子说明可能好懂一些:一帮基友去聚餐,菜是一份一份上的,我每一次夹菜都只夹牛肉/海鲜吃,可能到最后我吃的牛肉/海鲜很多,但不一定代表我吃掉的东西的总价值最高,但是相对来说价值也很高

设顺序表中的数据元素递增有序,试着写一算法,将x插入到顺序表上的适当位置上,以保持该表的有序性。

转自: https://blog.csdn.net/cckevincyh/article/details/45605261 设顺序表va中的数据元素递增有序.试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性 先建立一个待插入的结点,然后依次与与链表中的各结点的数据域比较大小,找到插入该结点的位置,最后插入该结点. 算法如下: #include<stdio.h> #include<stdlib.h> #define MAXSIZE 20 #define OK 1 #def

数据结构和算法学习总结01 绪论

数据结构实际上是数据元素之间的关系的集合 数据结构分为    1.逻辑结构      2.物理结构(逻辑结构的数据元素的存储方式)                            逻辑结构分为  1.集合结构   数据元素无关系,只是属于一个集合                            2.线性结构   数据元素间1对1的关系                            3.树形结构   数据元素间1对多的关系                            

数据结构和算法学习

Algorithms, 4th Edition 不过一遍都不好意思说你学过算法           学习资料: 怎样学算法? 如何学习数据结构?

数据结构与算法——学习整理记录

===注:此文由本人结合网上资源整理总结而来,仅代表个人的学习与理解,如有错漏,欢迎指正!=== # 1. 数据结构 ## 1.1 数据结构是什么? 数据结构,直白地理解,就是研究数据的逻辑关系与存储方式的一门学科. 可以简单的分为:数据的逻辑结构(逻辑关系)和数据的存储结构(物理结构). 它是以某种形式将数据组织在一起的集合,它不仅存储数据,还支持访问和处理数据的操作. ### 1.1.1 数据的逻辑结构 数据的逻辑结构,简单地理解,就是指的数据之间的逻辑关系. 数据之间的逻辑关系可简单的分为

重读《学习JavaScript数据结构与算法-第三版》- 第6章 链表(一)

定场诗 伤情最是晚凉天,憔悴厮人不堪言: 邀酒摧肠三杯醉.寻香惊梦五更寒. 钗头凤斜卿有泪,荼蘼花了我无缘: 小楼寂寞新雨月.也难如钩也难圆. 前言 本章为重读<学习JavaScript数据结构与算法>的系列文章,该章节主要讲述数据结构-链表,以及实现链表的过程和原理. 链表 链表,为什么要有这种数据结构呢?当然,事出必有因! 数组-最常用.最方便的数据结构,But,当我们从数组的起点或中间插入或移动项的成本很高,因为我们需要移动数组元素. 链表,是存储有序的元素集合.链表中的元素在内存中并不