顺序表--数组

顺序表结点的存储地址计算公式:

    第i个数据元素的存储位置:Loc(ai)=Loc(ai)+(i-1)*l;1≤i≤n(l为每个元素需占l个存储单元)

    第(i+1)个数据元素的存储位置Loc(ai+1)和第i个数据元素的存储位置Loc(ai)的关系:Loc(ai+1)=Loc(ai)+l;

数组:

#define  OK   1
#define  ERROR   -1
#define  MAX_SIZE  100
typedef  int  Status ;
typedef  int  ElemType ; 

typedef  struct  sqlist
{   
    ElemType  elem_array[MAX_SIZE] ;
    int length ;
} SqList ;

1. 顺序线性表初始化

 Status Init_SqList( SqList *L ) 
{  
    L->elem_array=( ElemType * )malloc(MAX_SIZE*sizeof( ElemType ) ) ;
    if ( !L -> elem_array ) 
        return  ERROR ; 
    L->length= 0 ;    
    return OK ;    
}

2. 顺序线性表的插入---实现步骤(Einsert=n/2,平均时间复杂度为O(n))
/*
(1) 将线性表L中的第i个至第n个结点后移一个位置。
(2) 将结点e插入到结点ai-1之后。
(3) 线性表长度加1
*/

Status Insert_SqList(Sqlist *L,int i ,ElemType e)
 {   
    int j ;
    if( i<1||i>L->length+1)  
        return  ERROR ; //i合法值1到length+1
    if(L->length>=MAX_SIZE)
    {   
        printf(“线性表溢出!\n”);  
        return  ERROR ;  
    }
    for( j=L->length–1; j>=i-1; --j )
        L->Elem_array[j+1]=L->Elem_array[j];/*  i-1位置以后的所有结点后移  */
    L->Elem_array[i-1]=e;    /*  在i-1位置插入结点  */
    L->length++ ;
    return  OK ;  
}

3 顺序线性表的删除(Einsert=(n-1)/2,平均时间复杂度为O(n))
/*
(1) 将线性表L中的第i+1个至第n个结点依此向前移动一个位置。
(2) 线性表长度减1。
*/

ElemType  Delete_SqList(Sqlist *L,int i)
{ 
    int  k ;  
    ElemType  x ;
    if(L->length==0)
    { 
        printf(“线性表L为空!\n”); 
        return ERROR;  
    } 
    if(i<1||i>L->length) 
    { 
        printf(“要删除的数据元素不存在!\n”) ; 
        return ERROR ;
    }
    x=L->Elem_array[i-1] ;   /*保存结点的值*/
    for(k=i; k<L->length; k++) 
        L->Elem_array[k-1]=L->Elem_array[k];/*  i位置以后的所有结点前移  */         
    L->length--;  
    return (x);
} 

4 顺序线性表的查找定位删除---实现步骤(Ecompare=(n+1)/2,Edelete=(n-1)/2,平均时间复杂度:Ecompare+Edelete=n ,即为O(n) )
/*
(1) 在线性表L查找值为x的第一个数据元素。
(2) 将从找到的位置至最后一个结点依次向前移动一个位置。
(3) 线性表长度减1。
*/

Status  Locate_Delete_SqList(Sqlist *L,ElemType x)/*  删除线性表L中值为x的第一个结点  */
{  
    int  i=0 , k ; 
    while(i<L->length)      /*查找值为x的第一个结点*/
    {   
        if(L->Elem_array[i]!=x ) 
            i++ ; 
        else  
       {  
            for ( k=i+1; k< L->length; k++)
               L->Elem_array[k-1]=L->Elem_array[k]; 
            L->length--;  break ; 
       }
    }
    if  (i>L->length)
    {  
        printf(“要删除的数据元素不存在!\n”) ; 
        return ERROR ;
    }
    return  OK;    
} 

 

 

 

 

 

动态数组:

typedef struct
{
        ElemType *elem;     //存储空间基址
        int length;                //当前长度
        int listsize;               //当前分配的存储容量(以sizeof(ElemType )为单位)
}SqList;

创建顺序表(数组):

status Init(SqList &l){
    l.elem=(ElemType *)malloc(初始长度*sizeof(ElemType ));
    if(!l.elem) exit(0);
    l.length=0;
    l.listsize=初始长度;
    return ok;          
}  

插入:

status insertlist(SqList *L,int i,ElemType e)   //第i的位置插入元素
{
    if(i<1||i>L.length+1)                    //下表为0的作为哨兵,不放数据。判断i是否合法
        return error;
    if(L.length>=L.listsize)             //存储空间已满,增加分配空间
    {
        newbase=(ElemType *)realloc(L.elem,(L.listsize+增量)*sizeof(ElemType ));//L.elem原指针的位置
        if(!newbase)                              //存储分配失败
            exit(0);
        L.elem=newbase;                           //新基址
        L.listsize+=增量;                          //增加存储容量
    }
    q=&(L.elem[i-1]);                        //p插入的位置
    for(p=&(L.elem[length-1]);p>=q;--p)
    *(p+1)=*p;                             //指针移动
    *q=e;                                  //插入元素
    ++L.length;                            //表长加一
    return ok;
}   

删除:

status deletlist(SqList *L,int i,ElemType e)
{
  if(i<1||i>L.length)                    //下判断i是否合法
    return error;
    p=&(L.elem[i-1]);                        //删除元素的位置
    e=*p;                     //删除元素的值
  q=L.elem+L.elem+Llength-1;               //表尾的位置
  for(++p;p<=q;++p)
    *(p-1)=*p;                //元素左移
  --L.length;                              //表长减一
  return ok;
}

 

posted @ 2014-09-22 11:45  肉球  阅读(596)  评论(0编辑  收藏  举报