首页 > 其他分享 >顺序表

顺序表

时间:2023-04-06 18:57:40浏览次数:27  
标签:ps 顺序 void sl dys SL size

顺序表概念和结构

顺序表用一段连续的内存空间存储数据的结构

指针dys指向动态开辟的空间, capacity记录容量, size记录数据个数

 

顺序表的实现

SeqList.h

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

typedef int SLDataType;
typedef struct SeqList
{
	SLDataType* dys;
	int capacity; // 容量
	int size; // 数据个数
}SL;

// 初始化
void SLInit(SL* ps);
// 销毁
void SLDestroy(SL* ps);
// 打印
void SLPrint(SL* ps);
// 尾插
void SLPushBack(SL* ps, SLDataType data);
// 尾删
void SLPopBack(SL* ps);
// 头插
void SLPushFront(SL* ps, SLDataType data);
// 头删
void SLPopFront(SL* ps);
// 查找
int SLFind(SL* ps, SLDataType x);
// pos位置插入数据
void SLInsert(SL* ps, int pos, SLDataType x);
// pos位置删除数据
void SLErase(SL* ps, int pos);

 

SeqList.c

#include "SeqList.h"
// 初始化
void SLInit(SL* ps)
{
	assert(ps);
	SLDataType* tmp = (SLDataType*)malloc(sizeof(SLDataType) * 5);
	if (NULL == tmp)
	{
		perror("SLInit::malloc");
		return;
	}
	ps->dys = tmp;
	ps->capacity = 5;
	ps->size = 0;
}
// 销毁
void SLDestroy(SL* ps)
{
	assert(ps);
	free(ps->dys);
	ps->dys = NULL;
	ps->capacity = 0;
	ps->size = 0;
}
// 打印
void SLPrint(SL* ps)
{
	assert(ps);
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->dys[i]);
	}
	printf("\n");
}
// 检查容量
void CheckCapacity(SL* ps)
{
	assert(ps);
	if (ps->size == ps->capacity)
	{
		SLDataType* tmp = (SLDataType*)realloc(ps->dys, sizeof(SLDataType) * ps->capacity * 2);
		if (NULL == tmp)
		{
			perror("CheckCapacity::realloc");
			return;
		}
		ps->dys = tmp;
		ps->capacity *= 2;
	}
}
// 尾插
void SLPushBack(SL* ps, SLDataType data)
{
	assert(ps);
	CheckCapacity(ps);
	ps->dys[ps->size] = data;
	ps->size++;
}
// 尾删
void SLPopBack(SL* ps)
{
	assert(ps);
	// 如果数据个数为0,不能再删除
	assert(ps->size);
	ps->size--;
}
// 头插
void SLPushFront(SL* ps, SLDataType data)
{
	assert(ps);
	CheckCapacity(ps);
	int sz = ps->size;
	while (sz)
	{
		ps->dys[sz] = ps->dys[sz - 1];
		sz--;
	}
	ps->dys[0] = data;
	ps->size++;
}
// 头删
void SLPopFront(SL* ps)
{
	assert(ps);
	assert(ps->size);
	int begin = 1;
	while (begin < ps->size)
	{
		ps->dys[begin - 1] = ps->dys[begin];
		begin++;
	}
	ps->size--;
}
// 查找
int SLFind(SL* ps, SLDataType x)
{
	assert(ps);
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		if (ps->dys[i] == x)
		{
			return i;
		}
	}
	return -1;
}
// pos位置插入数据
void SLInsert(SL* ps, int pos, SLDataType data)
{
	assert(ps);
	assert(pos >= 0 && pos <= ps->size);
	CheckCapacity(ps);
	int end = ps->size - 1;
	while (end >= pos)
	{
		ps->dys[end + 1] = ps->dys[end];
		end--;
	}
	ps->dys[pos] = data;
	ps->size++;
}
// pos位置删除数据
void SLErase(SL* ps, int pos)
{
	assert(ps);
	assert(ps->size);
	assert(pos >= 0 && pos < ps->size);
	int begin = pos;
	int end = ps->size - 1;
	while (begin < end)
	{
		ps->dys[begin] = ps->dys[begin + 1];
		begin++;
	}
	ps->size--;
}

 

test.c

