顺序表动态存储及其接口的实现

小编 2026-06-18 阅读:615 评论:0
顺序表的存储有两种方式:静态存储和动态存储。 静态存储开辟的是一个定长的空间,它只适用确定知道需要存储多少数据的场景。静态顺序表的定长数组开多了浪费,开少了不够用。所有在大多数情况下都是使用动...

顺序表的存储有两种方式:静态存储动态存储
静态存储开辟的是一个定长的空间,它只适用确定知道需要存储多少数据的场景。静态顺序表的定长数组开多了浪费,开少了不够用。所有在大多数情况下都是使用动态顺序表,根据需要动态分配空间大小。下面是对动态顺序表的实现:

SeqList.h
#ifndef __TEST_H__
#define __TEST_H__
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<assert.h>
typedef int SLDataType;
typedef struct SeqList
{
	SLDataType* _array;
	size_t _size;
	size_t _capacity;
}SeqList;
void SeqListInit(SeqList* ps, size_t capacity);//初始化顺序表
void SeqListPushBack(SeqList* ps,SLDataType x);//在顺序表尾部插入一个x
void SeqListPrint(SeqList* ps);//打印顺序表
void SeqListPopBack(SeqList* ps);//在顺序表尾部进行删除
void SeqListInsert(SeqList* ps, size_t pos, SLDataType x);//在顺序表某个位置进行插入一个数x
void SeqListPopFront(SeqList* ps);//头删
void SeqListErase(SeqList* ps, size_t pos);
int SeqListFind(SeqList*ps, SLDataType x);
size_t SeqListSize(SeqList* ps);//计算顺序表的大小
int SeqListEmpty(SeqList* ps);//检查是否为空
void SeqListModify(SeqList* ps,size_t pos,SLDataType x);//修改给定位置的值
void SeqListBubbleSort(SeqList* ps);//对顺序表进行冒泡排序
int SeqListBinaryFind(SeqList* ps, SLDataType x);
void SeqListRemoveAll(SeqList* ps, SLDataType x);


void SeqListDestory(SeqList* ps);
#endif //__TEST_H__
SeqList.c
#define _CRT_SECURE_NO_WARNINGS 1
#include\"SeqList.h\"
void SeqListInit(SeqList* ps, size_t capacity)
{
	assert(ps);
	ps->_array=(SLDataType*)malloc(sizeof(SLDataType)*capacity);
	ps->_size = 0;
	ps->_capacity = capacity;
}

void SeqListDestory(SeqList* ps)
{
	assert(ps);
	if (ps->_array)
	{
		free(ps->_array);
		ps->_array = NULL;
		ps->_capacity = ps->_size = 0;
	}
}


void CheckCapacity(SeqList* ps)
{
	if (ps->_size == ps->_capacity)
	{
		ps->_capacity *= 2;
		ps->_array = realloc(ps->_array, ps->_capacity*sizeof(SLDataType));
		assert(ps->_array);
	}
}


void SeqListPushBack(SeqList* ps,SLDataType x)
{
	assert(ps);
	CheckCapacity(ps);
	ps->_array[ps->_size++] = x;
}

void SeqListPopBack(SeqList* ps)
{
	assert(ps && ps->_size > 0);
	ps->_size--;
}

void SeqListInsert(SeqList* ps, size_t pos, SLDataType x)
{
	assert(ps && pos <= ps->_size);
	CheckCapacity(ps);
	size_t end = ps->_size;
	while (end > pos)
	{
		ps->_array[end] = ps->_array[end - 1];
		--end;
	}
	ps->_array[pos] = x;
	ps->_size++;

}

void SeqListPopFront(SeqList* ps)
{
	assert(ps);
	size_t begin = 0;
	while (begin < ps->_size - 1)
	{
		ps->_array[begin] = ps->_array[begin + 1];
			++begin;
	}
	--ps->_size;
}

void SeqListErase(SeqList* ps, size_t pos)
{
	assert(ps && pos < ps->_size);
	size_t begin = pos;
	while (begin < ps->_size - 1)
	{
		ps->_array[begin] = ps->_array[begin + 1];
		++begin;
	}
	--ps->_size;

}

