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

数据结构---线性表之顺序表

1.线性表的概念

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使 用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的, 线性表在物理上存储时,通常以数组和链式结构的形式存储

2.顺序表的概念

顺序表是线性表的一种:顺序表的逻辑结构是线性的,物理结构一定是线性的

1.静态顺序表

静态顺序表
#define MAXNUM 100
typedef int DateType;//顺序表可能存不同类型的数据,好修改struct Seqlist {DateType arr[MAXNUM];int size;//存入内存的有效数据个数;
}

顺序表的缺点很明显,数组的空间大小是定值,给小了存不下容易丢失数据,给大了容易浪费空间,于是就引出了动态顺序表

2.动态顺序表

typedef int DateType;typedef struct Seqlist {DateType* arr;int Capcity;//动态内存开辟的空间大小,后续我们需要用这个来判断空间够不够int size;//有效数据个数
}SL;

动态顺序表完美解决了静态顺序表空间的问题,可以扩容空间

3.动态顺序表的接口实现

SeqList.h

typedef int SLDataType;
// 顺序表的动态存储
typedef struct SeqList
{SLDataType* array;  // 指向动态开辟的数组size_t size ;       // 有效数据个数size_t capicity ;   // 容量空间的大小
}SeqList;
// 基本增删查改接口
// 顺序表初始化
void SeqListInit(SeqList* psl);
// 检查空间,如果满了,进行增容
void CheckCapacity(SeqList* psl);
// 顺序表尾插
void SeqListPushBack(SeqList* psl, SLDataType x);
// 顺序表尾删
void SeqListPopBack(SeqList* psl);
// 顺序表头插
void SeqListPushFront(SeqList* psl, SLDataType x);
// 顺序表头删
void SeqListPopFront(SeqList* psl);
// 顺序表查找
int SeqListFind(SeqList* psl, SLDataType x); 
// 顺序表在pos位置插入x
void SeqListInsert(SeqList* psl, size_t pos, SLDataType x);
// 顺序表删除pos位置的值
void SeqListErase(SeqList* psl, size_t pos);
// 顺序表销毁
void SeqListDestory(SeqList* psl);
// 顺序表打印
void SeqListPrint(SeqList* psl);

SeqList.c

// 顺序表初始化
void SeqListInit(SeqList* psl) {assert(psl);psl->array = NULL;psl->capicity = psl->size = 0;
}
// 检查空间,如果满了,进行增容
static void CheckCapacity(SeqList* psl) {if (psl->capicity == psl->size) {int NewCapacity = psl->capicity == 0 ? 4 : psl->capicity * 2;SLDataType* New = (SLDataType*)realloc(psl->array, NewCapacity * sizeof(SLDataType));if (New == NULL) {perror("realloc fail");return;}psl->array = New;}
}
// 顺序表尾插
void SeqListPushBack(SeqList* psl, SLDataType x) {assert(psl);//判断空间CheckCapacity(psl);psl->array[psl->size++] = x;
}
// 顺序表尾删
void SeqListPopBack(SeqList* psl) {assert(psl);psl->size--;
}
// 顺序表头插
void SeqListPushFront(SeqList* psl, SLDataType x) {assert(psl);CheckCapacity(psl);//挪动数据for (int i = psl->size; i > 0; i++) {psl->array[i] = psl->array[i - 1];}psl->array[0] = x;psl->size++;
}
// 顺序表头删
void SeqListPopFront(SeqList* psl) {assert(psl);assert(psl->size);for (int i = 0; i < psl->size - 1; i++) {psl->array[i] = psl->array[i + 1];}psl->size--;
}
// 顺序表查找
int SeqListFind(SeqList* psl, SLDataType x) {for (int i = 0; i < psl->size; i++) {if (psl->array[i] == x) {return i;}}return -1;
}
// 顺序表在pos位置插入x
void SeqListInsert(SeqList* psl, int pos, SLDataType x) {assert(psl);assert(pos >= 0 && pos <= psl->size);CheckCapacity(psl);if (pos == psl->size) {psl->array[pos] = x;psl->size++;return;}for (int i = psl->size; i > pos; i--) {psl->array[i] = psl->array[i - 1];}psl->array[pos] = x;psl->size++;
}
// 顺序表删除pos位置的值
void SeqListErase(SeqList* psl, int pos) {assert(psl);assert(psl->size);assert(pos >= 0 && pos < psl->size);if (pos == psl->size - 1) {psl->size--;return;}for (int i = pos; i<psl->size-1; i++) {psl->array[i] = psl->array[i + 1];}psl->size--;}
// 顺序表销毁
void SeqListDestory(SeqList* psl) {assert(psl);free(psl->array);psl->array = NULL;psl->capicity = psl->size = 0;
}// 顺序表打印
void SeqListPrint(SeqList* psl) {assert(psl);for (int i = 0; i < psl->size; i++) {printf("%d ", psl->array[i]);}printf("\n");
}


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

相关文章:

  • 9.24-k8s服务发布
  • 基于C语言开发(控制台)通讯录管理程序
  • Java之路--搞定数据类型及运算符已如探囊取物
  • golang学习笔记11-模块化与包管理【重要】
  • 32岁前端干了8年,是继续做前端开发,还是转其它工作_ui设计师转开发
  • pwd 命令:显示当前工作目录
  • 嵌入式工程师需要拥有哪些能力?
  • 第二讲 数据结构
  • 百度C++一面-面经总结
  • 制药污水处理设备流程说明介绍
  • 2024年最强网络安全学习路线,详细到直接上清华的教材!
  • 【Linux 报错】“userdel: user xxxx is currently used by process xxx”
  • 基类和派生类的赋值对象转换、派生类与基类成员的函数隐藏、派生类中的默认成员函数、继承与友元、继承与静态成员函数、菱形继承、菱形虚拟继承等的介绍
  • Java:Object操作
  • Linux Shell: 使用 Expect 自动化 SCP 和 SSH 连接的 Shell 脚本详解
  • 软件安全测评的必要性,安全测评有必要找第三方软件检测机构吗?
  • ECharts的特点
  • JMeter与大模型融合应用之JMeter菜单栏中切入大模型交互详解
  • 什么软件可以同声传译?5款高效沟通的翻译软件速速收藏
  • 低场核磁共振成像系统MRI的成像优势特点