#include "SeqList.h"
void t1()
{
	// 测试初始化, 销毁
	SL sl;
	SLInit(&sl);
	SLDestroy(&sl);
}
void t2()
{
	// 测试打印,尾插,尾删
	SL sl;
	SLInit(&sl);
	SLPushBack(&sl, 1);
	SLPushBack(&sl, 2);
	/*SLPushBack(&sl, 3);
	SLPushBack(&sl, 4);
	SLPushBack(&sl, 5);
	SLPushBack(&sl, 6);*/
	SLPopBack(&sl);
	SLPopBack(&sl);
	SLPopBack(&sl);
	SLPrint(&sl);
}
void t3()
{
	// 测试头插, 头删
	SL sl;
	SLInit(&sl);
	SLPushBack(&sl, 1);
	SLPushBack(&sl, 2);
	SLPushFront(&sl, 3);
	SLPushFront(&sl, 4);
	SLPushFront(&sl, 5);
	SLPopFront(&sl);
	SLPrint(&sl);
}
void t4()
{
	// 测试查找,pos插入,删除
	SL sl;
	SLInit(&sl);
	SLPushBack(&sl, 1);
	SLPushBack(&sl, 2);
	SLPushBack(&sl, 3);
	SLPushBack(&sl, 4);
	SLPushBack(&sl, 5);
	/*SLInsert(&sl, 0, 6);
	SLInsert(&sl, 6, 7);
	SLInsert(&sl, SLFind(&sl,3), 8);
	SLPrint(&sl);*/
	SLErase(&sl, SLFind(&sl, 3));
	SLPrint(&sl);
}
int main()
{
	//t1();
	//t2();
	//t3();
	t4();
}

 

标签:ps,顺序,void,sl,dys,SL,size
From: https://www.cnblogs.com/xumu11291/p/17293780.html

相关文章

  • C# List按照自定义的顺序去排序
    有没有遇到过产品经理说表格输出排序要按照指定的人员列表去排序?经过一番研究搜查发现一个方法可以实现话不多说上例子 publicclassUserInfo{publicstringName{get;set;}publicstringInfo{get;set;}} List<UserInfo>userInfos=newList<Use......
  • 图解 SQL 执行顺序,通俗易懂!
    ​这是一条标准的查询语句:这是我们实际上SQL执行顺序:我们先执行from,join来确定表之间的连接关系,得到初步的数据where对数据进行普通的初步的筛选groupby分组各组分别执行having中的普通筛选或者聚合函数筛选。然后把再根据我们要的数据进行select,可以是普通字段查询也......
  • Disjoint-Set-Union Sum (诈骗题)(区间DP, 位置顺序!!!!)
    题目大意: 给出一个序列P,n个点每次可以选择2个相邻区间进行合并,会产生一个贡献值,当然合并n-1就合并完了,问在所有的情况下,贡献和是多少  思路:易错点:这个所有情况,你枚举的合并的那个先后顺序是有关系的!!!因此直接去区间dp只能把各个合并的情况给弄......
  • 使用Async和Await可以实现多任务顺序执行且不阻塞
    使用Async和Await可以实现多任务顺序执行且不阻塞//////////////////////对于async和await的使用方式、作用效果不怎么理解?没关系,初步看这篇就够了 结论同步还是异步,区别如下:同步:你使用 await 修饰符去调用一个异步(async)方法(是异步方法,不过是阻塞式的,可简单理解为同......
  • 【Spring原理分析-Aware接口&InitializingBean&初始化与销毁执行顺序】
    一、Aware接口&InitializingBean1、基础准备2、总结3、补充:EmbeddedValueResolverAware二、@Autowired和@PostConstruct注解失效1、基础准备2、失效情形3、失效原因4、使用Aware接口避免失效5、总结补充总结一、Aware接口&InitializingBean1、基础准备①编写MyBean实......
  • java——spring boot集成kafka——kafka线上问题优化——如何做到顺序消费
          ......
  • Java实现新建三个线程,每个线程顺序打印5个数字,打印到100
    方法一:synchronized+wait+notify//三个线程循环打印数字,每个打印5个,打印数字到numclassWaitNotifyABC{  privatevolatileintnum=0;//线程共享变量  /**Object和this都可以对同步代码块加锁,但是this锁的是类的实例,如果该实例被他人拿走,  则本线......
  • HTML + javascript implement a draggable list 一个可以拖拽交换顺序的列表
    Reference:https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dragover_event<body><styletype="text/css">.draggable{text-align:center;background:red;width:20px;......
  • 华为OD机试 翻转单词顺序
    本期题目:翻转单词顺序题目输入一个英文文章片段翻转指定区间的单词顺序,标点符号和普通字母一样处理例如输入字符串 Iamadeveloper. 区间[0,3]则输出 developer.aamI输入使用换行隔开三个参数第一个参数为英文文章内容即英文字符串第二个参数为反转起始单词下标,下......
  • 阶段小结:批量删除的时候使用 this.id的详解、jquery里面的$(this)和this的区别、面试
    this.id指的是当前对象的id比如我点击了button那么此button按钮的id就可以用this.id文章目录this.id指的是当前对象的id比如我点击了button那么此button按钮的id就可以用this.id我们先看项目里面方式1:利用样式,可以隐藏,但是不推荐方式二主角this.id方式:给点击删除的时候......