int SeqListFind(SeqList*ps, SLDataType x)
{
	assert(ps);
	for (size_t i = 0; i < ps->_size; i++)
	{
		if (ps->_array[i] == x)
		{
			return i;
		}
	}
	return -1;

}


size_t SeqListSize(SeqList* ps)
{
	assert(ps);
	printf(\"%d\\n\", ps->_size);
	return 0;
}


//非空返回1,空返回0
int SeqListEmpty(SeqList* ps)
{
	assert(ps);
	return ps->_size > 0 ? 1 : 0;
}

void SeqListModify(SeqList* ps,size_t pos,SLDataType x)
{
	assert(ps && pos < ps->_size);
	ps->_array[pos] = x;

}

void SeqListPrint(SeqList* ps)
{
	assert(ps);
	for (size_t i = 0; i < ps->_size; i++)
	{
		printf(\"%d \", ps->_array[i]);
	}
	printf(\"\\n\");
}

void SeqListBubbleSort(SeqList* ps)
{
	assert(ps);
	size_t finish = ps->_size;
	while (finish > 0)
	{
		int exchenge = 1;
		for (size_t i = 0; i <finish; i++)
		{

			if (ps->_array[i]>ps->_array[i + 1])
			{
				SLDataType tmp = ps->_array[i];
				ps->_array[i] = ps->_array[i + 1];
				ps->_array[i + 1] = tmp;
				exchenge = 1;
			}
		}
		--finish;
	}
}

int SeqListBinaryFind(SeqList* ps, SLDataType x)
{
	assert(ps);
	int begin = 0;
	int end = ps->_size - 1;
	while (end >= begin)
	{
		int mid = (begin + end) / 2;
		if (x > ps->_array[mid])
		{
			begin = mid + 1;
		}
		else if (x < ps->_array[mid])
		{
			end = mid - 1;
		}
		else
		{
			return mid;
			printf(\"找到了%d\\n\", mid);
		}
		return -1;
	}
}
	void SeqListRemoveAll(SeqList* ps, SLDataType x)
	{
		assert(ps);
		size_t cur = 0;
		size_t dest = 0;
		while (cur < ps->_size)
		{
			if (ps->_array[cur] == x)
			{
				++cur;
			}
			else
			{
				ps->_array[dest] = ps->_array[cur];
				++dest;
			}
			++cur;

		}
		ps->_size=dest;
	}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include\"SeqList.h\"

SeqList s;
void Test1()
{
	SeqListInit(&s, 8);
    SeqListPushBack(&s, 4);
	SeqListPushBack(&s, 2);
	SeqListPushBack(&s, 3);
	SeqListPushBack(&s, 56);
	SeqListPushBack(&s, 1);
	SeqListPushBack(&s, 3);
	SeqListPushBack(&s, 30);
	SeqListPushBack(&s, 3);
    SeqListPopBack(&s);
	SeqListInsert(&s, 2, 5);
	SeqListPopFront(&s);
	SeqListErase(&s, 2);
	SeqListSize(&s);
	SeqListEmpty(&s);
	SeqListModify(&s, 1,3);
	SeqListBubbleSort(&s);
	SeqListBinaryFind(&s, 56);

	SeqListRemoveAll(&s, 3);

	SeqListPrint(&s);
	SeqListDestory(&s);

}

int main()
{
	Test1();
	return 0;
}

\"在这里插入图片描述\"

顺序表的问题

  1. 中间/头部的插入删除,时间复杂度为O(n)。
  2. 增容需要申请新空间,拷贝数据,释放旧空间,会有不小的消耗。
  3. 顺序表的增容一般是以2倍的数量增加,势必会有一定的空间浪费。假如当前容量为100,满了以后增容到200,我们只剩下最后2个数据,将这两个数据插入后就没有数据了,那么就有98个空间被浪费。
版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

上一篇:ubuntu 下一篇:ubuntu下apache和mysql的命令
热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表