当前位置: 首页 > news >正文

顺序表的使用

SeqList.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int SLDatatype;//动态顺序表
typedef struct SeqList {SLDatatype* arr;int size;//有效数据个数int capacity;//空间容量
}SL;//将类型struct SeqList改为SL//顺序表的初始化
void SLInit(SL* s);//顺序表的销毁
void SLDestroy(SL* s);//增容
void SLCheckCapacity(SL* s);//顺序表的插入
void SLPushBack(SL* s, SLDatatype x);//尾插
void SLPushFront(SL* s, SLDatatype x);//头插//指定位置之前插入/删除数据
void SLInsert(SL* s, int pos, SLDatatype x);
void SLErase(SL* s, int pos);//删除//查找数据位置
int SLFind(SL* s, SLDatatype x);//顺序表插入数据的删除
void SLPopBack(SL* s);//删除尾部的数据
void SLPopFront(SL* s);//删除头部的数据//打印
void SLPrint(SL s);

SeqList.c


#include "SeqList.h"//初始化,接收的是地址
void SLInit(SL* s) {s->arr = NULL;s->size = 0;s->capacity = 0;
}//增容
void SLCheckCapacity(SL* s) {int NewCapacity = s->capacity == 0 ? 4 : 2 * s->capacity;//判断capacity是否为0,不为0就扩大2倍SLDatatype* tmp = (SLDatatype*)realloc(s->arr, NewCapacity * sizeof(SLDatatype));//空间增容//realloc有可能申请失败 if (tmp == NULL) {perror("realloc:");exit(1);//终止程序}//申请成功s->arr = tmp;s->capacity = NewCapacity;
}//销毁
void SLDestroy(SL* s) {if (s->arr) {free(s->arr);}s->arr = NULL;s->size = 0;s->capacity = 0;
}//尾插
void SLPushBack(SL* s, SLDatatype x) {assert(s);//判断指针有效性if (s->size == s->capacity) {//给空间增容SLCheckCapacity(s);}s->arr[s->size++] = x;//插入之后size要加1
}//头插
void SLPushFront(SL* s, SLDatatype x) {assert(s);//判断指针有效性if (s->size == s->capacity) {//给空间增容SLCheckCapacity(s);}/*int NewSize = s->size;while (NewSize) {s->arr[NewSize] = s->arr[NewSize - 1];NewSize--;}*/for (int i = s->size; i > 0; i--) {s->arr[i] = s->arr[i - 1];}s->arr[0] = x;s->size++;
}//打印
void SLPrint(SL s) {for (int i = 0; i < s.size; i++) {printf("%d ", s.arr[i]);}printf("\n");
}//尾删
void SLPopBack(SL* s) {assert(s);assert(s->size);s->size--;//减掉一位
}//头删
void SLPopFront(SL* s) {assert(s);assert(s->size);for (int i = 0; i < s->size - 1; i++) {s->arr[i] = s->arr[i + 1];}s->size--;
}//指定位置之前插入
void SLInsert(SL* s, int pos, SLDatatype x) {assert(s);//位置超出容量范围则终止程序if (pos > (s->capacity) || pos < 0)exit(1);//容量不够则增容if (s->capacity == s->size) {SLCheckCapacity(s);}for (int i = s->size; i > pos; i--) {s->arr[i] = s->arr[i - 1];}s->arr[pos] = x;s->size++;
}//删除指定位置的数据
void SLErase(SL* s, int pos) {assert(s);if (pos > (s->capacity) || pos < 0)exit(1);for (int i = pos; i < s->size; i++) {s->arr[i] = s->arr[i + 1];}s->size--;
}//查找数据的位置
int SLFind(SL* s, SLDatatype x) {assert(s);for (int i = 0; i < s->size; i++) {if (s->arr[i] == x) {return i;}}return 0;
}

Test.c


#include "SeqList.h"void Test01() {//SL s1;//SLInit(&s1);//SLPushBack(&s1, 4);//SLPushBack(&s1, 2);//SLPushBack(&s1, 8);//SLPushBack(&s1, 3);//SLPushBack(&s1, 7);//SLPrint(s1);///*SLPopFront(&s1);//SLPrint(s1);//SLPopFront(&s1);//SLPrint(s1);//SLPopBack(&s1);//SLPrint(s1);//SLPopBack(&s1);//SLPrint(s1);*///SLInsert(&s1, 3, 6);//SLPrint(s1);//SLErase(&s1, 0);//SLPrint(s1);//int position = SLFind(&s1, 6);//printf("%d", position);SL s;SLInit(&s);SLPushBack(&s, 5);SLPushBack(&s, 2);SLPushBack(&s, 8);SLPushBack(&s, 10);SLPushBack(&s, 22);SLPrint(s);SLPopBack(&s);SLPrint(s);SLPushFront(&s, 66);SLPrint(s);SLInsert(&s, 3, 77);SLPrint(s);
}int main() {Test01();return 0;
}


http://www.mrgr.cn/news/43115.html

相关文章:

  • Kafka与RabbitMQ:消息队列系统的两大巨头
  • 一“填”到底:深入理解Flood Fill算法
  • GitHub入门与实践
  • Linux学习笔记(七):磁盘的挂载与扩展
  • js中map属性
  • 博世IPB - 集成动力制动系统 - One Box集大成者 - 高度自动化驾驶的模块化扩展套件
  • for和while都是循环,他们有什么差异呢?我们在使用过程中如何做选择呢?
  • 带环链表找入环结点及结论证明
  • 【C++】C++对象初探及友元
  • 国内的无人机行业的现状和前景分析
  • 基于springboot的校园物流管理系统(含源码+sql+视频导入教程)
  • 蓝牙定位的MATLAB仿真程序(基于信号强度,平面内的定位,四个蓝牙基站)
  • ThreadLocal底层原理及数据结构详解
  • 华为OD机试 - 垃圾短信识别(Python/JS/C/C++ 2024 E卷 100分)
  • 【AIGC】2021-arXiv-LoRA:大型语言模型的低秩自适应
  • SQLITE 构建多表查询
  • 【源码+文档】基于SpringBoot+Vue的酒店管理系统
  • 负载均衡可以在网络模型的哪一层?
  • 04:(寄存器开发)使用外部中断按键控制LED
  • Lucene最新最全面试题及参考答案