数据结构 线性表

来源:互联网 发布:linux增加一个用户命令 编辑:程序博客网 时间:2024/05/29 09:49

线性表:零个或多个数据元素的有限序列。

· 顺序线性表

    表内元素顺序存储,紧密相联,有自己的顺序,类似静态一维数组,和静态一维数组不同的是,静态一维数组设定好长度后

不可变,而线性表的长度等于线性表内数据元素的个数。

· 链式线性表

链表,由数个节点组成,每个节点包括“数据域”和“指针域”,指针域指向下一个节点的地址。

· 各自优点:

链表优点:减少顺序线性表插入删除移动大量元素耗费的时间,不需要预分配存储空间,解决顺序线表可能出现的上溢和空间浪费等。

顺序有点:对于需要频繁查找,很少进行插入删除操作时节省时间。


静态链表

用数组代替指针描述的单链表,将数组看成两部分,数组存放值为数据域,其游标相当于指针指向下一个节点。

#define MaxSize 1000//链表(数组)最大值1000typedef struct{ElemType data;//数据域int cur;//指针域}Component,StaticLinkList[MaxSize];Status InitList(StaticLinkList space){//将一位数组space中各分量链成一备用链表//space[0].cur为头指针,“0”表示空指针。int i;for(i=0;i<MaxSize-1;i++)space[i].cur=i+1;space[MaxSize-1].cur=0;//当前链表为空,最后一个元素cur为0return OK;}/*静态链表的插入操作*//*为了辨明数组中哪些分量未被使用,将所有未被使用以及已经被删除的分量用游标链成一个备用链表,每当插入时,可以从备用链表取得第一个节点作为待插入的新节点*/int Malloc_SLL(StaticLinkList sapce){//若备用链表非空,则返回分配的节点下标,否则返回0int i=space[0].cur;//返回的第一个备用空闲下标if(space[0].cur)//如果分量被使用了(非0)space[0].cur=space[i].cur//下一个分量拿来备用}//根据代码理解图2,可以用来查找空节点。Status ListInsert(StaticLinkList L,int i, ElemType e){int j,k,l;k=MaxSize-1;//k是最后一个元素的下标if(i<1||i>ListLength(L)+1)return error;j=Malloc_SSL(L);//获得空闲分量的下标if(j){L[j].data=e;//把e的数据给空闲分量的datafor(l=1;l<=i-1;l++)k=L[k].cur;//找到第i个元素之前的位置L[j].cur=L[k].cur;//把第i个元素之前的cur赋给新元素curL[k].cur=j;//把新元素的cur改为之前元素原来指向的curreturn OK;}return Error;}/*静态链表的删除操作*/Status ListDelete(StaticLinkList L,int i){int j,k;if(i<1||i>ListLength(L))return Error;k=MaxSize-1;for(j=1;j<=i-1;j++)k=L[k].cur;j=L[k].cur;L[k].cur=L[j].cur;Free_SSL(L,j);return OK;}void Free_SSL(StaticLinkList space,int k){space[k].cur=space[0].cur//第一元素cur赋给要删除分量curspace[0].cur=k;//把要删除的分量下标赋给第一元素的cur}
缺点:没有解决连续分配带来表长难以确定的问题。

循环链表

终点空指针改为指向头结点,使单链表形成环的链表,尾指针指向头指针。


双向链表

顾名思义,每个节点前后都有指针域,向前和向后指。


Link:http://blog.csdn.net/zesicus/article/details/37901575(C++线性链表)

0 0
原创粉丝点击