数据结构 第二章线性表

第二章 线性表

置换、逆序

知识点
  1. 了解线性结构的特点

    • 只有一个首结点和尾结点;

    • 除首尾结点外,其他结点只有一个直接前驱和一个直接后继。

  2. 掌握顺序表的定义、查找、插入和删除

    • 顺序表的定义

      逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构。

    • 顺序存储方法:

      用一组地址连续的存储单元依次存储线性表的元素,可通过数组 V[n] 来实现。

      #define MAXSIZE 100
      
      typedef struct {
             
          ElemType *e;
          int length;
      }SqList;
      
    • 顺序表的查找(根据指定数据获取数据所在的位置)

      Status Locate(SqList *List , ElemType e){
             
          for(int i = 0 ; i < List.length ; i++){
             
              if(List.e[i] == e){
             
                  return i+1;
              }
          }
          return 0;
      } 
      
    • 顺序表的插入(在线性表L中第i个数据元素之前插入数据元素e)

      • 步骤
        1. 插入位置是否合法
        2. 存储空间是否已满
        3. 移动元素
        4. 插入元素
        5. 表长加一
      Status Insert(SqList *L,int i,ElemType e){
             
      
          //判断插入位置是否合法
          if(i<1||i>L.length+1){
             
              return ERROR;
          }
      
          //判断储存空间是否已满
          if(L.length == MAXSIZE){
             
              return ERROR;
          }
      
          //移动元素
          for(int j = L.legth ; j >= i ; j++){
             
              L.e[j] = L.e[j-1];
          }
      
          //插入元素
          L.e[i-1] = e;
      
          //表长加一
          L.length++;
      
          return OK;
      }
      
      算法分析:(算法时间主要耗费在移动元素上)
      
      AMN = n/2
      
    • 顺序表的删除(删除第 i 个结点)

      • 算法步骤:
        1. 判断位置是否合法
        2. 保存元素
        3. 移动元素
        4. 表长减一
      Status Delete(SqList *L,int i){
             
      
          //判断位置是否合法
          if(i<1||i>L.length+1){
             
              return ERROR;
          }
      
          //保存元素
          int e = L.e[i-1];
      
          //移动元素
          for(int j = i-1;j < L.length;j++){
             
              L.e[j] = L.e[j+1];
          }
      
          //表长减一
          L.length--;
      
          return OK;
      }
      
      算法分析:算法时间主要耗费在移动元素的操作上
      
      AMN = (n-1)/2
      
    • 查找、插入、删除算法的平均时间复杂度为O(n),显然,顺序表的空间复杂度S(n)=O(1)(没有占用辅助空间)

  3. 掌握链表的定义、创建、查找、插入和删除

    • 链表的定义

      • 单链表
      typedef struct LNode{
             
          ElemType e;
          struct LNode *next
      }LNode,*LinkList;
      
      • 双向链表
      typeddef struct DulNode{
             
          ElemType data;
          struct DulNode *pri;
          struvt DulNode *next;
      }DulNode,*DulLinkList;
      
    • 链表的创建

    //前插法
    void Create(LinkList &L,int n){
          
    
        LNode *head = (LNode*)malloc(sizeof(LNode)); 
        
        head->next=NULL;
        
        L = head
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值