【数据结构】顺序表

结构

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));
}
相关推荐
码完就睡2 小时前
数据结构——栈和队列的相互模拟
数据结构
iiiiyu2 小时前
常用API(SimpleDateFormat类 & Calendar类 & JDK8日期 时间 日期时间 & JDK8日期(时区) )
java·大数据·开发语言·数据结构·编程语言
故事和你912 小时前
洛谷-数据结构1-4-图的基本应用2
开发语言·数据结构·算法·深度优先·动态规划·图论
꧁细听勿语情꧂3 小时前
数据结构概念和算法、时间复杂度、空间复杂度引入
c语言·开发语言·数据结构·算法
Felven3 小时前
B. The 67th 6-7 Integer Problem
数据结构·算法
研☆香4 小时前
聊一聊如何分析js中的数据结构
开发语言·javascript·数据结构
会编程的土豆4 小时前
【复习】二分查找
数据结构·c++·算法
疯狂打码的少年5 小时前
单向循环链表 + 尾指针:让插入删除更高效的秘密武器
数据结构·python·链表
️是786 小时前
信息奥赛一本通—编程启蒙(3373:练64.2 图像旋转翻转变换)
数据结构·c++·算法
Bat U6 小时前
Java高阶数据结构|AVL树
数据结构