线性表的顺序存储实现

简介: 线性表的顺序存储实现

目录

一、利用数组的连续存储空间顺序存放线性表的各元素

1.建立空的列表

2.查找

3.插入

4.删除

二、线性表的链式存储实现

       1.求表长

       2.查找

    ①按序号查找:FindKth

    ②按值查找

        3.插入

        4.删除

       结语:本节只是模块,并没有举出实例!

一、利用数组的连续存储空间顺序存放线性表的各元素

先创建的一个结构

typedef struct LNode *last;

struct LNode{

       ElementType Data[MAXSIZE];    //ElementType自己定义的数组类型

       int last;

};

struct LNode L;

List ptrL;

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

//线性表的长度:L.last+1或P_>Last+1

1.建立空的列表

List MakeEmpty()

{    List parL;

    ParL=(List)malloc(sizeof(struct LNode));

    parL_>last=-1;

    return ParL;

}

//parL指向申请的一片空间,空间的最后一个元素赋值为-1,最后返回ParL

2.查找

int Find(ElementType X,List parL)

{    int i=0;

    while(i>parL_>last&&ParL_>Data[i]!=X)  //一个表都没找到或者本次没找到

       i++;

   if(i>ParL_>last) return -1;            //没找到返回-1

   else return i;                         //找到后返回存储的位置下标

}

查找成功的平均次数为(n+1)/2,时间复杂度为O(n)

3.插入

a38ad02dbeed49d296bb431790b9ba03.png

注意:从最后一个元素依次朝后面移动,如果从i-1个元素朝右边移动,则会造成元素覆盖,最后都会是a[i-1]

void insert (ElementType X,int i,List parL)

{    int j;

   if(ParL_>Last==MAXSIZE-1){    

        Printf("表满");

        return;

   }//判断表满没

   if(i<1||i>parL_>Last+1){

       printf("位置不合法");

       return;

   }

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

       parL_>Data[j+1]=parL_>Data[j];  //将a[n]-a[i]向后移动

       parL_>Data[i-1]=X;              //新元素插入

       parL_>Last++;                   //Last指向最后一个元素

       return;

}

4.删除

4b1ba8645e81477fa660760d617f1e03.png

注意:是按照从左到右的顺序往前移动,覆盖要删除的元素即可

void Delete(int i,List PtrL)

{    int j;

    if(i<1||i>ParL_>Last+1){

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

       return;

    }

    for(j=i;j<ParL_Last;j++){

       ParL_>Data[j-1]=ParL_>Data[j];//把a[i-1]覆盖

       ParL_>Last--;//Last指向最后一个元素

       return;

    }

平均移动次数(n+1)/2,时间复杂度O(n)

二、线性表的链式存储实现

逻辑上相邻,不同于数组的物理上相邻;通过链建立起元素之间的逻辑联系

优点:插入,删除不需要移动元素,只需要改动‘链’

先建立一个结构

tydepef struct LNode *List;

struct LNode{

    ElemenType Data;

    List Next;

}

struct LNode L;

List ParL;

1.求表长

23a35d1909304898a65587ce4601fa5a.jpg

int Length(List parL){

   List p=parL;     //P指向表的第一个节点

   int j=0;

   while(p){

       p=p_>Next;

       j++;         //当前p指向的第j个节点

   }

return j;

}

2.查找

①按序号查找:FindKth

List Findkth(int k,List parL){

       List p=ParL;

       int i=0;

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

           P=P_>Next;

           i++;

       }

       if(i==k) return P;  //找到第K个,返回指针

       else   return NULL;  //没找到,返回空

②按值查找

List Find(EmelenType X,List ParL){

    List p=ParL;

    whiel(p!=NULL&&P_>Data!=X)

       p=P_Next;

return P;

}

3.插入

5452d23cd2704649b8e68a48d72d562f.jpg

注意:P_>Next=s与s_>Next=p_>Next的顺序

List insert(ElemenTyoe X,int i,List parL){

     List p,S;

     if(i==1){        //新节点插入在表头

        S=(List)malloc(sizeof(struct LNode));//申请,填装节点

        S_Data=X;

        S_>Next=parL;

        return S;//返回新表头指针

       }

      P=FindKth(i-1,ParL);//查找第i-1个节点

      if(P==NULL){

           printf("参数i错误“);//不存在,不能插入

           return NULL;

      }else{

             S=(List)malloc(sizeof(struct ParL));//申请,填装节点

             S_>Data=X;

             S_>Next=P_>Next;//新节点插入在第i-1个节点后面

             P_Next=S;

             return ParL;

       }

}        

4.删除

2ee8fe697f26444596c06783b199a402.jpg 注意:free(s);


List Delete(int i,List parL){

     List S,P;

     if(i==1){         //删除表的第一个节点

       S=ParL;

       if(ParL==NULL)  return NULL;//从链表中删除

       else  ParL=ParL_>Next;

       free(S);        //释放被删除的节点

       return ParL;

       }

       P=FindKth(i-1,ParL);//查找第i-1个节点

       if(P==NULL){

           printf("第%d个节点是不存在的",i-1);

           return NULL;

       }else if(P_>Next==NULL){

                   printf("第%d个节点不存在",i);

                   return NULL;

               }else{

                       S=P_>Next;//S指向第i个节点

                       P_Next=S_>Next;//从链表中删除

                       free(S);//释放

                       return ParL;

                     }

相关文章
|
算法 vr&ar
线性表的详解与深入
线性表的详解与深入
|
1月前
|
存储
顺序存储之顺序表
这篇文章介绍了顺序表的创建、操作和顺序存储的实现,包括定义数据类型、构建顺序表结构、顺序表的创建、扩容、数据插入、删除、遍历和销毁。
31 0
|
存储
线性表的链式存储结构
线性表的链式存储结构
|
存储 缓存
线性表
从以上就很容易看出,在缓存利用率方面,顺序表由于内存是连续的,而链表是一个个单个的节点连起来的,顺序表的命中率绝对要比链表高不少,但是链表又要比顺序表要灵活不少,到这里我相信你就能理解为什么说所以这两种结构是优势互补的关系了,具体使用哪种结构,当然还是要根据具体场景去抉择了,好了这篇博客到这里就结束了,多多点赞支持哦!!
线性表
|
存储 算法 C++
线性表和链表
线性表和链表
119 0
|
存储
线性表的链式存储——链表
线性表的链式存储——链表
205 0
|
存储 C++
线性表的顺序存储——顺序表
线性表的顺序存储——顺序表
177 2
线性表的顺序存储——顺序表
|
存储 机器学习/深度学习 人工智能
浅谈线性表
数据结构线性表、栈与队列的区别0
107 0
浅谈线性表
线性表的顺序存储实现
线性表的顺序存储实现