数据结构-线性结构和栈

一种结构化数据集合
也就是有一种关系的数据


线性结构和非线性结构有哪些

非线性结构有树和图
线性结构就比较多了,线性表,栈与队列,字符串,数组

线性表的定义

线性表就像火车一样,表头没有前驱,表头就是第一个,表尾没有后继,表尾就是最后一个,其他元素只有一个前驱后继
线性表用指针来实现实参和地址的操作

typedef struct #定义结构体
{
	#这里以图书管理系统为例
	char no[20] #书的id
	char name[50] #书名
	float price #价格
	
}Book;
typedef struct
{
	Book *elem ;#存储基地址
	int length ;#当前个数
	
}SqList;

发现书上写顺序表的写法大同小异,说实话我也不懂,就是照着书上一顿撸代码
首先说下结构体类型的写法
typedef struct {
类型 变量名;
…可以有好多个这样的类型和变量名
}structname; #structname也就是结构体名,这里可以自己定义

初始化

思路

  1. 初始化就是进行构造一个空的顺序表
  2. 先分配空间,使elem指向这段空间的基地址
  3. 讲标的长度设为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

  1. 思路
  2. 一个顺序表中插入一个值,肯定会造成从插入这个值的地方后面元素都要往后移对不对,这样改变了表的结构,就要引用表了
  3. 怎么做呢
  4. 第一步都是要对插入的值的地方进行判断,i的位置要在1到length+1才是合理的
  5. 从表尾n到插入位置i的元素往后移,一共有(n-i+1)个元素要移动
  6. 上代码
 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是动的

## 入栈
  1. 思路
  2. 判断栈是否满了
  3. 满了就返回,没满就进行进栈操作
  4. 没满进栈,top+1
status Push(SqStack &s ,SElemType e){
	if(s.top - s.base == s.stackbase  )
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值