线性表的顺序存储和链式存储

ps:从今天开始尽量每两三天写一篇日志,总结自己在复习中遇到的问题。

 

这两天主要复习了线性表的顺序存储结构和线性表的链表存储结构。

所谓顺序存储,是用数组来实现的,在内存中分配一块连续的地址区间,将数据按顺序存储到该数组中;

 

a1a2a3a4a5......ai-1ai

......

an

存储结构如下:

#define MAXSIZE 20

typedef int ElemType ;

typedef struct

{

      ElemType data[MAXSIZE] ;

      int length ;

}SqLst ;

 

主要运用包括

Status GetElement(SqList *L , int i , ElemType e)    //取出第i个元素

{

          if(L.length==0 || i < 1 || i > L.length)

               return ERROR ;

           e = L.data[i-1] ;

          return OK;

 

}

Status InsertList(SqList * L , int i , ElemType e)   //在第i个位置插入新元素

{

         if(L.length == MAXSIZE)  return ERROR ;

         if(i < 1 || i > L.length+1)    return ERROR ;

         if(int j = L.length-1 ; j>=i-1 ; --j)

             {

                   L.data[j+1] = L.data[j] ;

             }

         L.data[i] = e ;

        L.length++ ;

       return OK ;

}

Status ListDelete(SqList * L , int i , ElemType e)    //删除第i个元素

{

       if(L.length == 0 )    return ERROR ;

       if(i < 1 || i>L.length)    return ERROR ;

       *e = L.data[i-1] ;

      if(i < L.length)                              //不是删除表尾元素

       {

               for(int k = i ; k < L.length ; ++k)

                  {

                      L.data[k-1] = L.data[k] ;

                  }

       }

       L.length-- ;

      return OK ;

}

 

线性表的链式存储结构每个数据元素包含两部分信息,一部分是数据信息,叫做数据域;一部分是指针域,存放后继元素的地址信息。

每个链表有一个头指针,指向链表的第一个元素;链表的最后一个元素的指针域为NULL。有的链表包含头结点、有的链表不包含头结点。头结点并不是真正意义上的第一个结点,因为它的数据信息是没有意义的。

 

单链表结构描述:

typedef struct Node

{

     ElemType data ;

     struct Node *node ;

}Node ;

typedef struct Node *LinkList ;

LinkList L :这里的L其实就相当于链表的头指针,指向这个链表。如果是没有头结点的链表,那么L就是指向的第一个结点,L->data为第一个结点的数据域;L->next为第二个节点。但是如果链表是有头结点的,L->next才是第一个结点。

LinkList *L :这里的L是指向链表的头指针的指针,*L才是链表的头指针,因此如果没有头结点的链表,那么(*L)就是指向第一个结点,(*L)->data就是第一个结点的数据域;如果是带有头结点的链表,(*L)->next为第一个结点。

 

主要操作:(均以不带头结点的链表为例)

Status GetElem(LinkList L  , int i , ElemType *e)

{

        int j  = 1;

        LinkNode p ;

        p = L ;

        while( p && j<i)

       {

            p = p->next ;

            ++j ;

       }

      if( !p || j > i)

        return ERROR ;

      *e = p->data ;

         return OK ;

}

 

 

Status ListInsert(LinkList * L , int i , ElemType e)     //在第i个位置上插入元素e

{

       LinkList P , S ;

       P = *L ;

       int j = 1 ;

      while( P && j<i-1)

      {

             P = P->next ;

             ++j ;

      }

     S = (LinkList)malloc(sizeof(Node)) ;

    S->data = e ;

    S->next = P->next ;

    P->next = S ;

    return OK ;

}

 

 

Status LinkListDelete(LinkList *L , int i , ElemType *e)

{

      LinkList p , q ;

      p =  *L ;

      int j = 1 ;

      while(p && j<i-1)

    {

            p = p ->next ;

            ++j ;

    }

    if(!p->next || j>i)    return ERROR ;

    q = p->next ;

    p->next = q->next ;

    *e = q->data;

     free(q) ;

    return OK ;

  }

暂时写到这里,后面有什么再补充。有错误请大家指出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值