【数据结构】顺序表

结构

cpp 复制代码
typedef int SLData;
const int INIT_CAPACITY = 10;
typedef struct SeqList
{
	int size;
	int capacity;
	SLData* arr;
}SL;

扩容逻辑

cpp 复制代码
void CheckCapacity(SL* ps)
{
	if (ps->size == ps->capacity)
	{
		SLData* tmp = (SLData*)realloc(ps->arr, sizeof(SL) * (ps->capacity * 2));
		if (tmp == NULL)
		{
			perror("realloc fail");
		}
		ps->arr = tmp;
		ps->capacity *= 2;
	}
}

初始化和销毁

cpp 复制代码
void SLInit(SL* ps)
{
	ps->capacity = INIT_CAPACITY;
	ps->arr = (SLData*)malloc(sizeof(SL) * (ps->capacity));
	ps->size = 0;
}
void SLDestory(SL* ps)
{
	free(ps->arr);
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}

尾插尾删

cpp 复制代码
void PushBack(SL* ps, SLData x)
{
	assert(ps != NULL);
	CheckCapacity(ps);
	ps->arr[ps->size++] = x;
}
void PopBack(SL* ps)
{
	assert(ps != NULL);
	if (ps->size == 0) return;
	ps->size--;
}

头插头删

cpp 复制代码
void PushFront(SL* ps, SLData x)
{
	assert(ps != NULL);
	CheckCapacity(ps);
	int end = ps->size - 1;
	while (end >= 0)
	{
		ps->arr[end + 1] = ps->arr[end];
		end--;
	}
	ps->arr[0] = x;
	ps->size++;
}
void PopFront(SL* ps)
{
	assert(ps != NULL);
	if (ps->size == 0) return;
	int end = 1;
	while (end != ps->size)
	{
		ps->arr[end - 1] = ps->arr[end];
		end++;
	}
	ps->size--;
}

指定位置插入删除

cpp 复制代码
void Insert(SL* ps, int pos, SLData x)
{
	assert(ps && pos < ps->size);
	CheckCapacity(ps);
	int cur = ps->size-1;
	while (cur >= pos)
	{
		ps->arr[cur + 1] = ps->arr[cur];
		cur--;
	}
	ps->arr[pos] = x;
	ps->size++;
}
void Erase(SL* ps, int pos)
{
	assert(ps != NULL && pos < ps->size);
	int cur = pos;
	while (cur <= ps->size - 2)
	{
		ps->arr[cur] = ps->arr[cur + 1];
		cur++;
	}
	ps->size--;
}

查找数据位置和打印

cpp 复制代码
int find(SL* ps, SLData x)
{
	assert(ps != NULL);
	int cur = 0;
	while (cur != ps->size)
	{
		if (ps->arr[cur] == x) return cur;
		cur++;
	}
	return -1;
}

void Print(SL* ps)
{
	assert(ps != NULL);
	int pos = 0;
	while (pos != ps->size)
	{
		printf("%d-> ", ps->arr[pos]);
		pos++;
	}
	printf("NULL\n");
}

测试用例

cpp 复制代码
void test1()
{
	SL s;
	SLInit(&s);
	PushBack(&s, 1);
	PushBack(&s, 2);
	PushBack(&s, 3);
	PushBack(&s, 4);
	PushBack(&s, 5);
	Print(&s);
	PopBack(&s);
	PopBack(&s);
	PopBack(&s);
	Print(&s);
	PushFront(&s, 1);
	PushFront(&s, 2);
	PushFront(&s, 3);
	Print(&s);
	PopFront(&s);
	PopFront(&s);
	PopFront(&s);
	PopFront(&s);
	PopFront(&s);
	PopFront(&s);
	Print(&s);
	PushFront(&s, 1);
	PushFront(&s, 2);
	PushFront(&s, 3);
	Print(&s);
	Insert(&s, 1, 999);
	Print(&s);
	Erase(&s, 1);
	Erase(&s, 1);
	Erase(&s, 1);
	Print(&s);

	printf("%d\n", find(&s, 3));
}
相关推荐
Darling噜啦啦6 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠7 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾7 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
Qres8217 天前
算法复键——树状数组
数据结构·算法
牛油果子哥q7 天前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
凌波粒7 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
WL学习笔记7 天前
单项不带头不循环链表
数据结构·链表
小糯米6017 天前
JS 数组
数据结构·算法·排序算法
小欣加油7 天前
leetcode3612 用特殊操作处理字符串I
数据结构·c++·算法·leetcode·职场和发展
凌波粒7 天前
LeetCode--90.子集II(回溯算法)
数据结构·算法·leetcode