• 线性结构-线性表


    线性表

    由同类型数据元素构成有序序列的线性结构

    • 表中元素个数称为线性表的长度
    • 线性表没有元素时,称为空表
    • 表起始位置称表头,表结束位置称表尾

    线性表的抽象数据类型描述

    • 线性表是n个元素构成的有序序列

    线性表基本操作

    • List MakeEmpty() 初始化一个空线性表L
    List MakeEmpty(){
          List PtrL;
          PtrL=(List)malloc(sizeof(struct LNode));
          PtrL->Last=-1;
          return PtrL;
    }
    
    • ElemType_FindKth(int K,List L) 根据位序K,返回相应元素
    • int Find(ElementType X,List L) 在线性表L中查找X的第一次出现位置
    int Find(ElementType X,List PtrL){
          int i=0;
          while(i<=PtrL->Last && PtrL->Data[i]=X)
                i++;
          if(i>PtrL->Last) return -1  //如果没有找到 返回-1
          else return i;              //找到后返回存储位置
    }
    
    • void insert(ElementType X,int i,List L) 在位序前插入一个新元素X
    void insert(ElementType X,int i,List Ptrl){
          int j;
          if(PtrL->Last==MAXSIZE-1){  //表空间已满 不能插入
                printf("表满");
                return;
          }
          if(i<1||i>PtrL->Last+2){   //检查插入位置的合法性
                printf("位置不合法");
                return;
          }
          for(j=PtrL->Last;j>=i-1;j)
                PtrL->Data[j+1]=PtrL->Data[j]; //将a[i]-a[n]倒序向后移动
          PtrL->Data[i-1]=X;                   //新元素插入
          PtrL->Last++;                        //Last仍指向最后的元素
          return;
    
    • void Delete(int i,List L) 删除指定位序i的元素
    void Delete(int i,List Ptrl){
          int j;
          if(i<1||i>Ptrl->Last+1){
                printf("不存在第%d个元素",i);
                return;
          }
          for(j=i;j<=PtrL->Last;j++)
                PtrL->Data[j-1]=PtrL->Data[j];
          PtrL->Last--;
          return;
    
    • int Length(List L) 返回线性表L的长度n

    增删改查

    线性表的顺序存储结构

    1. 利用数组的连续存储空间顺序存放线性表的各元素
    typedef struct LNode*list;
    struct LNode{
          ElementType Data[MaxSize];
          int Last;
    };
    struct LNode L;
    List PtrL;
    

    线性表的链式存储实现

    主要操作的实现

    求表长

    int Length(List Ptrl0{  //遍历整个链表
          List p=PtrL;      //p指向表的第一个结点
          int j=0;
          while(p){
                p=p->Next;
                j++;        //当前怕p指向的是第j个结点
          }
          return j;          //时间复杂度O(n)
    }
    

    查找

    1. 按序号查找
    List FindKth(int K,List PtrL0{
          List p=PtrL;
          int i=1;
          while(p!=Null && i<K){
                p=p->Next;
                i++;
          }
          if(i==K)return p;//找到第K个 返回指针
          esle return Null;
    }
    
    1. 按值查找
    List Find(ElementType X,List PtrL){
          List p=PtrL;
          while(p!=Null && p->Data !=X)
                p=p->Next;
          return p;
    }
    

    插入(在第i-1(1<=i<=n+1)个结点后插入一个值为X的新结点)

    1. 先构造一个新结点,用s指向;
    2. 再找i到链表的第i-1个结点,用p指向;
    3. 然后修改指针,插入结点(p之后插入新结点是s)
    List Insert(ElementType X,int i,List PtrL){
          List p,s;
          if(i==1){
                s=(List)malloc(sizeof(struct LNode));
                s->Data=X;
                s->Next=PtrL;
                return s;
          }
          p=FindKth(i-1,PtrL);
          if(p==Null){
                printf("参数错");
                return Null;
          }
          else{
                s=(List)malloc(sizeof(struct LNode));
                s->Data=X;
                s->Next=p->Next;
                p->Next=s;
                return PtrL;
          }
    }
    

    删除(删除链表的第i(1<=i<=n)个位置上的结点)

    1. 先找到链表的第i-1个结点,用p指向;
    2. 再用指针s指向要被删除的结点(p的下一个结点);
    3. 然后修改指针,删除s所指结点;
    4. 释放s所指结点的空间
    List Delete(int i,List PtrL){
          List p,s;
          if(i==1){         //若要删除的是表的第一个结点
                s=PtrL;     //s指向第一个结点
                if(PtrL!=Null)PtrL=PtrL->Next;    //从链表中删除
                else return Null;
                free(s);            //释放删除的结点
                return PtrL;
          }
          p=FindKth(i-1,PtrL);
          if(p=Null){
                printf("第%d个结点不存在",i-1); return Null;
          }
          else if(p->Next==Null){
                printf("第%d个结点不存在",i); return Null;
          }
          else{
                s=p->Next;      //s指向第一个结点
                p->Next=s->Next;//从链表中删除
                free(s);        //释放被删除的结点
                return PtrL;
          }
    }
    
  • 相关阅读:
    LWIP的底层结构(物理层)
    Source insight 支持汇编
    Camera Vision
    i2c-tools的使用方法及举例
    浅析C语言中strtol()函数与strtoul()函数的用法
    CF540C Ice Cave
    CF540B School Marks
    hdu5122 K.Bro Sorting
    hdu1013 Digital Roots
    蓝桥杯 算法提高 递推求值
  • 原文地址:https://www.cnblogs.com/Alex3O/p/13282816.html
Copyright © 2020-2023  润新知