数据结构>顺序表(含增删查改全部代码),动态顺序表,静态顺序表

顺序表是用一段物理地址连续的储存单元依次储存数据元素的线性结构, 一般采用数组储存。在数组上完成增删查改。分为静态顺序表与动态顺序表。
动态顺序表与静态顺序表的对比
在这里插入图片描述
结构体可以在堆上也可以在栈上,动态顺序表在堆上是因为是malloc动态开辟的,增加了_capacity成员,导致动态顺序表比静态顺序表多了扩容操作。

静态顺序表

静态顺序表的定义
#define MAX_SIZE (100)
 typedef int DataType; 
 typedef struct SeqList 
 { 
 	DataType data[MAX_SIZE]; 
 	int size; 
 }	SeqListR;
实现简要一提

初始化 InitSeqList>memset(pSeq->arry,0,sizeof(DataType)*MAX_SIZE);pSeq->size=0;
尾插 PushBack>判断是否存满,pSql->arry[pSql->size++]=k;
头插 PushFront>判断是否存满,所有元素后移,pSql->arry[0]=k;
尾删 PopBack>判断是否为空,pSql->arry[–pSql->size]=0;
头删 PopFront>判断是否为空,所有元素前移,pSql->arry[–pSql->size]=0;
查找 Find>返回下标
删除指定位置 Erase>判断是否有该位置,判断是否有元素,将该位置后的所有元素前移,pSql->arry[–pSql->size]=0;

静态顺序表实现参考https://blog.csdn.net/ego_bai/article/details/78262043

动态顺序表

使用动态开辟的数组储存

typedef struct SeqList
{
	SLDateType* arrary;//指向动态开辟的空间(堆上储存数据)
	size_t size;//有效数据个数
	size_t capacity;//容量空间的大小(空间不够则增容)
}SeqList;
动态顺序表接口的实现

1.创建初始化

void SeqList(SeqList* ps,size_t capacity);{//容量capacity
	assert(ps);       //断言
	ps->array = (SLDateType*)malloc(capacity * sizeof(SLDateType));
	assert(ps->array);
	ps->size = 0;
	ps->capacity = 3;
}

2.销毁

void SeqListDestory(SeqList* ps){
	assert(ps);
	if(ps->array){
	free(ps->array)}
	ps->arrary = NULL;
	ps->size = 0;
	ps->capacity = 0;
}

3.插入(任意位置)

void SeqListInsert(SeqList* ps, size_t pos, SLDateType x)  //pos为插入位置下标{
	for(i = ps->size; i>=pos; i--) {     //将pos位置后的数据搬移到后一个位置
		ps->array[i] = ps->array[i-1];
	}
	ps->array[pos] = x ;
	ps->size++;
}

4.删除(任意位置)

void SeqListErase(SeqList* ps, size_t pos)  //pos为删除位置下标
{
	for(i = pos-1; i<ps->size-1; i++) {     //将pos位置后的数据依次向前搬移一个位置
		ps->array[i] = ps->array[i+1];
	}
	ps->size--;
}

5.查找元素

int SeqListFind(SeqList* ps,SLDateType x){
	for(i=0; i<size; i++){
		if(ps->array[i]=x;){
			return i;   //找到元素返回下标
			}
		}
	return -1;  		//未找到返回-1
}

6.扩容

static void SeqListCapacity(SeqList* ps){
	if(ps->size<ps->capacity){    //判断是否需要扩容
		return;
	}
	int NewcCapacity = ps->capacity*2;  //扩容2倍
	SLDateType* NewArray =              //申请空间
		(SLDateType*)malloc(sizeof(SLDateType)* NewCapacity);
	assert(NewArray);                   //判断空间是否申请成功
	for(i=0 ; i<=ps->size ; i++) {       //数据搬移
		NewArray[i] = array[i] ;
	}
	ps->array = NewCapacity;
	ps->capacity = NewCapacity;
}

7.删除所有特定元素

void SeqListRemoveAll(SeqLisr* ps, SLDateType x){
	for(i=0, j=0; i<ps->size; i++){
		if(ps->array[i] != x){                //array[i]不是该元素则
			ps->array[j] = ps->array[i];  //将array[i]赋值给array[j]
			j++;                    //不是该元素j++
		}
	}
	ps->size = j;            //有效元素个数为j
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值