线性表之顺序存储

顺序表

顺序表的定义

顾名思义是逻辑结构中的线性结构在物理存储中使用顺序存储

顺序表在抽象数据类型中的定义

  1. 初始化
  2. 头插法
  3. 尾插法
  4. 头删法
  5. 尾删法
  6. 指定插入
  7. 指定删除
  8. 查找
  9. 修改
  10. 销毁

物理存储实现

  • 初始化
void SqListInit(SL* ps)//初始化
{
	ps->a = NULL;
	ps->size = 0;
	ps->rongliang = 0;
}
  • 头插法
void ZengRong(SL* ps)//动态分配空间
{
	if (ps->size == ps->rongliang)
	{
		int newrongliang = ps->rongliang == 0 ? 4 : ps->rongliang * 2;
		emtype* p = (emtype*)realloc(ps->a, newrongliang * 2 * sizeof(emtype));
		if (p == NULL)
		{
			printf("扩容失败!");
			exit(-1);
		}
		else
		{
			ps->a = p;
			ps->rongliang = newrongliang;
		}
	}
}
void SqListPushFront(SL* ps, emtype x)//头插法
{
	ZengRong(ps);
	int end = ps->size - 1;
	while (end >= 0)
	{
		ps->a[end + 1] = ps->a[end];
		--end;
	}
	ps->a[0] = x;
	ps->size++;
}
  • 尾插法
void ZengRong(SL* ps)//动态分配空间
{
	if (ps->size == ps->rongliang)
	{
		int newrongliang = ps->rongliang == 0 ? 4 : ps->rongliang * 2;
		emtype* p = (emtype*)realloc(ps->a, newrongliang * 2 * sizeof(emtype));
		if (p == NULL)
		{
			printf("扩容失败!");
			exit(-1);
		}
		else
		{
			ps->a = p;
			ps->rongliang = newrongliang;
		}
	}
}
void SqListPushBack(SL* ps, emtype x)//尾插法
{
	ps->a[ps->size] = x;
	ps->size++;
	ZengRong(ps);
	ps->a[ps->size] = x;
	ps->size++;
}
  • 头删法
void SqListPopFront(SL* ps, emtype x)//头删法
{
	assert(ps->size > 0);
	int start = 1;
	while (start < ps->size)
	{
		ps->a[start - 1] = ps->a[start];
		++start;
	}
	ps->size--;
}
  • 尾删法
void SqListPopBack(SL* ps, emtype x)//尾删法
{
	assert(ps->size > 0);
	ps->size--;
}
  • 指定插入
void ZengRong(SL* ps)//动态分配空间
{
	if (ps->size == ps->rongliang)
	{
		int newrongliang = ps->rongliang == 0 ? 4 : ps->rongliang * 2;
		emtype* p = (emtype*)realloc(ps->a, newrongliang * 2 * sizeof(emtype));
		if (p == NULL)
		{
			printf("扩容失败!");
			exit(-1);
		}
		else
		{
			ps->a = p;
			ps->rongliang = newrongliang;
		}
	}
}
void SqListInsert(SL* ps, int i, emtype x)//指定插入
{
	assert(i<ps->size);
	ZengRong(ps);
	int end = ps->size - 1;
	while (end >= i)
	{
		ps->a[end + 1] = ps->a[end];
		--end;
	}
	ps->a[i] = x;
	ps->size++;
}
  • 指定删除
void SqListDelete(SL* ps, int i)//删除元素	
{
	assert(i < ps->size);
	int start = i + 1;
	while (start < ps->size)
	{
		ps->a[start - 1] = ps->a[start];
		++start;
	}
}
  • 查找
int SqListFind(SL* ps, emtype x)//查找元素
{
	for (int i = 0; i < ps->size; ++i)
	{
		if (ps->a[i] == x)
		{
			return i;
		}
	}
	return -1;
}
  • 修改
int SqListModity(SL* ps, int i,emtype x)//修改元素
{
	assert(i < ps->size);
	ps->a[i] = x;
	return 0;
}
  • 销毁
int SqListDestory(SL* ps)//销毁线性表
{
	free(ps->a);
	ps->a = NULL;
	ps->rongliang = ps->size = 0;
	return 0;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值