其他分享
首页 > 其他分享> > 所谓“零基础”二刷数据结构--1-线性表-顺序表

所谓“零基础”二刷数据结构--1-线性表-顺序表

作者:互联网

·什么是线性表?

  先来简单的说说什么是线性表,所谓的线性表就是一种可以在任意位置插入和删除的存储结构,它是由若干个相同数据类型的线性结构。

·顺序表

  顺序表用的是一组地址连续的数据元素依次存在线性表中,所以两个元素不仅逻辑上相邻而且物理上也相邻。第1个元素存储在线性表起始位置,第i个元素和第i+1个元素紧挨着,其中i表示数据元素在线性表中的位序。需要注意的的是我们常用的数组的下标是从0开始的,而线性表中的下标是从1开始的,不要混淆。
  静态分配:数组的大小和空间是分配好的,使用时直接对数组元素操作就可以,但是一旦空间为空,也就是被占满了,再向里面插入数据就会溢出,而导致插入失败。

  动态分配:通过动态存储分配空间,空间满了后,就会分配一块更大的存储空间来存放原来的数据,但是动态分配依然是顺序存储而不是链式存储。

 ·基本操作

   ·静态分配及初始化

typedef struct{
    int data[maxsize];    
    int length; //数组长度 
}sqlist;

void Initlist(sqlist &L){
    int i;
    
    for(i = 0 ; i < maxsize ; i++){//初始化数组,清除脏数据 
        L.data[i]=0;
        L.length=0;
    }
    printf("初始化成功\n");
}

 

   ·动态分配及初始化

typedef struct{
    int *data;
    int maxsize;
    int length;
}sqlist;

void InitList(sqlist &L){
     L.data=(int *)malloc(Initsize*sizeof(int));
     L.length=0;
     L.maxsize=Initsize;
} 

   

   ·插入操作:在点i个位置插入新的元素e,如果i小于1或者大于数组长度,则插入失败;如果插入成功,从第i个元素开始(包括i)往后元素依次后移一个位置,之后把e存在原来i的位置。之后顺序表的长度+1,这就完成了插入操作。

bool ListInsert(sqlist &L,int i,int e){
    int j;
    
    if(i > L.length+1 || i < 1){//先判断i是否合法 
        return false;
    }
    if(L.length >= maxsize){
        return false;
    }
    for(j = L.length;j >= i;j--){ //从i开始,后面的元素依次后移一位 
        L.data[j] =  L.data[j-1];
    }
    L.data[i-1] = e;            //原来i的位置插入e 
    L.length ++;                //长度+1 
    printf("插入成功\n");
}

 

   ·删除操作:跟插入为逆操作,如果删除第i个元素,先判断i是否合法,如果合法就从第i+1个元素开始依次向前移动一个位置,以后顺序表的长度-1。

bool ListDelete(sqlist &L,int i){
    int j;
    
    if(i>L.length || i < 0){    //判断i是否合法 
        return false;
    }
    for(;i<L.length;i++){
        L.data[i-1]=L.data[i];  //i后面的元素依次前移一位 
    }
    L.length --;                //长度-1 
    printf("删除成功\n"); 
} 


   ·查找操作:按值查找,依次遍历各个元素,直到查到第一个元素值等于e的元素,并返回该元素的位序。

int ListFindZhi(sqlist L,int e){
    int i;
    
    for(i = 0 ;i < L.length ; i++){
        if(L.data[i] == e)     //找到等于e的元素 
            return (i+1);        //返回其下标 
        
    }    
    
} 

  

   ·排序操作:利用冒泡法对顺序表进行排序。

void ListSort(sqlist &L){    //冒泡法排序
    int i,j,temp;
    
    for(i = L.length;i > 0;  i --){
        for(j = 0;j < i-1 ; j ++){
            if(L.data[j] > L.data[j+1]){
                temp = L.data[j];
                L.data[j] = L.data[j+1];
                L.data[j+1] = temp;
            }
        }
    }
    printf("排序成功\n");
}

 

   ·删除重复元素:将一个有序数组中的重复元素删除,产生一个不含重复元素的有序数组。

bool ListQvchong(sqlist &L){     //删除重复元素 
    int left = 0,right = 1,length = 0;  //left在第1个元素,right在第2个元素,长度为0 
    
    if(L.length < 0)
        return false;
    for(; right < L.length; right++){        //每次判断right均向右移 
        if(L.data[left] != L.data[right]){  //左右值相等,left+1并让其等于right的值 
            L.data[++left] = L.data[right];  
            length ++;                         //长度+1
        }
    }
    L.length = length;
    printf("删除重复元素成功\n");
}


  顺序表的各个元素是顺序存储的,只不过顺序表的下标是从1开始,数组是从0开始,其它的增删改查操作跟数组操作类似。顺序表也算法题的一个重点,这类题实现起来比较容易且代码量少,但却拥有最优的性能,希望大家可以对顺序表有更深的理解。

 

标签:线性表,--,元素,length,二刷,int,sqlist,data
来源: https://www.cnblogs.com/zhang-a-d/p/14803772.html