线性表的知识归纳和理解

  • 在经过线性表一章的学习,我学到了许多,但由于自己有时上课走神,课后没巩固,有点落后老师的进度,但后来经过自己复习课件,做题目还是渐渐理解了这方面知识。
首先谈到线性表,我们先接触到的是模板。
在刚开始程序方面的学习时,我们接触的题目 数据都是固定的类型,但越到后面,会发现我们接触的题目有时候输入数据类型不唯一,可能是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现在是不等于头节点。 大部分还是和单链表一致。
 
 
以上是我对线性表这一章的理解和我自己认为重要的知识点。
 
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值