顺序表(C)

忘了最基础的一种线性表了,那就是数组,今天来谈谈顺序表,先谈谈用C语言实现

顺序表基础:

结构体:

//首先创建一个结构体,用来实现对于数组的用法
typedef struct Arr{
  int* pBase;//整个数组的首地址
  int len;//所创建数组的长度
  int cen;//目前数组中有效个数
}Arr;;

顺序表的创建

void init_shuzu(Arr* array,int length){//创建一个数组只需要两个参数就是主函数已创建好的数组和创建数组的长度
  array->pBase = (int*)malloc(sizeof(int)*length);//给结构体中的基地址动态开辟内存空间
  if(array->pBase == NULL){//这是分配失败的情况
    printf("内存分配失败\n");
    exit(-1);
  }
  else{//开辟成功以后就进行了初始化,也就是一开始的有效个数为0,但是长度却已经确定
    array->len = length;
    array->cen = 0;
  }
  return;
}

顺序表的判空

int is_empty(Arr* array){//创建一个函数用来实现对于数组的判空
  if(array->cen == 0)
  return 1;//说明数组就是为空
  else
  return 0;//说明数组不是空,说明数组的有效个数为不为0
}

顺序表的判满

int is_full(Arr* array){//创建一个函数用来实现对于数组是否为满
  if(array->cen == array->len)
  return 1;//说明数组已经满了
  else
  return 0;//说明数组还没有满
}

顺序表的“根据位置查找元素”

void get_arr(Arr* array,int pos){//第二个参数就是实现对于查询元素的位置条件
  if(is_empty(array)){
    printf("数组为空,查询失败\n");
    return ;//如果数组为空就不可以查询
  }

  if(pos < 1 || pos > array->cen){
    printf("输入的位置不满足情况,请重新调用函数\n");
  return ;//如果位置不对就会返回
}
  printf("你所查询的第%d个元素为:%d\n",pos,array->pBase[pos-1]);
}

顺序表的“根据位置删除元素”

void delete_arr(Arr* array,int pos){//创建一个函数实现元素的删除
  int* val;
  if(is_empty(array)){
    printf("该数组为空,无法进行删除\n");
    return;
  }
  if(pos < 1 || pos > array->cen){
    printf("删除的元素位置有问题,删除失败\n");
    return;
  }
  *val = array->pBase[pos - 1];
  for(int i = pos; i < array->cen; ++i){//循环的初值为第一个要删除的元素也就是pos = i,因为
    //pBase[i]=pBase+i,以4为例子删除第四个时,这时的i为4时就是指向的是第五个元素
    //将第五个元素给了第四个,也就是将i给了i-1,也就是下面这一句,结束条件就是最后一个元素达不到,
    //也就是cen这个不满足,即最后为cen
    array->pBase[i - 1] = array->pBase[i];
  }
  array->cen--;//在删除以后还要进行有效个数的减1
  printf("删除成功,删除的元素为:%d\n",*val);
  return;
}

顺序表的“打印元素”

void show_arr(Arr* array){
  if(is_empty(array)){
    printf("该数组为空,无法进行输出\n");
    return;
  }
  for(int i = 0; i < array->cen; i++){//就是简单的遍历输出
    printf("%d\t",array->pBase[i]);
  }
  printf("\n");
  return;
}

顺序表的“尾部添加元素”

void append_arr(Arr* array,int val){
  //先要判断是否为满,如果是满就不能进行追加
  if(is_full(array)){
    printf("数组满了,不可以换进行追加\n");
    return;
  }
  array->pBase[array->cen] = val;
  array->cen++;
  return;
}

顺序表的“位置插入元素”

void insert_arr(Arr* array,int pos,int val){//第二个参数就是位置,第三个参数就是想要插入元素的内容
  if(is_full(array)){
    printf("数组满了,不可以换进行插入操作\n");
    return;
  }
  if(pos < 1 || pos > array->cen + 1){
    printf("插入的元素位置有问题,插入失败\n");
    return;
  }
  for(int i = array->cen - 1; i >= pos - 1; --i){
    array->pBase[i+1] = array->pBase[i];
  }
  array->pBase[pos-1] = val;
  array->cen++;
  printf("插入成功\n");
  return;
}

顺序表的“排序”

void sort_arr(Arr* array){
  if(is_empty(array)){
    printf("该数组为空,无法进行排序\n");
    return;
  }
  for(int i = 0; i < array->cen; i++){
    for(int j = i; j < array->cen - i - 1; j++){
      if(array->pBase[j] > array->pBase[j+1]){
        int temp = array->pBase[j];
        array->pBase[j] = array->pBase[j+1];
        array->pBase[j+1] = temp;
      }
    }
  }
}

顺序表的“倒置”

void inverson_arr(Arr* array){
  if(is_empty(array)){
    printf("该数组为空,无法进行倒置\n");
    return;
  }
  int i = 0;
  int j = array->cen - 1;
  while(i < j){
    int temp = array->pBase[i];
    array->pBase[i] = array->pBase[j];
    array->pBase[j] = temp;
    i++;
    j--;
  }
  return;
}

总结:顺序表比较简单就是关于内存与下标之间的关系运算,谢谢观看,欢迎批评指正!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
顺序表是一种线性表,它的物理存储结构是连续的。在 C 语言中,可以用数组来实现顺序表。以下是一个简单的顺序表的 C 语言实现: ```c #include <stdio.h> #define MAXSIZE 100 // 定义顺序表的最大长度 typedef struct { int data[MAXSIZE]; // 存储数据元素的数组 int length; // 当前顺序表的长度 } SeqList; // 初始化顺序表 void InitList(SeqList *L) { L->length = 0; } // 获取顺序表中指定位置的元素 int GetElem(SeqList L, int i) { if (i < 1 || i > L.length) { printf("Error: index out of range.\n"); return -1; } return L.data[i-1]; } // 在顺序表中插入元素 void ListInsert(SeqList *L, int i, int e) { int j; if (L->length == MAXSIZE) { printf("Error: list is full.\n"); return; } if (i < 1 || i > L->length+1) { printf("Error: index out of range.\n"); return; } for (j = L->length; j >= i; j--) { L->data[j] = L->data[j-1]; } L->data[i-1] = e; L->length++; } // 删除顺序表中指定位置的元素 void ListDelete(SeqList *L, int i) { int j; if (i < 1 || i > L->length) { printf("Error: index out of range.\n"); return; } for (j = i; j < L->length; j++) { L->data[j-1] = L->data[j]; } L->length--; } // 输出顺序表中的元素 void PrintList(SeqList L) { int i; for (i = 0; i < L.length; i++) { printf("%d ", L.data[i]); } printf("\n"); } int main() { SeqList L; InitList(&L); ListInsert(&L, 1, 1); ListInsert(&L, 2, 2); ListInsert(&L, 3, 3); ListInsert(&L, 4, 4); ListInsert(&L, 5, 5); PrintList(L); ListDelete(&L, 3); PrintList(L); printf("%d\n", GetElem(L, 2)); return 0; } ``` 在这个例子中,我们定义了一个结构体 `SeqList`,其中包含一个数组 `data` 和一个表示顺序表长度的变量 `length`。然后我们定义了一些操作函数来对顺序表进行初始化、插入、删除、获取元素和输出顺序表的元素。在 `main()` 函数中,我们创建了一个顺序表 `L`,并对它进行了一些操作,最后输出了结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值