首页 > 其他分享 >线性表-顺序表的操作(增删查改,扩容,缩容)

线性表-顺序表的操作(增删查改,扩容,缩容)

时间:2023-08-08 20:56:05浏览次数:35  
标签:缩容 ps 线性表 int void 查改 SL data size

SeqList.h

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


typedef struct SeqList
{
	int* data;
	int size;
	int capacity;
}SL;


// 顺序表的初始化
void SeqListInit(SL* ps);

// 顺序表的遍历
void SeqListPrint(SL* ps);

// 释放空间
void SeqDestroy(SL* ps);

// 缩容
void SeqListReduce(SL* ps, int new_size);

// 扩容
void SeqListExpand(SL* ps);

// 尾插元素
void SeqListPushBack(SL* ps, int x);

// 尾删元素
void SeqListPopBack(SL* ps);

// 头插元素
void SeqListPushFront(SL* ps, int x);

// 头删元素
void SeqListPopFront(SL* ps);

// 按下标查找元素
void SeqAtIndex(SL* ps, int x);

// 按值查找元素
void SeqAtValue(SL* ps, int x);

// 按值修改元素
void SeqModifyAtValue(SL* ps, int oldx, int newx);

// 按下标修改元素
void SeqModifyAtIndex(SL* ps, int oldx, int newVal);

// 随机插入元素
void SeqListPushPos(SL* ps, int pos, int value);

// 随机删除元素
void SeqListPopPos(SL* ps, int pos);

// 清空顺序表
void SeqListClear(SL* ps);

SeqList.c

#include "SeqList.h"


// 顺序表的初始化
void SeqListInit(SL* ps)
{
	ps->data = NULL;
	ps->size = ps->capacity = 0;
}

// 顺序表的遍历
void SeqListPrint(SL* ps)
{
	for (int i = 0; i < ps->size; ++i)
	{
		printf("%d ", ps->data[i]);
	}
	putchar('\n');
}

// 扩容
void SeqListExpand(SL* ps)
{
	// 此时有两种情况,一是初始化后ps->size == ps->capacity,二是经过多种对元素的插入导致ps->size == ps->capacity
	if(ps->size == ps->capacity)
	{
		int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		int* temp = (int*)realloc(ps->data, newCapacity * sizeof(int));
		if(NULL == temp)
		{
			printf("realloc fail!\n");
			exit(-1);
		}

		ps->data = temp;
		ps->capacity = newCapacity;

		printf("扩容成功,容量为:%d\n", ps->capacity);
	}
}


// 缩容
void SeqListReduce(SL* ps, int new_size)
{
	ps->data = (int*)realloc(ps->data, new_size * sizeof(int));
	ps->capacity = new_size;
	printf("缩容成功! 容量为%d\n", ps->capacity);
}

// 尾插元素
void SeqListPushBack(SL* ps, int x)
{
	SeqListExpand(ps);
	ps->data[ps->size] = x;
	++ps->size;
}

// 尾删元素
void SeqListPopBack(SL* ps)
{
	if(ps->size)
	{
		--ps->size;
		if(ps->size * 5 < ps->capacity)
			SeqListReduce(ps, ps->size);
	}
	else
		printf("删除失败!\n");
}

// 头插元素
void SeqListPushFront(SL* ps, int x)
{
	SeqListExpand(ps);
	for (int i = ps->size - 1; i >= 0; --i)
	{
		ps->data[i+1] = ps->data[i];
	}
	ps->data[0] = x;
	++ps->size;
}

// 头删元素
void SeqListPopFront(SL* ps)
{
	if(ps->size)
	{
		for (int i = 1; i < ps->size; ++i)
		{
			ps->data[i-1] = ps->data[i];
		}
		--ps->size;
	}
	else
		printf("删除失败!\n");
}

// 按下标查找元素
void SeqAtIndex(SL* ps, int x)
{
	if(x >= ps->size || x < 0)
		printf("无效下标\n");
	else
	{
		for (int i = 0; i < ps->size; ++i)
		{
			if(ps->data[i] == ps->data[x])
				printf("找到了,下标为%d的值是%d\n", x, ps->data[i]);
		}
	}
}

