欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数组静态分配实现线性表基本操作C/C++(插入,删除,按值按位查找)

程序员文章站 2024-03-22 19:00:34
...

数组静态分配实现线性表基本操作C/C++(插入,删除,按值按位查找)

线性表基本操作

/**
 * 数组静态分配实现线性表基本操作
 */
#include <cstdio>
#define maxsize 10
/**
 * 定义结构
 */
typedef struct {
    int data[maxsize];
    int length;
}SqList;
/**
 * 初始化
 * 思路:
 * 将所有空间初始化为0,若不初始化,可能有脏数据存在
 * 1、将所有空间数据初始化为0
 * 2、长度初始化为0
 */
int initList(SqList &L){
    for(int & i : L.data){//i表示L.data的各个元素
        i=0;              //将个元素置为0
        printf("初始化的值- %d \n",i);
    }
    L.length=0;
    printf("初始化length- %d \n",L.length);
    return 0;
}
/**
 * 在第i位置data[i-1]插入元素
 * 思路:
 * 1、校验i的合法性,L是否已满
 * 2、将i位置以及之后的位置元素后移
 * 3、给i位置赋值新元素
 * @return
 */
 bool insertList(SqList &L,int i, int value){
     //i是位置从1开始,length是长度,从1开始;
     if(i>L.length+1 || i<1){
         printf("输入i值不合法,超出范围\n");
         return false;
     }
     if(L.length >= maxsize){
         printf("空间已满,不可再插入\n");
         return false;
     }
     //从最后一个元素开始后移,最后一个元素下表l.length-1
     //j表示下标j=L.length 表示最后一个元素后一个元素的下标
     for(int j=L.length;j>=i;j--){
         L.data[j]=L.data[j-1];
     }
     L.data[i-1]=value;
     L.length ++ ;
     return true;
 }

 /**
  * 删除第i位置(data[i-1])的数据
  * 思路:
  * 1、校验i的合法性,L是否为0
  * 2、删除i位置,下标[i-1]的数据元素
  * 3、i之后所有元素前移一位
  * @return
  */
  bool delList(SqList &L, int i){
    if(L.length == 0){
        printf("L长度为0,没有可删除元素\n");
        return false;
    }
    if(i<1 || i>L.length+1){
        printf("i值不合法,超出范围\n");
        return false;
    }
    printf("删除的i位置的元素 = %d\n", L.data[i-1]);
    //j表示下标,i表示位置,i位置的下标为j-1
    //data[j]表示i位置之后一个位置的下标
    for(int j=i ; j<L.length ;j++){
        L.data[j-1]=L.data[j];
    }
     L.length--;
     printf("删除数据之后的长度 = %d\n",L.length);
     return true;

  }

  /**
   * 获取i位置的值
   * 思路:
   * 1、校验i的合法性
   * 2、返回data[i-1]
   * @return
   */
  int getElemValue(SqList &L,int i){
      if(i>L.length){
          printf("i值不合法,超出范围 \n");
          return -1;
      }else{
          return L.data[i-1];
      }

  }

/**
 * 获取值为10的元素位序
 * 思路:
 * 1、找到第一个值为10的元素,返回其下标
 * @return
 */
int getElemLocation(SqList &L,int elemValue){
    for (int i=0;i<L.length;i++){
        if(L.data[i] == elemValue){
            return i+1;
        }
    }
    return -1;
}

int main() {
    SqList L;

    //初始化
    initList(L);
    printf("---------------初始化操作结束------------ \n");

    //循环插入操作 i表示位置序号
    for (int i = 1; i <= 9; i++) {
        insertList(L,i,i);
        printf("插入的数据  下标[%d]- 值:%d\n",i-1 , L.data[i-1]);
        printf("length- %d\n",L.length);
    }
    insertList(L,3,10);
    printf("插入之后的length- %d + 插入的值- %d\n",L.length,L.data[2]);
    printf("---------------插入数据操作结束------------- \n");


    //删除位序i的值
    delList(L,9);
    printf("删除的i位序的现有值- %d   删除之后length- %d\n",L.data[9-1] ,L.length);
    printf("---------------删除数据操作结束------------- \n");

    //获取i位置的值
    int value = getElemValue(L,3);
    printf("i位置的值- %d \n",value);

    //获取值为10的下标
    int location = getElemLocation(L,10);
    printf("值为10的下标- %d \n",location);
    printf("-----------按位、按值获取数据结束------------ \n");

    printf("Hello, World!\n");
    return 0;
}

测试结果展示

初始化的值- 0
初始化的值- 0
初始化的值- 0
初始化的值- 0
初始化的值- 0
初始化的值- 0
初始化的值- 0
初始化的值- 0
初始化的值- 0
初始化的值- 0
初始化length- 0
---------------初始化操作结束------------
插入的数据  下标[0]- 值:1
length- 1
插入的数据  下标[1]- 值:2
length- 2
插入的数据  下标[2]- 值:3
length- 3
插入的数据  下标[3]- 值:4
length- 4
插入的数据  下标[4]- 值:5
length- 5
插入的数据  下标[5]- 值:6
length- 6
插入的数据  下标[6]- 值:7
length- 7
插入的数据  下标[7]- 值:8
length- 8
插入的数据  下标[8]- 值:9
length- 9
插入之后的length- 10 + 插入的值- 10
---------------插入数据操作结束-------------
删除的i位置的元素 = 8
删除数据之后的长度 = 9
删除的i位序的现有值- 9   删除之后length- 9
---------------删除数据操作结束-------------
i位置的值- 10
值为10的下标- 3
-----------按位、按值获取数据结束------------
Hello, World!

Process finished with exit code 0