【数据结构】顺序表

结构

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));
}
相关推荐
每周报刊3 小时前
竞速座舱级视界:爱攻 AGP497UCZD 超宽 QDOLED 显示器解析
数据结构·游戏·计算机外设
小星星闪亮登场5 小时前
图论--最小生成树(内含二分图)
数据结构·算法·图论·迭代加深·图搜索算法
2601_962201726 小时前
Java进阶,集合,Colllection,常见数据结构
java·数据结构·windows
挽星安7 小时前
2026/8/29
数据结构·算法
positive_zpc7 小时前
进阶数据结构图——最短路径(二)
数据结构·算法·图论·最短路径
positive_zpc7 小时前
进阶数据结构图——最小生成树(一)
数据结构·算法·图论
码完就睡7 小时前
数据结构——遍历二叉树
数据结构·算法
老王爱玩车8 小时前
关于函数递归的优缺点分析
开发语言·数据结构·学习·算法
lv__pf8 小时前
Mysql索引优化实战1【TL mysql4】
数据结构
boxiansheng1638 小时前
通讯录系统报错(二)
c语言·数据结构