线性表之顺序表

/*

使用C语言实现

*/

顺序表有两种实现方式

1、静态数组

#define Size 100;

typedef struct 
{
  Elemtype data[Size];
  int length;
}List;

静态数组实现的方式比较简单,涉及的问题较少,可以参考动态分配的操作过程。

2、动态分配

#define size 20
typedef int Elemtype;//元素类型 

typedef struct
{
    Elemtype *e;//数据元素 
    int length;//当前的长度
    int listsize;
}List;

以动态分配方式为例

3、操作集

  • 初始化操作
int initList( List *L )
{
    //长度已固定,可以进行修改 
    L->e = ( Elemtype* ) malloc ( size * sizeof(int) );
    L->length = 0;//当前长度为0 
    L->listsize = size;//总长度为size 
    return 0;
}

这里就涉及了C语言动态分配内存的知识,size在开头定义,其实也可以从形参传入,比较自由。

  • 插入操作
int insertList( List *L , int n , Elemtype e )
{
    //判定是否超过最大长度,也可以进行重分配 
    if( L->length >= L->listsize )
    {
        printf("超过最大长度!!!");
        return 0;
    }
    else
    {
        int i;
        
        //元素依次往后挪 
        for( i = L->length - 1 ; i >= n - 1 ; i-- )
        {
            L->e[i+1] = L->e[i];
        }
        
        L->e[n-1] = e;
        L->length++;//表长加一 
        return 1;
    }
}

这里插入和下一个删除操作都比较重要,插入操作就像是插队,一个人插队,他后面的人就自然往后退。

  • 删除操作
int deleteList( List *L , int n )
{
    //判定是否超出当前表长 
    if( n > L->length )
    {
        printf("并没有此位序的元素");
        return 0;
    }
    
    int i;
    
  //后面的元素依次往前挪
    for( i = n - 1 ; i < L->length ; i++ )
    {
        L->e[i] = L->e[i+1];
    }
    
    L->length--;//表长减一 
}

而删除操作相当于刚刚插队的人跑了,所以后面的人都要向前走一步。

  • 排序
void sort( List *L )
{//冒泡排序 
    int i,j;
    
    for( i = 0 ; i < L->length - 1 ; i++ )
    {
        for( j = 0 ; j < L->length - 1 - i ; j++ )
        {
            if( L->e[j] > L->e[j+1] )
            {
                //未采用中间变量的方法 
                L->e[j] = L->e[j] + L->e[j+1];
                L->e[j+1] = L->e[j] - L->e[j+1];
                L->e[j] = L->e[j] - L->e[j+1];
            }
        }
    }
}

排序采用的是比较常规的冒泡排序,其中变量交换的方式,如下

int a = 10;
int b = 10;
a = a + b;
b = a - b;
a = a - b;

仔细看看,这样两个就交换过来了,厉害吧!

  • 查找
int findList( List *L , Elemtype e )
{
//采用的是二分查找的方法 
    int mid,l,r;
    l = 0; //左端点 
    r = L->length - 1; //右端点
    
    
    while( l <= r )
    {
        mid = ( l + r ) / 2;
        
        if( L->e[mid] == e )
        {
            return mid + 1;
        }
        else if( L->e[mid] < e )
        {
            l = mid + 1;
        }
        else
        {
            r = mid - 1;
        }
    }
    return 0;
}
  • 打印
void printList( List *L )
{
    int i;
    for( i = 0 ; i < L->length ; i++ )
    {
        printf("%d ",L->e[i]);
    }
}

 

posted @ 2020-07-28 21:49  Rego  阅读(172)  评论(0)    收藏  举报