1. 程式人生 > >線性表的順序存儲結構元素的獲取,插入及刪除

線性表的順序存儲結構元素的獲取,插入及刪除

數據結構 線性表 順序存儲結構

對於線性表,我們可以對其元素進行簡單的獲取,插入以及刪除操作。

先來講講元素的獲取操作,完整來講,就是對,將線性表L第i個位置的元素返回,若成功,則返回1,且將第i個位置的元素的值賦給*e;若失敗,則返回0。代碼如下:

int GetElem ( SqList L, int i, int *e ){
    
    if ( i < 1 || i > L->length || L->length == 0 )
        return 0;
        
    *e = L->data[i-1];

    return 1;
}

若是在代碼中使用宏定義則是比較好的,因為方便數據的修改,以下代碼是宏定義版:

#define Ok     1
#define ERROR  0
#define TRUE   1
#define FALSE  0

typedef int Status;

Status GetElem ( SqList L, int i, ElemType *e ){
    
    if ( i < 1 || i > L->length || L->length == 0 )
        return ERROR;
        
    *e = L->data[i-1];
    
    return OK;

}

接下來就是對元素的插入操作。在插入元素之前,我們首先要判斷插入元素的位置是否正確以及線性表的空間是否充足,若是都沒問題,那麽可以執行插入操作。記住,很重要的一點就是 ,插入一個元素後,一定要記得對線性表長度執行加1操作。代碼如下:

int ListInsert ( SqList *L, int i, int e ){
    
    int k;
    
    if ( i < 1 || i > L->length + 1 )
        return 0;
    if ( L->length >= MAXSIZE )
        return 0;
    
    if ( i <= L->length )     //若插入數據位置不在表尾
        for ( k = L->length - 1; k >= i - 1; --k )
            L->data[k+1] = L->data[k];
        
    L->data[i-1] = e;
    
    L->length++;
    
    return 1;

}

同樣的,再用宏定義的方式寫一遍代碼。代碼如下:

Status ListInsert ( SqList *L, int i, ElemType e ){

    int k;

    if ( i < 1 || i > L->length + 1 )
        return ERROR;
    if ( L->length >= MAXSIZE )
        return ERROR;
        
    if ( i <= L->length )
        for ( k = L->length - 1; k >= i - 1; --k )
            L->data[k+1] = L->data[k];
    
    L->data[i - 1] = e;
    
    L->length++;
    
    return OK;

}

最後,就是對線性表進行元素的刪除操作。刪除相應位置的元素,首先就要判斷所要刪除位置是否正確,其次就是對線性表進行判斷,表長是是否為0,若為0,則刪除出錯,若不為0,則進行相應的刪除操作。代碼如下:

int ListDelete ( SqList *L, int i, int *e ){

    int k;
    
    if ( i < 1 || i > L->length )
        return 0;
    if ( L->length == 0 )
        return 0;
     
     *e = L->data[i-1];   
    if ( i < L->length )      //如果刪除的不是最後一個位置(刪除的不是最後一個元素)
        for ( k = i; k < L->length; ++k )
            L->data[k-1] = L->data[k];
    
    L->length--;
    
    return 1;

}

刪除元素的代碼也用宏定義的方式寫一遍。代碼如下:

Status ListDelete ( SqList *L, int i, ElemType *e ){

    int k;
    
    if ( i < 1 || i > L->length )
        return ERROR;
    if ( L->length == 0 )
        return ERROR:
    
    *e = L->data[i-1];
    if ( i < L->length )
        for ( k = i; k < L->length; ++k )
            L-data[k-1] = L-data[k];
            
    L->length--;
    
    return OK;

}

很重要的一點是,一定要分清什麽是元素位置,什麽是元素下標。第i個位置的元素,它的下標是(i-1)。

那麽順序存儲結構有什麽優缺點呢?它的優點就是,存儲方式簡單,可以快速的存取表中任一位置的元素。而且,無需為其元素之間的邏輯關系而增加額外的存儲空間。

缺點就是,如果存儲元素過多,那麽在執行插入以及刪除操作時,需要移動大量的元素,這樣非常的浪費運行時間。況且,由於不知道元素的具體個數,所以很難把握數組的大小,容易造成空間的浪費。

本文出自 “梵高說我腦子有病” 博客,請務必保留此出處http://chen0547.blog.51cto.com/12489941/1965070

線性表的順序存儲結構元素的獲取,插入及刪除