【数据结构】顺序表

结构

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));
}
相关推荐
NineData2 天前
数据库管理工具NineData,一年进化成为数万+开发者的首选数据库工具?
运维·数据结构·数据库
琢磨先生David9 天前
Day1:基础入门·两数之和(LeetCode 1)
数据结构·算法·leetcode
qq_454245039 天前
基于组件与行为的树状节点系统
数据结构·c#
超级大福宝9 天前
N皇后问题:经典回溯算法的一些分析
数据结构·c++·算法·leetcode
岛雨QA9 天前
常用十种算法「Java数据结构与算法学习笔记13」
数据结构·算法
weiabc9 天前
printf(“%lf“, ys) 和 cout << ys 输出的浮点数格式存在细微差异
数据结构·c++·算法
wefg19 天前
【算法】单调栈和单调队列
数据结构·算法
岛雨QA9 天前
图「Java数据结构与算法学习笔记12」
数据结构·算法
czxyvX9 天前
020-C++之unordered容器
数据结构·c++
岛雨QA9 天前
多路查找树「Java数据结构与算法学习笔记11」
数据结构·算法