学习和总结下数据结构和算法吧,不知道下一份工作会是什么作为主要的语言,就同一思想写成不同的主流语言版本吧。暂时定为 C/C++ Java 和 C#版的吧。
数据结构 作为开始吧,就是想到的就说说,别太认真哈。先总结下基础知识,然后写写关键数据结构的代码。最后写写实践中的使用。
线性表 精准表述
线性表: 按照字面理解,线型的呗!对吗? 看看英文 Linear List,好像是那么回事儿。还是先说说什么是线性吧。数学中的线性好象是 ai*xi = bi (i=1,2,...,n), 那么x1, x2,...,xn 是线性关系。注意不是平方或是多次方。在线性表里的线性好像没有那么精确,我就理解为能够表达为 a1,a2,...,an 形式的一种数据结构吧。
有了这个明确的概念和清晰的理解,玩起线性表就容易的多了。
1. 顺序表:我的理解就是可以映射到 a1,a2,...,an ; 并且内存是连续分配的。真谛就是顺序存储(指的是内存哟)。就以数组为代表吧。不展开了。
2. 链表: 我的理解就是可以映射到 a1,a2,...,an ; 并且内存是不连续分配的 (或者说 “链” 上的)。真谛就是链式存储。
链表有分为很多种类:
(1)比如单链表:就是一个链上的,或者说单一方向的。
下面又可以细分成(a)动态单链表-- 和(b)静态单链表
(a)动态单链表: 一个数据结构,里面有指向该自身结构的指针 比如 struct a { int data, struct a *next }。 以后会主要讨论这个。
(b)静态单链表: 一个数据结构,实现上常常是一个大大的数组。 数组中的元素 是一个类似 struct b{ int data, int cursor} ,主要的操作是对cursor进行的。
一般大家对这个不是很熟悉,就给出一个抛砖引玉的例子如下:
第零步:比如现在已经有 k (3)个元素,要插入1个新的元素在第m (2) 位置(索引是 m-1 (2-1=1)), (没有给出初始化部分,索引检查等)
第一步:正常按顺序放入数组数据到数组的第k+1个位置 s[k].data = your data; // s[3].data = your data;
第二步:将该新元素的cursor 值 赋值为m(索引1 的下一个位置) s[k].cursor= m; // s[3].cursor= 2;
第三步:将该新元素的位置值 赋值给要插入的位置的cursor s[m-1].cursor= k; // s[1].cursor = 3;
(2)双链表: 就是两个链上的,或者说双方向的。在结构体中多加一个指向该自身结构的指针:比如叫 *pre; 静态的情况比如叫 cursor_pre
(3)循环链表: 就是研着链能走一圈,故名循环的。当然可以是单向循环,也可以是双向循环。
所有这些概念要记其实质,就万变不离其中了。
接下来我会说说其他的概念,比如队列 堆栈和广义表。看下文吧。