顺序表--初学数据结构的同学看过来,有视频讲解哦!

顺序表

1.概念

顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中

2.数据结构

typedef int ElemType;

//顺序表的数据结构
typedef struct SeqList
{
	ElemType* ptr;
	int index;
	int capacity;
}SeqList;

3.顺序表的初始化

//顺序表的初始化
void InitSeqList(SeqList* list)
{
	if (NULL == list) { return; }
	list->ptr = (ElemType*)malloc(sizeof(ElemType) * 4);
	if (list->ptr == NULL) { exit(-1); }
	memset(list->ptr, 0, sizeof(ElemType) * 4);
	list->index = 0;
	list->capacity = 4;
}

4.顺序表的扩容

//顺序表扩容
void ExtendCapacity(SeqList* list)
{
	if (NULL == list) { return; }
	ElemType* p = list->ptr;  //防止内存泄漏
	list->ptr = (ElemType*)realloc(list->ptr, list->capacity * 1.5 * sizeof(ElemType));
	if (list->ptr == NULL)
	{
		free(p);
		exit(-1);
	}
	p = NULL;
	list->capacity *= 1.5; //了解为什么1.5倍扩容
}
5.顺序表的插入
//在指定位置插入一个数据
bool Insert(SeqList* list, int pos, ElemType elem)
{
	if (NULL == list) { return false; }
	//插入的时候,容量够不够
	if (list->index + 1 > list->capacity)
	{
		ExtendCapacity(list);
	}
	//插入的位置正确不正确
	if (pos > list->index)
	{
		return false;
	}
	// 0 1 2   3
	for (int i = list->index ; i > pos; i--)
	{
		list->ptr[i] = list->ptr[i - 1];
	}
	list->ptr[pos] = elem;
	list->index++;
}

//在头部插入
bool PushFront(SeqList* list, ElemType elem)
{
	return Insert(list, 0, elem);
}
//在尾部插入
bool PushBack(SeqList* list, ElemType elem)
{
	return Insert(list, list->index, elem);
}

6.顺序表的查找

//顺序表的查找
int FindValue(SeqList* list, ElemType elem)
{
	if (NULL == list) { return -1; }
	int pos = 0;
	for (; pos < list->index&&list->ptr[pos]!=elem; pos++);
	return pos == list->index?-1:pos;
}

7.顺序表的删除

//顺序表的删除
bool Delete(SeqList* list, int pos)
{
	if (NULL == list) { return false; }
    //判断删除的位置正不正确
	if (pos >= list->index&& pos<0) { return false; } 
	for (int i = pos; i < list->index-1; i++)
	{
		list->ptr[i] = list->ptr[i+1];
	}
	list->index--;
}

//删除某个特定的值
bool DeleteValue(SeqList* list, ElemType elem)
{
	if (NULL == list) { return -1; }
	int pos = FindValue(list, elem);
	if (pos != -1)
	{
		Delete(list, pos);
		return true;
	}
	return false;
}

8.顺序表的修改

//顺序表的修改
bool Alter(SeqList* list, int pos, ElemType elem)
{
	if (NULL == list) { return -1; }
	if (pos >= list->index && pos < 0) { return false; }
	list->ptr[pos] = elem;
	return true;
}

9.打印顺序表

//打印顺序表
void Print(SeqList* list)
{
	if (NULL == list) { return ; }
	for (int i = 0; i < list->index; i++)
	{
		printf("%d  ", list->ptr[i]);
	}
	printf("\n");
}

10.销毁顺序表

void Destory(SeqList* list)
{
	if (NULL == list) { return; }
	if (list->ptr != NULL)
	{
		free(list->ptr);
		list->ptr = NULL;
	}
	list->index = 0;
	list->capacity = 0;
}

11.清除顺序表

//清除顺序表
void Clear(SeqList* list)
{
	if (NULL == list) { return; }
	list->index = 0;
}

一起学习,一起成长。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_Yi_Xiao

来瓶可乐

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

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

打赏作者

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

抵扣说明:

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

余额充值