一种结构化数据集合
也就是有一种关系的数据
线性结构和非线性结构有哪些
非线性结构有树和图
线性结构就比较多了,线性表,栈与队列,字符串,数组
线性表的定义
线性表就像火车一样,表头没有前驱,表头就是第一个,表尾没有后继,表尾就是最后一个,其他元素只有一个前驱后继
线性表用指针来实现实参和地址的操作
typedef struct #定义结构体
{
#这里以图书管理系统为例
char no[20] #书的id
char name[50] #书名
float price #价格
}Book;
typedef struct
{
Book *elem ;#存储基地址
int length ;#当前个数
}SqList;
发现书上写顺序表的写法大同小异,说实话我也不懂,就是照着书上一顿撸代码
首先说下结构体类型的写法
typedef struct {
类型 变量名;
…可以有好多个这样的类型和变量名
}structname; #structname也就是结构体名,这里可以自己定义
初始化
思路
- 初始化就是进行构造一个空的顺序表
- 先分配空间,使elem指向这段空间的基地址
- 讲标的长度设为0
这里不写了吧,说实话,写了也记不住,记作思路最重要
说实话写到这里我就觉得数据结构真的好难呀
查找某个元素e
思路
- 我们首先肯定知道我们要查找的元素e
- 循环整张表看每个元素和e这个元素是否相等
- 输出结果
function (SqList L , ElemType e){#SqList 为线性表类型,也就是前面定义了的Struct封装成SqList,ElemType传递的元素值
for (i=0; i <L.length ; i++){
L.elem[i] == e
return i+1;#返回顺序表中该元素的地址
}
return 0;
}
顺序表中位置i插入一个值e
- 思路
- 一个顺序表中插入一个值,肯定会造成从插入这个值的地方后面元素都要往后移对不对,这样改变了表的结构,就要引用表了
- 怎么做呢
- 第一步都是要对插入的值的地方进行判断,i的位置要在1到length+1才是合理的
- 从表尾n到插入位置i的元素往后移,一共有(n-i+1)个元素要移动
- 上代码
Status ListInsert(SqList &L ,int i ,ElemType e){
#Status 为返回类型, ListInsert为函数名,修改表的结构要用&引用,i 为插入的位置,e为插入的值
if(i<1|| i >L.length+1) return 0;#越界直接返回
if(L.length == MAXSIZE) return 0 #线性表有最大的长度,这个也要注意
for(j=L.length-1; j>=i-1;j--){
L.elem[j] = L.elem[j-1]; #每个元素往后移
L.elem[i-2]=e; #到了赋值的位置进行赋值运算
return 1;
}
}
写到这里,我感觉写任何一个方法都是大致一样的套路
先对输入的条件进行判断,是否越界还是输入的数值类型错位啥的。
然后再下手第二步就是进行判断这个方法到底使什么发生了变化,看变化前的和变化后的状态
写到这里,我写不下去了,想起来为什么我在写数据结构,因为我在求职过程中有笔试题,20道然后就是怎么说呢,给你一个小时让你回答,然后有很多数据结构的题,然后就想复习一下数据结构
中间略过很多写代码的部分,直接从每种数据结构特点入手吧
栈和堆有什么区别吗,我至今未搞懂
首先栈是线性结构,可以将它理解为堆盘子,怎么说呢,后进先出,放在上面的盘子先拿对吧,这样更符合常理对吧,你要从下面先拿也没毛病,只是有点小事化大的意思。
堆,百度一下,发现了这样一句话,堆是一颗完全二叉树,完全二叉树不一定是堆,这句胡说明完全二叉树的范围大于堆的范围,那么堆和树一样是非线性结构
堆有两个特点
- 中某个节点的值总是不大于或不小于其父节点的值;
- 堆总是一棵完全二叉树
栈的操作
两种,入栈和出栈完了,说起来简单吧
栈有两个指针
top指向栈顶
base指向栈底
base是不动的,top是随着入栈出栈而指向最上面的,也就是top是动的
## 入栈
- 思路
- 判断栈是否满了
- 满了就返回,没满就进行进栈操作
- 没满进栈,top+1
status Push(SqStack &s ,SElemType e){
if(s.top - s.base == s.stackbase )
}