// 按值查找元素
void SeqAtValue(SL* ps, int x)
{
	for (int i = 0; i < ps->size; ++i)
	{
		if(ps->data[i] == x)
		{
			printf("找到了%d\n", x);
			return;
		}
	}

	printf("没找到!\n");
}

// 按值修改元素
void SeqModifyAtValue(SL* ps, int oldx, int newx)
{
	for (int i = 0; i < ps->size; ++i)
	{
		if(ps->data[i] == oldx)
		{
			ps->data[i] = newx;
			return;
		}
	}

	printf("没有这个元素!\n");

}

// 按下标修改元素
void SeqModifyAtIndex(SL* ps, int oldx, int newVal)
{
	if(oldx >= ps->size || oldx < 0)
		printf("无效下标!\n");
	ps->data[oldx] = newVal;	
}

// 随机插入元素
void SeqListPushPos(SL* ps, int pos, int value)
{
	// 判断合法下标
	if(pos >= ps->size || pos < 0)
	{
		printf("无效下标!\n");
		return;
	}

	SeqListExpand(ps);
	for (int i = ps->size - 1; i >= pos; --i)
	{
		ps->data[i+1] = ps->data[i];
	}
	ps->data[pos] = value;
	++ps->size;
}

// 随机删除元素
void SeqListPopPos(SL* ps, int pos)
{

	// 判断合法下标
	if(pos >= ps->size || pos < 0)
	{
		printf("无效下标!\n");
		return;
	}

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

}

// 清空顺序表
void SeqListClear(SL* ps)
{
	ps->size = 0;
}

// 释放空间
void SeqDestroy(SL* ps)
{
	free(ps->data);
	ps->data = NULL;
}

main.c

#include "SeqList.h"


void SeqListTest()
{
	SL s;
	// 初始化顺序表
	SeqListInit(&s);

	for (int i = 0; i < 100; ++i)
	{
		SeqListPushBack(&s, i);
	}

	for (int i = 0; i < 100; ++i)
	{
		SeqListPopBack(&s);
	}

	// // 尾插元素
	// SeqListPushBack(&s, 1);
	// SeqListPushBack(&s, 2);
	// SeqListPushBack(&s, 3);
	// SeqListPushBack(&s, 4);
	// SeqListPushBack(&s, 5);
	// SeqListPushBack(&s, 6);
	// SeqListPushBack(&s, 7);
	
	// // 顺序表的遍历
	// SeqListPrint(&s);

	// // 尾删元素
	// SeqListPopBack(&s);
	// SeqListPopBack(&s);

	// // 顺序表的遍历
	// SeqListPrint(&s);

	// // 头插元素
	// SeqListPushFront(&s, 0);

	// // 顺序表的遍历
	// SeqListPrint(&s);

	// // 头删元素
	// SeqListPopFront(&s);

	// // 顺序表的遍历
	// SeqListPrint(&s);

	// // 按下标查找元素
	// SeqAtIndex(&s, 2);

	// // 按值查找元素
	// SeqAtValue(&s, 1);

	// // 按值修改元素
	// SeqModifyAtValue(&s, 1, 4);

	// // 顺序表的遍历
	// SeqListPrint(&s);

	// // 按下标修改元素
	// SeqModifyAtIndex(&s, 0, 5);
	
	// // 顺序表的遍历
	// SeqListPrint(&s);

	// // 随机插入元素
	// SeqListPushPos(&s, 2, 8);

	// // 顺序表的遍历
	// SeqListPrint(&s);

	// // 随机删除元素
	// SeqListPopPos(&s, 0);

	// // 顺序表的遍历
	// SeqListPrint(&s);
}


int main(void)
{

	SeqListTest();

	return 0;
}

标签:缩容,ps,线性表,int,void,查改,SL,data,size
From: https://www.cnblogs.com/bcc0729/p/17615342.html

