zoukankan      html  css  js  c++  java
  • c语言数据结构学习心得——线性表

    线性表:具有相同数据类型的n(n>0)个数据元素的有限序列。

    主要有顺序存储和链式存储。

    顺序存储:

    特点:地址连续,随机/存取,顺序存储。

    建立:首地址/存储空间大小(数组),表长。

    方式:静态和动态。

    优点:存储密度大;随机存储:快速存取表中任一位置元素。

    缺点:插入删除移动大量元素;对存储空间要求高,会产生存储空间的碎片。

    1.插入

    bool ListInsert(SqList &L,int i,Elemtype e){
           if(i<1||i>L.length+1)                   //判断i范围是否有效
                return falseif(L.length>=MaxSize)                   //当前存储已满,不能插入
                return false;
           for(int j=L.length;j>=i;j--)            //第i个元素后移
                L.data [j]=L.data[j-1];
                L.data[i-1]=e;                     //第i个元素放入e
                L.length++;                        //链表长度加1
                return true;
    }

    最好的情况:表尾插入 只用加一个数据,时间复杂度为o(1);

    最坏的情况:表头插入,所有元素后移一位,时间复杂度为o(n);

    平均时间复杂度:o(n)。

    2.删除

    bool ListDelete(SqList &L,int i,Elemtype &e){
           if(i<1||i>L.length)                      //判断i范围是否有效
                return false;
           e=L.data[i-1];                           //将被删元素赋给e
           for(int j=i;j<L.length;j++)              //第i个后元素前移
                L.data [j-1]=L.data[j];
                L.length--;                         //链表长度减1
                return true;
    }

    时间复杂度如插入,但是具体要分析。

    线性表链式存储

    通过一组任意的存储单元来存储线性表中的数据元素。为了建立起数据元素之间的线性关系,对每个链表结点,除了自身信息,还存放了一个指向其后继的指针。

    单链表:单个指针

    typedef struct LNode{    //定义单链表结点类型
         Elemtype data;      //数据域
         struct LNode *next; //指针域
    }LNode,*LinkList;

    通常用“头指针”来标识一个单链表,如Linklist L,那么头指针L就代指一个单链表。

    单链表第一个结点之前附加一个结点,称为“头结点”。其数据域可不设任何信息,也可记录表长等信息。头结点指针域指向线性表第一个元素结点。

    头结点:操作方便:第一元素前插入和删除元素和第一结点操作与其他结点一致;链表无论空或不空,操作也统一。

    头指针始终指向链表的第一个结点。

    双链表:双指针

    typedef struct DNode{           //定义单链表结点类型
         Elemtype data;             //数据域
         struct DNode *prior,*next; //前驱指针和后继指针
    }DNode,*DLinkList;

    插入:

    给插入的前一个元素加辅助指针p,插入元素加辅助指针s

    1.s->next=p->next;

    2.p->next->prior=s;

    3.s->prior=p;

    4.p->next=s;;

    删除:

    删除的前一个元素加一个辅助指针p,删除的指针加一个辅助指针q

    1.p->next=q->next;

    2.q->next->prior=p;

    3.free(q);

    循环单链表:

    与单链表的区别在于,表中最后一个结点的指针不是NULL,而是改为指向头结点,从而整个链表形成一个环。

    从任何一个结点出发都能访问到链表的每一个元素。

    1.判断条件:头结点的后继指针是否等于头指针。

    2.可对循环单链表不设头指针而仅设尾指针,使效率更高。

    循环双链表:区别于双链表是首尾结点构成环。

    1.尾结点后继指针指向表头结点,头结点的前驱指针指向尾结点。

    2.当为空表时,头结点的prior域和next域都等于L。

    静态链表:

    借助数组来描述线性表的链式存储结构,结点也有数据域data和指针域next,此指针是结点的相对地址(数值下标),又称游标。

    对插入与删除操作与动态链表(动态分配内存的方式)相同,只需修改指针,而不需移动元素。

  • 相关阅读:
    MySQL数据同步,出现Slave_SQL_Running:no和slave_io_running:no问题的解决方法
    【坑】解决CentOS 7.1版本以上安装好zabbix 3.4 无法重启zabbix-server的问题
    unison+inotify的Web目录同步方案
    vue-cli3.0配置图片转base64的规则
    nginx将http升级到https并且同时支持http和https两种请求、http自动转向https
    linux中使用ps -ef
    form表单input回车提交问题
    Linux创建Jenkins启动脚本以及开机启动服务
    xshell破解
    WebSocket断开原因、心跳机制防止自动断开连接
  • 原文地址:https://www.cnblogs.com/suprechen/p/10591325.html
Copyright © 2011-2022 走看看