数据结构之线性表学习总结

来源:互联网 发布:淘宝店铺货源 编辑:程序博客网 时间:2024/05/16 17:47

   鉴于自己的数据结构知识较为薄弱,并且自己常常学完没几天又忘了,每次用起来都要去查阅,所以现在开个博客来记录自己在学数据结构过程中自己的一些学习总结,也可以加深自己的理解。


第一篇要总结的是线性表。


线性表:零个或多个相同特性的数据元素的有限序列。首先它是一个序列,元素之间是有顺序 的,第一个元素无前驱,最后一个元素无后继,其他的都有且只有一个前驱和后继。而所有元素按这种1对1的邻接关系构成的整体就是线性表。


线性表的存储结构:线性表有顺序表和链式两类存储结 构

            (一)顺序表

              顺序表就是把线性表中的所有元素按照其逻辑顺序,依次存储到从计算机存储器中指定存储位置开始的一块连续的存储空间,如下图所示,即用一维数组来实现顺序表。

              

顺序表的一些基本操作

 首先定义一个顺序表

#define MAXSIZE  20typedef int ElemType;typedef struct{    ElemType date[MAXSIZE];//存放顺序表中的元素    int length;           //存放顺序表的长度}SqList;                 //声明顺序表的类型
初始化顺序表算法
void InitList(SqList &L){      L.length = 0;}
用e返回L中第i个数据元素的值
int GetElem(SqList L,int i,ElemTye *e){    if(L.length == 0 || i < 1 || i > L.length)        return 0;    *e = L.date[i - 1];    return 1;}
按元素查找算法
int LocateElem(SqList L,ElemType e){     int i = 0;     while(i < L.length && L.data[i] != e) i++;     if(i > L.length) return 0;     else return i + 1;}
插入数据元素
int ListInsert(SqList *L,int i,ElemType e){    if(L -> length == MAXSIZE)        return 0;    if(i < 1 || i > length + 1)        return 0;    if(i < L -> length)    {         for( k = L->length; k > i; k--)                L->date[k] = L->date[k - 1];         }     L -> date[i - 1] = e;     L -> length++;     return 1;}
删除数据元素算法
int ListDelete(SqList &L,int i,ElemType &e){    int k;    if(L -> length == 0)        return 0;    if(i < 1 || i > L -> length)        return 0;    e = L -> date[i - 1];    if(i < L -> length)    {        for(k = i; k < L -> length; k++)            L -> date[k - 1] = L -> date[k];    }    L -> length--;    return 1;}

以上都是基于顺序表的一些基本操作,顺序存储结构中只需存放元素自身的信息,因此,存储密度大,空间利用率高;还有就是元素位置可以用元素的下标通过简单的解析式计算出来,所以可以随机存储。这都是顺序表的优点,但是在顺序表,元素的插入和删除运算需要移动许多其他元素的位置,一些长度变化较大的线性表必须按最大需要的空间分配储存。所以在使用线性表时,在选择顺序存储还是链式存储时,可以根据线性表是否很少进行插入和删除操作,或者插入和删除操作总是在尾部进行时,就可以依次为依据选择。

       (二)链表

        在链式存储结构中,每个结点用于存储线性表的一个元素,每个结点不仅包含有所存元素本身的信息(称之为数据域),而且包含有元素之间逻辑关系的信息,即前驱结点包含有后继结点的地址信息,这称为指针域,这样就可以通过前驱结点的指针域方便地找到后继结点。链表由多个结点组成,这些结点的地址可以是连续,也可以不连续,这就是说这些数据元素可以存储在内存中未被占用的任意位置。

       链表由如下几种形式

       (1)单链表:在每个结点中包含有数据域外,只设置一个指针域,用于指向其后继结点,如图

        

         (2)双链表:在每个结点中包含有数值域外,设置有两个指针域,分别用于指向其前驱结点和后继结点。如图:

        

         (3)循环链表:循环链表是另一种形式的链式存储结构。它的特点是表中尾结点的指针域不变,而是指向表头结点,整个链表形成一个环,如下图:

          循环单链表:

         

           循环双链表:

  

      (4)静态链表:借用一维数组来描述线性链表,数组中的一个分量表示一个节点,同时使用游标代替指针一显示节点在数组中的相对位置。数组中的第0个分量可以看成头节点,其指针域指示静态链表的第一个节点。


链表的特点:由于每个继节点带有指针域,因此在存储空间上比顺序表要付出较大的代价,所以顺序表比链表的存储密度高。还有链表不具有顺序表的随机存取特点,但在链表中插入或删除操作时,只需修改相关节点的指针域即可,不需要移动节点。

          



0 0
原创粉丝点击