相关文章

  • 【数据结构 | 入门】线性表与链表 (问题引入&实现&算法优化)
    ......
  • 盘点一对一源码iOS系统维持平台稳定功能(一):弹性扩缩容
    在移动互联网快速发展的时代,直播成为了一个火爆的行业,并成功进入到Android、iOS、鸿蒙系统中,人们只需具备网络与能下载直播平台的设备便可使用到一对一直播源码平台,所以几乎全世界的人们都成为了平台的用户,这就使得一对一直播源码平台的用户人数的庞大,但毕竟一对一直播源码平台是一......
  • 盘点一对一直播源码iOS系统维持平台稳定功能(一):弹性扩缩容
    在移动互联网快速发展的时代,直播成为了一个火爆的行业,并成功进入到Android、iOS、鸿蒙系统中,人们只需具备网络与能下载直播平台的设备便可使用到一对一直播源码平台,所以几乎全世界的人们都成为了平台的用户,这就使得一对一直播源码平台的用户人数的庞大,但毕竟一对一直播源码平台是......
  • 5.交互式测试客户端及滚动更新、回滚、pod扩缩容
    创建一个专用的交互式测试客户端:拉取镜像kubectlrunclient-$RANDOM--image=ikubernetes/admin-box:v1.2--restart=Never-it--rm--command--/bin/bashroot@client-12383/#在默认名称空间下的服务去访问另一个名称空间下的服务查看另一个名称空间[root@K8s-master01......
  • NET7下EFCORE的通用增删查改类
    NET7下EFCORE的通用增删查改类代码摘录自《深入浅出ASP.NETCORE》 ///<summary>///所有仓储的约定,此接口仅作为约定,用于标识他们///</summary>///<typeparamname="TEntity">传入仓储的实体模型</typeparam>///<typeparamname="TPrimaryKey&quo......
  • [数据结构笔记] 线性表
    栈栈是一种后进先出(\(\text{LastInFirstOut,LIFO}\))的线性表,顾名思义,后入栈的元素反而先出栈,其限制是只能在一端插入与删除,就像下面这样,只有一端有开口,另一端则是封死的。\[栈顶\large\begin{array}{c|c|c|c|c|c|c|c|{3}{r@{.}l|}}\hline\\text{}0&1&2&3&4&5&6......
  • 线性表的顺序存储原理及实现
    线性表是一种常见的数据结构,它是由一组相同数据类型的元素按照一定的顺序排列而成的数据集合。线性表可以使用不同的存储方式,其中一种常见的方式是顺序存储。顺序存储方式是将线性表的元素连续地存储在一片连续的内存区域中,通过使用数组实现。每个元素占用一个存储单元,通过数组的......
  • (五) MdbCluster分布式内存数据库——数据迁移架构及节点扩缩容状态图
    (五)MdbCluster分布式内存数据库——数据迁移架构及节点扩缩容状态图 上一篇:(四)MdbCluster分布式内存数据库——业务消息处理本节主要讨论在系统扩容期间的数据迁移架构及节点的状态图。我们将通过介绍这两部分,慢慢展开复杂的扩缩容流程。下图从左到右,我们增......
  • 怎样优雅地增删查改(九):按日期范围查询
    目录实现按开始日期查询按结束日期查询使用项目地址 使用数据库的创建时间作为查询依据,在Abp框架中,实体类实现ICreationAuditedObject接口,或继承CreationAuditedEntity类,使用仓储创建记录时将自动生成CreationTime。实现定义按创建日期范围查询(IDateSpanOriente......
  • 怎样优雅地增删查改(九):按日期范围查询
    目录实现按开始日期查询按结束日期查询使用项目地址使用数据库的创建时间作为查询依据,在Abp框架中,实体类实现ICreationAuditedObject接口,或继承CreationAuditedEntity类,使用仓储创建记录时将自动生成CreationTime。实现定义按创建日期范围查询(IDateSpanOrientedFilter)接口。遵......