顺序表和链表(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
#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;
}

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

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

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

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

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

你可能感兴趣的:(#,早期数据结构代码,Sqlist,LNode,线性表)