- 在经过线性表一章的学习,我学到了许多,但由于自己有时上课走神,课后没巩固,有点落后老师的进度,但后来经过自己复习课件,做题目还是渐渐理解了这方面知识。
首先谈到线性表,我们先接触到的是模板。
在刚开始程序方面的学习时,我们接触的题目 数据都是固定的类型,但越到后面,会发现我们接触的题目有时候输入数据类型不唯一,可能是int或者double 又或者char等等,这时就需要运用到模板,就可以不用考虑数据类型的问题 编译器会根据输入的数据自动生成相应类型的函数,充分解决效率低等问题。
函数模板基本语句
template<模板行参表>
返回值类型 函数名(参数表)
{
函数体
}
类模板
template<模板形参表>
class 类模板名
{
成员声明
}
当然在类中也可使用,我们之后学习到的线性表存储问题时,就有考虑到数据的类型问题,也可以用模板将参数化。
接下来接触的就是顺序表既线性表的顺序存储结构,这与大一学习的数组相似,通过数组下标来访问数据,这些方面就不多做介绍,需要注意的是,在顺序表中插入和删除操作时,有些数据的下标需要变换,例如插入数据时,先找到相应位置后,将该位置之后的所有数据后移既下标加1。删除数据时,找到相应位置后,之后的数据全部前移既下标减1。
然后就接触单链表。
单链表是用一组任意的存储单元存放线性表数据,可连续也可以不连续。最大的不同就是,每个单元在存储数据时,还需要存储其地址信息(指针)。包含两部分(data域和next域)data域用于存放数据,next域用于存储下一个后继结点的地址。在编写程序时需要先给出单链表结点的定义
template<typename T>
struct Node
{
T data;
Node<T>*next;
}
还需注意的是第一个结点无前驱,需要设一个头指针指向它。访问结点的data域和next域需要用到->符。
接下来就是差不多的构造。遍历,删除等
比较主要的是两种插入方法。
头插法
将新数据插入在头指针之后,头结点之前。具体代码实现为:
{first=new Node;
first->next=nullptr;
Node*s;
s=new Node;
s->data=b[i];
s->next=first->next;
first->next=s;}
尾插法
将新数据插入在尾结点之后。具体代码实现:
Node*s,*r;
first=new Node;
r=first;
s=new Node;
s->data=a[i];
r->next=s;
r=s;
r->next=nullptr;
双链表的知识。
双链表与单链表的不同是,双链表还多了一个前驱指针用于存储前一个数据的地址 左右指针分别为llink和rlink 在定义结点时也要多定义一个llink。双链表的优点是不仅可以找到数据的后继也可以找到他的前驱。
主要的是插入和删除操作
插入:(在p之后插入一个新结点s)
s->llink=p;
s->rlink=p->rlink;
p->rlink-llink=s;
p->rlink=s;
删除:
p->llink->rlink=p->rlink;
p->rlink->llink=p->llink;
delete p;
循环链表
这个可以理解为一个单链表,但也有不同。单链表的结尾指向的是NULL。而循环链表指向的是链表的头部,就形成了环结构。在单链表中的遍历是p->next!=NULL现在是不等于头节点。 大部分还是和单链表一致。
以上是我对线性表这一章的理解和我自己认为重要的知识点。