线性表--顺序表的增、删、查、改

线性表—>顺序表1

实现顺序表的增、删、查、改
线性表分为顺序表和链表,这篇首先写的是顺序表的一些最最最最基本的操作~~增、删、查、改

0.包含头文件

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>

//静态顺序表(大小固定,编译期间决定的)

typedef int SLDataType;

//动态顺序表(在程序运行期间可以动态控制容量的大小)
typedef struct SeqList
{
	SLDataType *array;	//指向堆上的空间,存放数据
	int capacity;		//容量
	int size;			//有效个数
}	SeqList;

创建、销毁 --顺序表

void SeqListInit(SeqList *pSeqList)//创建
{
	//期望传进来的是一个变量的地址
	//变量的地址肯定不是NULL
	assert(pSeqList != NULL);

	//开辟空间,设置容量和size
	pSeqList->capacity = 10;
	pSeqList->array = 
		(int*)malloc(sizeof(SLDataType)*pSeqList->capacity);
	//assert(pSeqList->array != NULL);
	pSeqList->size = 0;
}

void SeqListDestroy(SeqList *pSeqList)//销毁
{
	assert(pSeqList != NULL);
	assert(pSeqList->array != NULL);
	free(pSeqList->array);

	pSeqList->array = NULL;
	pSeqList->capacity = 0;
	pSeqList->size = 0;
}

1.增-头插-尾插-指定位置的插入

//尾插
void SeqListPushBack(SeqList *pSeqList,
 SLDataType value)
{
	CheckCapacity(pSeqList);
	pSeqList->array[pSeqList->size] = value;
	pSeqList->size++;
}

//头插
void SeqListPushFront(SeqList *pSeqList,
 SLDataType value)	
{
	CheckCapacity(pSeqList);
	//i 是空间的下标
	for (int i = pSeqList->size; i >= 1; --i)
	{
		pSeqList->array[i] = pSeqList->array[i-1];
	}

	pSeqList->array[0] = value;
	pSeqList->size++;
}

//根据下标pos做插入
void SeqListPopInsert(SeqList *ps, int pos,
 SLDataType value)
{
	CheckCapacity(ps);
	//pos[0,size]  i 是数据的下标
	for (int i = ps->size - 1; i >= pos; i--)
	{
		ps->array[i + 1] = ps->array[i];
	}

	ps->array[pos] = value;
	ps->size++;
}

内存扩容

注意:如果内存不够则需要扩容

//链接属性:从外部链接属性 到 内部链属性
static void CheckCapacity(SeqList *ps)
{
	//不需要扩容的情况
	if (ps->size <= ps->capacity)
	{
		return;
	}

	//需要扩容。且一般情况要扩容到2倍
	int newCapacity = ps->capacity * 2;
	SLDataType *newArray =
		(SLDataType *)malloc(sizeof(SLDataType)* newCapacity);
	assert(newArray != NULL);

	//搬家
	for (int i = 0; i < ps->size; ++i)
	{
		newArray[i] = ps->array[i];
	}

	//释放原来的空间,绑定新空间
	free(ps->array);
	ps->array = newArray;
	ps->capacity = newCapacity;
}

2.删-头删-尾删-指定位置的删除

//尾删
void SeqListPopBack(SeqList *ps)
{
	assert(ps->size > 0);
	ps->size--;
}

//头删
void SeqListPopFront(SeqList *ps)
{
	assert(ps->size > 0);
	for (int i = 0; i < ps->size - 1; i++)
	{
		ps->array[i] = ps->array[i + 1];
	}
	ps->size--;
}

//删除pos下标所对应的值
void SeqListErase(SeqList *ps, int pos)
{
	assert(ps->size > 0);
	//[0,size-1]

	for (int i = pos + 1; i < ps->size; i++)
	{
		ps->array[i - 1] = ps->array[i];
	}
	ps->size--;
}

3.查找、修改某一个元素

//查找
int SeqListSearch(const SeqList *ps,
 SLDataType value)
{
	for (int i = 0; i < ps->size; ++i)
	{
		if (ps->array[i] == value)
		{
			return i;
		}
	}
	return -1;
}

//修改 pos 下标所在的值为 value
void SeqListModify(SeqList *ps, int pos,
 SLDataType value)
{	
	assert(pos >= 0 && pos < ps->size);
	ps->array[pos] = value;
}

删除特定的元素

//删除遇到的第一个value
void SeqListRemove(SeqList *ps, SLDataType value)
{
	int pos = SeqListSearch(ps, value);
	if (pos != -1)
	{
		SeqListErase(ps, pos);
	}
}

//删除遇到的所有的value
void SeqListRemoveAll(SeqList *ps, SLDataType value)
{
	int i = 0; 
	int j = 0;
	for (; i < ps->size; ++i)
	{
		if (ps->array[i] != value)
		{
			ps->array[j] = ps->array[i];
			j++;
		}
	}
	ps->size = j;
}

顺序表中更多的详细操作:https://blog.csdn.net/qq_43763344/article/details/89236019

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿的温柔香

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值