【数据结构】--顺序表重点

1.顺序表的概念和结构

1.1 线性表

线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构。常见的线性表:顺序表、链表、栈、队列、字符串…

线性表在逻辑上是线性结构,也就是说是连续的一条直线。但是在物理结构上不一定是连续的。线性表在物理上存储时,通常以数组和链式结构的形式存储。
顺序表:逻辑结构是线性的,物理结构是连续的
顺序表的

2.顺序表和数组的区别

顺序表的底层结构是数组,对数组的封装实现了常用的增删改查等接口
在这里插入图片描述
顺序表功能更丰富

2.1静态顺序表:使用定长数组存储元素

数组 | 顺序表

给定长度的数组:int arr[100]----------->静态顺序表

动态设置数组长度:int* arr;------------->动态顺序表
**静态顺序表**
SeqList.h:定义顺序表的结构,顺序表要实现的接口/方法

SeqList.c具体实现顺序表里定义的接口/方法**

test.c: 测试动作:测试顺序表
静态顺序表定义
静态顺序表:给定的数组长度,若不够,会导致后续的数据保存失败。给多了,导致空间大量浪费

3. 动态顺序表的实现

3.1 定义顺序表

typedef int SListDataType;
struct SeqList*{
SLDatatype *arr;//存储数据的底层结构
int size;//记录顺序表的空间大小
int capacity;//有效数据个数
};

3.2顺序表的初始化

#include"SeqList.h"
void SqInit(SL *ps){
ps->arr=NULL;
s->size=s->capacity=0;
}

3.3顺序表的插入

插入方式
realloc:对已有空间增加空间大小。

calloc:要初始化
尾插

void SLPushBack(SL *ps,SLDataType x){
ps->arr[ps->size++]=x;
}

3.4 扩容: 空间不够,扩容

void SLCheckCapacity(SL *ps,SLDatatype x){
if(ps->size==ps-capacity){
int newcapacity=ps->capacity==0?4:2*ps->capacity;
SLDataType *tmp=(SLDataType*)realloc(ps->arr,sizeof(SLDataType)*newcapacity);
if(tmp==NULL){
printf("realloc failed!");
exit(-1);
}
//扩容成功
free(arr);
ps->arr=tmp;
ps->capacity=newcapacity;
}
}

3.5尾插

void PushBack(SL *ps,SLDataType x){
//空间足够,直接插入
ps->arr[ps->size++]=x;
}

3.6测试头插

PushBack(&s1,1);
PushBack(&s1,2);
PushBack(&s1,3);
PushBack(&s1,4);
SLPrint(&s1);

3.7尾删

在这里插入图片描述
顺序表为空-不能执行删除

顺序表不为空-删除最后一个有效数据。size–;

void PopBack(SL *ps){
assert(ps);
assert(ps->size);
//顺序表不为空
ps->size--;
}

3.8头删

顺序表为空-不执行删除操作

顺序表不为空-后面的数据往前挪动一位,size–

void PopFront(SL *ps){
assert(ps);
assert(ps->size);
for(int i=0;i<ps->size-1;i++){
ps->arr[i]=ps->arr[i+!];
ps->size--;
}
}

3.9在指定的位置之前插入数据

在这里插入图片描述

void SLInsert(SL *ps,,int pos,SLDataType x){
	assert(ps);
	SLcheackCapacity(ps);
	assert(ps>=0&&ps<=ps->size);
//pos及之后的数据往后挪一位,pos空出来
	for(int i=ps->size;i>pos;i--){
	ps->arr[i]=ps->arr[i-1];
	ps->arr[pos]=x;
ps->szie++;
}
}

3.10删除指定位置数据

void Erease(SL *ps,int pos){
assert(ps);
assert(ps->0&&ps->size);
//pos后面的数据往前挪动一位
for(int i=pos;i<ps->size-1;i++){
ps->arr[i]=ps->arr[i+1];
ps->size--;
}
}

3.11在顺序表中查找

void SLFind(SL *ps,SLDataType x){
for(int i=0;i<ps->size;i++){
if(ps->arr[i]==x){
return i;
}
}
return -1;
}

在这里插入图片描述

3.12 顺序表的销毁

在这里插入图片描述

  • 21
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值