目录
线性表(linear list)
是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。
顺序表
顺序表属于线性表,那么在逻辑上必定是线性结构的,顺序表在物理结构上也是连续的
顺序表一般使用数组来实现,在数组上完成数据的增删查改。
顺序表又可以分为
静态顺序表:使用定长数组存储
动态顺序表:使用动态开辟的数组存储
静态顺序表用的少,一般我们所说的顺序表就是指动态顺序表
顺序表优点:支持随机存储
顺序表缺点:1、动态增容有性能消耗并且有一定程度的空间浪费(用realloc进行扩容可能会开辟新的空间再把原数据拷贝过去,增容后的空间一般是原空间的1.5倍或者2倍,有时候不需要那么多空间)
2、需要往头部插入数据,因此需要挪动数据,这一过程时间复杂度为0(N)
静态顺序表:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define N 100
typedef int SLDataType;
typedef struct SeqList
{
SLDataType array[N];//定长数组
size_t size;//用来记录当前数组存储的数据数量
}SeqList;
int main()
{
SeqList sl;
sl.size = 0;
for (int i = 0; i < N; i++)
{
sl.array[i] = i;
sl.size++;
}
return 0;
}
动态顺序表
静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用。所以现实中基本都是使用动态顺序表,根据需要动态的分配空间大小,所以下面我们实现动态顺序表
首先先说明一下实现的大致思路:
第一步:创建动态顺序表
第二步:动态顺序表的初始化
第三步:动态顺序表的接口函数:增、删、查、改
第四步:动态顺序表的销毁
建立一个工程,并创建下面三个文件,其中
SeqList.h里包含了所需要的头文件,各种函数的声明,以及动态顺序表的创建 ,
SeqList.c包含了动态顺序表的接口函数的定义,
Test..c则是对各个函数的功能检测
SeqList.h文件中
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
#define N 2//第一次开辟的内存空间大小
typedef int SLDataType;//SLDataType用来定义动态顺序表所存储的数据的类型
typedef struct SeqList//动态顺序表的创建(未初始化)
{
SLDataType *pList;//指向动态开辟的空间
size_t size;//记录当前顺序表存储的数据数量
size_t capacity;//记录当前顺序表的空间大小
}SeqList;
bool CheckEmptySeqList(SeqList *SList);//检查动态顺序表是否一个数据都没存
static void SeqListAppend(SeqList *SList, SLDataType data);//增容函数
void InitSeqList(SeqList *SList);//初始化动态顺序表
void PrintSeqList(SeqList *SList);//打印动态顺序表
void PushBackSeqList(SeqList *SList, SLDataType data);//尾插增加元素
void PushHeadSeqList(SeqList *SList, SLDataType data);//头插
void InsertSeqList(SeqList *SList, SLDataType data, int pos);//在pos坐标处插入元素
void DeleteBackSeqList(SeqList *SList);//尾删
void DeleteHeadSeqList(SeqList *SList);//头删
void DeleteMiddleSeqList(SeqList *SList, int pos);//删除pos坐标所在的元素
static int findpos(SeqList *SList, SLDataType data);//查找任意位置的元素的坐标,内部函数
void FindSeqList(SeqList *SList, SLDataType data);//将查找任意位置的元素的坐标的信息输出
void ModifySeqList(SeqList *SList, SLDataType data, int pos);//修改动态顺序表中的某一个元素
void DestroySeqList(SeqList *SList);//销毁动态顺序表
//#include<stdio.h>:包含了printf()函数
//#include<stdlib.h>:包含了malloc(),realloc()
//#include<assert.h>:包含了assert()函数
//#include<stdbool.h>:包含了bool类型,true与