数据结构——线性表

我们现如今通过使用类的方法来实现线性表,线性表是零个或多个具有相同类型数据元素的有限序列,一般的线性表是由一个数据成员与一个指针来构成。
线性表可以分成几种特殊的表
第一种是顺序表即数据中存在某种顺序的关系其特点是用一连串地址依次储存数据元素,由于我们使用类来进行线性表的操控,线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系。因此就用构造函数来实现线性表的构建,
插入操作要先判断是否顺序表满,删除操作要判断是否空
如:
void SeqList<T>::Insert(int i, T x){ 
int j;
if (length>=MaxSize) throw "上溢";
if (i<1 || i>length+1) throw "位置";
for (j=length; j>=i; j--)
      data[j]=data[j-1];   
data[i-1]=x;
length++;
}
删除操作则要考虑表是否已经为空,无法再进行删除,
如:
T SeqList<T>::Delete(int i){ 

int j;
T x;
if (length==0) throw “下溢”;
if (i<1 || i>length) throw “位置”;
x=data[i-1];
for (j=i; j<length; j++)
data[j-1]=data[j];
length–;
return x;
}
查找操作就是从头到尾进行顺序验证,看是否符合查找下的条件。
第二种就是链表,与顺序表不同的地方是采用指针连接的方式,不再是依靠数组的顺序存储,不存在满的状态,与顺序表不同的地方就是建立的方式
头插:
template
LinkList:: LinkList(T a[ ], int n) {
first=new Node; //生成头结点
first->next=NULL;
Node *s;
for (int i=0; i<n; i++){
s=new Node;
s->data=a[i]; //为每个数组元素建立一个结点
s->next=first->next;
first->next=s;
}
}
建立一个头节点,在其后不断的修改first->next达到头节点后插入的操作。
尾插:
template
LinkList:: LinkList(T a[ ], int n) {
Node *r,*s; //尾指针
first=new Node; //生成头结点
r=first;
for (int i=0; i<n; i++) {
s=new Node;
s->data=a[i]; //为每个数组元素建立一个结点
r->next=s; r=s; //插入到终端结点之后
}
r->next=NULL; //单链表建立完毕,将终端结点的指针域置空
}
与头节点不同的地方是在链表尾部进行来链接,等到最后时,将最后的指针赋空即可;
查找的方式稍微有所不同,要建立两个指针由于链表是单向的分别记录该位置及上一个位置。
删除操作:
template
T LinkList::Delete(int i){
Node *p; int j;
p=first ; j=0; //工作指针p初始化
while (p && j<i-1) { //查找第i-1个结点
p=p->next;
j++;
}
if (!p || !p->next) throw “位置”; //结点p不存在或结点p的后继结点不存在
else {
Node *q; T x;
q=p->next; x=q->data; //暂存被删结点
p->next=q->next; //摘链
delete q;
return x;
}
}
删除就是将该处的next付给上一个位置的next再将之后的空间delete释放掉;
第三种就是在单链表上延伸出来的复杂链表,比如双链表和循环链表,双链表就是在单链表的基础上增加一个指向前一个位置的指针,而循环链表尾部的指针则指向first->next;
链表这部分的内容比较的复杂,写这篇博客的时间比较的长,也接触到了后面的内容,所以链表这部分内容只是将后面的知识进行铺垫,还是比较简单的·,就是开始的时候不是很会吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值