代码改变世界

学习数据结构 -> 顺序存储结构线性表运算的实现

2012-12-25 18:11  wid  阅读(1574)  评论(1编辑  收藏  举报

学习数据结构 -> 顺序存储结构线性表运算的实现



一、 插入操作
    已知有线性表 L = ( a1, a2, a3, ..., a(i-1), ai, a(i+1), ..., an ), 现要在该线性表的第 i 元素位置上插入数据 b 使其成为:
        L = ( a1, a2, a3, ..., a(i-1), b, ai, a(i+1), ..., an )
    
    1. 实现步骤
        ①. 将线性表中的第 i 个至第 n 个数据元素全部向后移动一个位置 ;
        ②. 将数据元素 b 插入到数据元素 a(i-1) 之后 ;
        ③. 将线性表长度增加1 。
        
    2. 算法描述
        这里使用C语言中的数组表示线性表, 线性表的结点依次存放在数组中, 插入正常返回值为0, 无法插入时返回值为-1。

        /*线性表顺序存储结构插入运算算法描述*/
        int InsertList( List L, int i, elementtype x )
        {
            int k ;
            if( i < 1 || i > L.length + 1 )
                return -1 ;
            
            if( L.length >= MaxLen )
            {
                printf( "线性表益出!" ) ;
                return -1 ;
            }
            for( k = L.length; k >= i -1; k-- )
                L.elements[k+1] = L.elements[k] ;
            L.elements[i-1] = x ;
            L.length ++ ;
            return 0 ;
        }

       
    3. C语言实例描述
        在线性表第5个元素前插入数据100:

#include<stdio.h>

#define MaxLen 100

typedef struct
{
    int length ;
    int data[MaxLen] ;
}List ;

int InsertList( List *L, int i, int x )
{
    int k ;
    if( i < 1 || i > L -> length+1 )
    {
        return -1 ;
    }
    if( L -> length >= MaxLen )
    {
        printf( "线性表溢出!" ) ;
        return -1 ;
    }

    for( k = L -> length; k >= i-1; k-- )
        L -> data[k+1] = L -> data[k] ;        //结点后移
    L -> data[i-1] = x ;        //插入x
    L -> length ++ ;            //线性表长度增加1

    return 0 ;
}

int main()
{
    List L;
    int i;

    //初始化线性表
    for( i = 0; i < 10; i++ )
        L.data[i] = i ;
    L.length = 10 ;

    //执行插入操作
    InsertList( &L, 5, 100 ) ;
    for( i = 0; i < L.length; i++ )
        printf("%d ", L.data[i] );

    return 0 ;
}


    4. 时间复杂度分析
        在线性表的顺序存储结构的插入运算中, 其主要耗费的时间是在线性表中数据元素结点的移动上, 数据元素移动所需的时间取决于插入数据元素的位置, 在通常情况下我们认为线性表L中任何位置插入数据元素的概率是相等的, 即 Pi = 1/(n+1)
        
        在长度为 n 的线性表L中插入一个数据元素时, 大约要移动表中一半的元素, 所以顺序村存储的线性表L中进行插入操作的时间复杂度为 O(n) 。
        
       


二、删除操作
    已知有线性表 L = ( a1, a2, a3, ..., a(i-1), ai, a(i+1), ..., an ), 现要删除该线性表的 ai 结点, 使其成为:
        L = ( a1, a2, a3, ..., a(i-1), a(i+1), ..., an )
        
    1. 实现步骤
        1>. 在线性表L中, 从第 i + 1 个元素开始至第 n 个元素为止, 依次向前移动一个位置。
        2>. 将线性表长度减1。
        
    2. 算法描述
        成功删除时返回0, 否则返回-1。

        /*线性表顺序存储结构删除运算算法描述*/
        int DeleteItem( List L, int n )
        {
            int i ;
            if( n < 1 || n >= L.length )
                return -1 ;
                
            for( i = n-1; i < L.length; i++ )
                L.elements[i] = L.elements[i+1] ;         //结点前移
            L.length -- ;        //线性表长度减1
            
            return 0 ;
        }


    3. C语言实例描述
        删除线性表中的第5个元素:

#include<stdio.h>

#define MaxLen 100

typedef struct
{
    int length ;
    int data[MaxLen] ;
}List ;

int DeleteItem( List *L, int n)
{
    int i ;
    if( n < 1 || n > L -> length )
        return -1 ;

    for( i = n-1; i < L -> length; i++ )
        L -> data[i] = L -> data[i+1] ;         //结点前移
    L -> length -- ;        //线性表长度减1

    return 0 ;
}

int main()
{
    List L;
    int i;

    //初始化线性表
    for( i = 0; i < 10; i++ )
        L.data[i] = i ;
    L.length = 10 ;

    //执行删除操作
    DeleteItem( &L, 5 ) ;
    for( i = 0; i < L.length; i++ )
        printf("%d ", L.data[i] );

    return 0 ;
}


    4. 时间复杂度分析
        线性表顺序存储结构删除运算所耗费的时间主要体现在结点的移动上, 在通常情况下, 我们仍然认为在线性表L中删除每个元素的概率是相等的, Pi = 1/n, 在长度为 n 的线性表L中插入一个数据元素时, 同样大约要移动表中一半的元素, 所以顺序存储结构删除运算的时间复杂度也为O(n)。
        

 


三、查找操作
    已知有线性表 L = ( a1, a2, a3, ..., an ), 现要在该线性表中查找值为 x 第一次出现的结点位置。
    
    1. 实现步骤
        1>. 从线性表第一个元素起依次与值x进行比较, 当值相同时返回结点所在的位置 ;
        
    2. 算法描述
        若找到, 返回值所在的位置, 否则返回-1。

        /*线性表顺序存储结构查找运算算法描述*/
        int FindItem( List L, elementtype x )
        {
            int i ;
            for( i = 0; i < L.length; i++ )
                if( x == L.elements[i] )        //依次比较
                    return i+1 ;                //返回所在的位置

            return -1 ;        //未找到返回-1
        }

       
    3. C语言实例描述
        在线性表L中查找值为5第一次出现的位置:

#include<stdio.h>

#define MaxLen 100

typedef struct
{
    int length ;
    int data[MaxLen] ;
}List ;

int FindItem( List *L, int x )
{
    int i ;
    for( i = 0; i < L -> length; i++ )
        if( x == L -> data[i] )
            return i+1 ;

    return -1 ;
}

int main()
{
    List L;
    int i;

    //初始化线性表
    for( i = 0; i < 10; i++ )
        L.data[i] = i ;
    L.length = 10 ;

    //执行查找操作
    printf( "%d ", FindItem( &L, 5 ) ) ;

    return 0 ;
}


    4. 时间复杂度分析
        通常情况下, 我们认为被查找的值x在线性表中所在的位置的概率是相同的, 也就是说, 在随机情况下要找到一个值, 大约要比较线性表中一半的元素, 并且其该算法所用的时间主要耗费在数据的比较上, 所以其时间复杂度为 O(n) 。
        
       


对于顺序存储结构的线性表, 这里列举的是较为典型的, 并且具有代表意义的运算实现过程, 其他一些像获取表长度、置空表等较为简单的运算这里不再一一实现。

 


--------------------


wid, 2012.12.25

 

上一篇: 学习数据结构 -> 线性表 -> 线性表的介绍