一、线性表的基本操作
1)初始化一个空的现行表
2)根据位序K,返回相应元素
3)在线性表L中查找X的第一次出现位置
4)在位序i前插入一个新元素X
5)删除指定位序i的元素
6)返回线性表L长度n
二、线性表实现的两种方式:数组、链表
1.数组实现,就是线性表的顺序存储实现,利用数组的连续存储空间顺序存放线性表的各元素
访问元素的方式可以使用下标访问
建立空的顺序表的方式是申请空间,然后last指针指向-1
查找,就是遍历的方法,平均实现性能是O(n)
判断表满不满就是 表长-1 是否等于最后一个元素的序号,就是last指针
插入元素的方式是先判断表是否满,满了就不能插入了,表不满的话先移动,再插入,移动方式是倒序,不能正序,否则会被第一个元素疯狂覆盖,时间性能是O(n)
删除元素的方式是先判断要删除的元素序号是否在范围内,然后先删除,再移动,移动方式是正序,时间性能是O(n)
2.链表实现,不要求逻辑上相邻的两个元素物理上也相邻,通过“链”建立起数据元素之间的逻辑关系
我觉得首先要知道链表的操作,别的不说 首先要知道它是通过指针操作每个元素,有个值,有个指向,P->Next,指向下一个元素
插入、移动不需要移动数据元素,只需要修改“链”,这就是优点啊
求表长,这个就比较麻烦,需要一个一个遍历才能求得表长,时间复杂度O(n)
查找,方法也是遍历,按序号查找和按值查找平均时间性能都是O(n)
插入操作,要把一个新的结点插到i-1的后面,思想是先建立一个新的结点s,然后找到链表的第i-1个结点,用p指向,然后s->Next=p->Next, p->Next=s,平均时间性能是O(n)
删除操作,要删除第i个元素,这要找到第i-1个结点,然后用p指向,再用s指针指向要被删除的结点,即s=p->Next,然后p->Next = s->Next,最后释放空间,平均时间性能是O(n)
广义表
是线性表的推广,在广义表里,每个元素可以是单元素,也可以是另一个广义表
多重链表:链表中的结点可能同时隶属于多个链
三、堆栈的实现 也是两种方法,数组、链表
堆栈,主要操作有
1)生成空堆栈
2)判断堆栈S是否已满
3)压栈
4)判断堆栈元素是否为空
5)出栈
首先是数组实现
栈的顺序存储结构通常由一个一维数组和一个记录栈顶元素位置的变量组成
入栈,首先判断堆栈满不满,通过Top变量和末尾序号比较即可,满的话不能插入了,不满的话先Top++,再插入,就是
Ptrs->Data[++(Ptrs->Top)] = item
出栈,首先判断栈是否为空,这里就是判断Top是不是等于-1 然后先弹出,再Top–, 就是Ptrs->Data[(Ptrs->Top)–]
然后是链表实现
因为后进先出,所以在栈顶要可以完成入栈和出栈操作,所以栈顶指针放在链表的表头处
要设立一个头结点,否则比如入栈的时候,怎么表示表头呀?所以构建一个堆栈的头结点s
入栈,首先建立一个新的结点,值为item,然后改变指向的值即可,TemCell->Element = item; TemCell.Next = s->Next, s->Next=TemCell
出栈,先判断堆栈是否为空,不空的话就可以继续操作,s->Next=TemCell->Next ,出栈是要返回弹出的值的,所以新建一个元素来记录返回的值, 比如新建了一个TopElem, 然后保存值,即为 TopElem = TemCell->Element ,然后释放内存即可,即free(TemCell)
中缀表达式转后缀表达式,利用了堆栈来实现
四、队列的实现 队列也是线性表,限制是先进先出FIFO,同样可以通过数组和链表来实现
队列,主要操作有
1)生成空队列
2)判断队列是否已满
3)将元素item插入队列Q中
4)判断队列是否为空
5)将队头数据从队列中删除并返回
数组实现
由于队列插入和删除不在一个地方,因此需要定义两个变量(这里注意,链表实现需要指针,而数组实现可以访问下标,因此是变量即可)front和rear,一个指示删除的位置,一个指示插入的位置,注意front指向第一个元素前面的位置
队列有元素出队后,会有空间空出,不使用会浪费空间,因此采用循环队列的思想,可以避免浪费空间
判断队是否为空,就是直接判断 rear==front即可
判断队是否为满,采用rear “加一取余”的方法 即rear+1 然后与数组长度取余数,再和头元素front比较,如果相等就说明为满
入队操作,先判断队列是否为满,rear先+1 然后插入即可,即PtrQ->rear = (PtrQ->rear+1)%MaxSize; PtrQ->Data[PtrQ->rear]=item
出队操作,先判断队列是否为空,然后front返回指向下一个位置 PtrQ->front = (PtQ->front+1)%MaxSize;
return PtrQ->Data[PtrQ->front]
链表实现
front指向队头,rear 指向队尾
因为队头只需要执行删除操作,不需要插入操作,所以不需要新建一个头元素,比如第一个元素是FrontCell,那么删除它只需要让front指向它的下一个即可,而不需要知道它前面是什么
出栈操作,首先判断队列是否为空,判别方法就是判断front是不是NULL,然后判断队列是不是只有一个元素,方法是判断front==rear,因为如果只有一个元素的话,那这个元素指向一定是NULL,所以如果只有一个元素,就把front 和rear都重置为NULL即可,如果不是只有一个元素,就让front指向下一个,即 PtrQ->front = PtrQ->front->Next 即可