顺序表和链表(Sqlist&Linklist)

———————————————————————————————————————————

众所周知,线性表是一个比较灵活的存储空间,其中有两种存储格式:线性表和链表,下文尽量详细地进行整理二者的特点和区别。

顺序表(Sqlist):

顺序表,顾名思义,就是用连续的空间存储当下得到的数据。

顺序链性表用Sqlist称呼,提到Sqlist就指的是顺序链性表

其特点在于:

1.存储空间是连续的,可以通过下标找到前后成员的值

2.同时,因为空间的特殊性,可以通过下标来进行跳跃性查找

顺序表的实现:

以下是之前敲的一个大程序的关于顺序表建立的小部分

在程序中我们是将线性表的每一块存储多种信息(号码,名称,价格),概括起来就是将拥有多个信息的结构体对象联系起来,存到一个表中。如果我们想在线性表中存储数组,而不是结构体,可以将里面的那句话进行修改:

typedef book ElemType;
//更改为:
typedef int ElemType;

 这样就是将原本为结构体格式的表格改变为只可以存储整型。

完整的建立顺序表的代码:

typedef int Status;
typedef struct
{
    string no;
    string name;
    double price;
}book;
typedef struct
{
    book *elem;
    int length;
}SqList;

typedef book ElemType;//上文提到的地方
Status initlist(SqList &l)
{
    l.elem=new ElemType[MAXSIZE];
    if(!l.elem) exit(error);
    l.length=0;
    return OK;
}

 顺序表的优点在于:

1.可以迅速的调取某一个位置的数值或某一个数值所在的位置(两个的复杂度均为O(n))

2.所存储的数据均为连续的,查找表长可以直接用l.length得到(复杂度为O(1))

而缺点在于:

1.添加与删除时需要整体将后方数值进行移动(当然添加或删除最后一位上的数值例外)

 甚至如果要求为:“将某一位上的数值删除的话”,有可能调用两次遍历。

链表(Linklist)

链表?个人认为链表与线性表的优缺点正好相反。

先敲定义:

用度娘的话来说:“链表是一种物理存储单元上非连续、非顺序的存储结构数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。” 

我认为已经写得挺细了(沉思),简单来说,链表因为存储空间不是完全连续的,故而是由每一个结点中的指针域来连接前后的数据,最基本的链表只有下个数据的指针,故而只能从前往后查询,从前往后遍历。这样的一个弊端引出了另一种结点中含有上下地址的链表(),解决了这个问题。

由此可以看出空间和时间的损耗是成反比?节约时间的状态下会适当牺牲空间。

链表调用是用指针操作,创建时会将头结点进行指空操作(设为空指针)

【详细操作可以参考鄙人另一篇关于(LRU)的博客,有完整的建立链表的代码】

#include<iostream>
#define ok 1;
using namespace std;
typedef int ElemType;
typedef int Status;
typedef struct LNode
{
	ElemType date;
	LNode *next;

}LNode,*LinkList;
Status IntList(LinkList &L)//初始化
{
	L=new LNode;
	L->next=NULL;
	return ok;
}

建立之后可以通过导入数组等格式的数据、读取文件或是输入操作来填充数据。

插入和删除相较于顺序表而言更加简明,但复杂度并不一定确定:

  如果是给予了地址,则直接把地址位置进行调整,否则则是通过遍历来找到该位置,再进行操作。故而在单纯看“删除”这个操作下,链表要更加便捷,而完整的操作下,由于链表查找的弊端,优势在鄙人看来不是十分突出。

通过下标查找数值和查询表格长度操作,顺序表相较于链表而言更加便捷。

以上关于线性表提到的操作,由于整体看起来过长,将截取之前所敲的部分代码,通过衔接贴来。

  • 9
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值