zoukankan      html  css  js  c++  java
  • 数据结构:线性表

    线性表(List)

    线性表是n个元素构成的有序序列(a1,a2,...,an)

    ListMakeEmpty() 初始化一个空线性表L

    ElementType FindKth(int K, List L) 根据位序K返回相应元素

    int Find(ElementType X, List L) 在线性表L中查找X第一次出现的位置

    void Insert(ElementType X, int i, List L) 在位序i前插入新元素X

    void Delete(int i, List L) 删除指定位序i的元素

    int Length(List L) 返回线性表L的长度n

    顺序存储

    typedef struct{

      ElementType Data[MAXSIZE];

      int Last;

    }List;

    List L, *PtrL;

    访问下标为i的元素:L.Data[i]或PtrL->Data[i]

    线性表的长度:L.Last+1或PtrL->Last+1

    1,初始化

    List *MakeEmpty(){

      List *PtrL;

      PtrL = (List*)malloc(sizeof(List));

      PtrL->Last = -1;

      return PtrL;

    }

    2,查找

    int Find(ElementType X, List *PtrL){

      int i = 0;

      while((i<PtrL->Last+1)&&(X!=PtrL->Data[i]))  i++;

      if(i==PtrL->Last+1)  i = -1;

      return i;

    }

    3,插入(从后往前开始一直到i-1,先将元素向后移动一个单位,再在i-1处插入新的元素)

    void Insert(ElementType X, int i, List *PtrL){

      if(PtrL->Last+1==MAXSIZE){

        printf("表已满");

        return;

      }

      if(i<1||i>PtrL->Last+2){

        printf("位置不合法");

        return;

      }

      for(int j=PtrL->Last; j>=i-1; j--){

        PtrL->Data[j+1] = PtrL->Data[j];

      }

      PtrL->Data[i-1] = X;

      PtrL->Last++;

      return;

    }

    4,删除(从i开始,将第i个元素移动到i-1的位置上,删除第i-1个元素)

    void Delete(int i, List *PtrL){

      if(i<1||i>PtrL->Last+1){

        printf("不存在第%d个元素", i);

        return;

      }

      for(int j=i; j<PtrL->Last+1; j++){

        PtrL->Data[j-1] = PtrL->Data[j];

      }

      PtrL->Last--;

      return;

    }

    链式存储

    typedef struct Node{

      ElementType Data;

      struct Node *Next;

    }List;

    List L, *PtrL;

    1,求表长

    int Length(List *PtrL){

      List *p = PtrL;

      int i = 0;

      while(p){

        p = p->Next;

        i++;

      }

      return i;

    }

    2,查找

    (1)按序号查找

    List *FindKth(int K, List *PtrL){

      List *p = PtrL;

      int i = 0;

      while(p!=NULL&&i<K){

        p = p->Next;

        i++;

      }

      return p;

    }

    (2)按值查找

    List *Find(ElementType X, List *PtrL){

      List *p = PtrL;

      while(p!=NULL&&p->Data!=X){

        p = p->Next;

      }

      return p;

    }

    3,插入(在第i-1个节点后插入一个值为X的新节点)

    (1)先用malloc构造一个新节点,用s指向

    (2)再找到链表的第i-1个节点,用p指向

    (3)然后修改指针,插入节点

    List *Insert(ElementType X, int i, List *PtrL){

      List *p,*s;

      if(i==1){

        s = (List*)malloc(sizeof(List));

        s->Data = X;

        s->Next = PtrL;

        return s;

      }

      p = FindKth(i-1, PtrL);

      if(p==NULL){

        printf("参数错误");

        return NULL;

      }else{

        s = (List*)malloc(sizeof(List));

        s->Next = p->Next;

        p->Next = s;

        s->Data = X;

        return PtrL;

      }

    }

    4,删除(删除链表上第i个节点)

    (1)先找到链表的第i-1个节点,用p指向

    (2)再用指针s指向要删除的节点

    (3)修改指针,删除s指向的节点

    List *Delete(int i, List *PtrL){

      List *p, *s;

      if(i==1){

        s = PtrL;

        if(s!=NULL)  PtrL = PtrL->Next;

        else return NULL;

        free(s);

        return PtrL;

      }

      p = FindKth(i-1, PtrL);

      if(p==NULL||p->next==NULL){

        printf("找不到指定位置的元素");

        return NULL;

      }else{

        s = p->Next;

        p->Next = s->Next;

        free(s);

        return PtrL;

      }

    }

    广义表

    1,广义表是线性表的推广

    2,对于线性表而言,n个元素都是基本的单元素

    3,广义表中,这些元素不仅可以是单元素,也可以是另一个广义表

    typedef struct GNode{

      int Tag;          /*标志域:0表示结点是单元素,1表示节点是广义表*/

      union{          /*子表指针域Sublist与单元素数据域Data复用,即公用存储空间*/

        ElementType Data;

        struct GNode *SubList;

      }URegion;

      struct GNode *Next;    /*指向后继节点*/

    }GList;

  • 相关阅读:
    June 26th 2017 Week 26th Monday
    June 25th 2017 Week 26th Sunday
    June 24th 2017 Week 25th Saturday
    June 23rd 2017 Week 25th Friday
    June 22nd 2017 Week 25th Thursday
    2018最佳网页设计:就是要你灵感爆棚!!!
    图片素材类Web原型制作分享-Pexels
    想要打动HR的心,UX设计师求职信究竟应该怎么写?
    【UXPA大赛企业专访】Mockplus:“设计替代开发”将成为现实
    2018年最好的医疗网站设计及配色赏析
  • 原文地址:https://www.cnblogs.com/bl8ck/p/9528677.html
Copyright © 2011-2022 走看看