初级数据结构---顺序表的实现

前言

大家好呀,一瞬间c语言已经快学完啦,现在呢我将跟着大家一起学习初级数据结构---顺序表的实现,我们一起来看看吧。(源码放在最后)

顺序表的概念

顺序表基于数组的一种特殊的链表,表现在和数组一样具有连续的物理结构和逻辑结构(顺带一提链表不一定具有连续的物理结构但是一定具有连续的逻辑结构),这里我们实现的是动态顺序表,与数组与静态顺序表相比,有可扩容,不浪费空间的特性,在数据的增删查找方面也更具优势,我们现在即将完成就是动态顺序表的增删查改的代码。

前期准备

我们准备在vs2022里面创建一个顺序表头文件(用于声明顺序表源文件的代码充当目录的作用,另外本文所有方法均有在头文件中声明,就不单独贴图了)一个顺序表源文件以及测试文件如下,个人练习命名就随自己喜欢啦。

然后在写顺序时需要用到结构体知识,所有操作放在图里啦(个人认为很详细了!)操作包括包含头文件,定义了需要的结构体,如下

前期准备就到这里啦,是不是很简单

顺序表的初始化

接下来实现顺序表的初始化操作,给上一个slin函数实现初始化操作

这里我们默认把arr置为NULL,初始也可以给arr一个空间,这时需要把capicity和arr空间大小对应,传地址的问题时因为不这么做的话属于传值,但是我们在test文件(下面有图)里不会把sl初始化编译器会报错。快速在test文件里给上一个main函数测试。

扩容函数的书写

可扩容是动态顺序表的特征和优势所在,要想对顺序表进行后续操作也需用到扩容,思路是如果SL结构体的有效数据size和数组长度capicity相等时,表示数组无可用空间,这时我们需要用realloc函数开辟一个2倍数组长度的空间,代码如下

数据的前插与后插

在完成扩容函数后,我们后插就只需要在检查空间够不够后在arr[size]位置放上所需数据后size++就可以啦(这里合成了一句代码)(x表示要插入的数据)

前插我们需要把数组所有元素后移一位然后在arr[0]处放上插入的元素(x是要插入的数据)

好像也没有太多需要解释的地方,大家多看看吧哈哈

数据的前删与后删

后删只需要一行代码size--即可,不会影响我们后续对于顺序表的增删查改,前删要把除了第一个元素以外的元素前移后再size--,这样第一个元素被覆盖实现前删的效果

数据的指定位置插入

指定位置插入需要函数多一个位置参数,把此位置参数后的所有元素都后移一位,然后在此位置处插入指定数据即可,当然,还需断言指定的位置合法才能插入,判断是否需要扩容的操作也必不可少

别忘了size++哦。

数据指定位置删除

和指定位置的查找类似,需要我们把指定位置的数据删除后在把后面的元素全部往前移一位即可,难点在确定for循环终止时刻指针的位置最好画图理解

别忘了size--哦。

数据查找

当指定数据等于数组中的数据时,我们返回数组的下标,当数组中不存在这个数据时返回一个小于0的数表示该数不存在。(即没有数组对应下标)

最后在主函数里给上一个判断函数存在与否的if-else语句查找就完成啦

数组打印

for循环遍历数组打印就完成啦

只需要注意在传参时传的并不是SL的地址即可,因为打印是不需要我们对数组内容进行修改的

尾声

顺序表的基本操作就这些啦,现在你也可以自己动手写一个顺序表啦

sl.c

#include"sl.h"

void slin(SL* s)//注意这里需要传地址
{
	s->arr = NULL;
	s->size = s->capicity = 0;
}
void sldestory(SL* s)
{
	if (s->arr)
		free(s->arr);
	s->arr = NULL;
	s->size = s->size = 0;
}
void static checksl(SL* s)
{
	assert(s);//传过来的数组不能为NULL
	if (s->capicity == s->size)
	{
		int newcapicity = s->capicity == 0 ? 4 : 2 * s->capicity;/*三目操作符,表示如果问句
		成立开辟一个4个整形空间,不成立capicity乘上二*/
		sldatatype* tmp/*为了防止开辟空间失败返回NULL创建的临时指针*/ = 
			(sldatatype*)realloc(s->arr, newcapicity * sizeof(sldatatype));
		if (tmp == NULL)
		{
			perror("realloc fail");
			exit(1);//直接退出程序,不再继续执行
		}
		//空间申请成功
		s->arr = tmp;
		s->capicity = newcapicity;
	}
	
}

void slpushback(SL* s, sldatatype x)
{
	checksl(s);
	s->arr[s->size++] = x;
}
void slpushfront(SL* s, sldatatype x)
{
	checksl(s);//仍然先检查内存空间够不够,不够需要开辟空间
	for (int a=s->size; a >0 ; a--)
	{
		s->arr[i] = s->arr[i-1];
		
	}//后移操作
	s->arr[0] = x;
	s->size++;//别忘记size++
}
void print(SL s)
{
	for (int y = 0; y < s.size; y++)
	{
		printf("%d ",s.arr[y]);
	}
	printf("\n");
}
void slpopback(SL* s)
{
	assert(s);
	assert(s->size);
	s->size--;
}
void slpopfront(SL* s)
{
	assert(s);
	assert(s->size);
	for (int c = 0; c < s->size-1; c++)
	{
		s->arr[c] = s->arr[c + 1];
	}//数据整体前移
	s->size--;
}
void slpush(SL* s, int pos, sldatatype x)
{
	assert(s);
	assert(0<=pos<=s->size);
	checksl(s);
	for (int a =s->size ; a >pos ; a--)
	{
		s->arr[a] = s->arr[a-1];//arr[pos+1]=arr[pos]
	}
	s->arr[pos] = x;
	s->size++;
}
void slerase(SL* s, int pos)
{
	assert(s);
	assert(0 <= pos < s->size);//右边小于不能取等

	for (int i = pos; i < s->size-1;i++)
	{
		s->arr[i] = s->arr[i + 1];//最后时s->arr[size-2]=s->arr[size-1]
	}
	s->size--;
}

int slfind(SL* s, sldatatype x)
{
	assert(s);
	for (int i = 0; i < s->size; i++)
	{
		if (s->arr[i] == x)
		{
			return i;
		}
	}
	return 0;
}

sl.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>//需要用到的头文件包含在我们自定的头文件中即可
typedef int sldatatype;//这一步为了便于以后实现非整形顺序表时,把需要改变的数据类型实现一键替换
typedef struct seqlist
{
	sldatatype* arr;//不定长的数组
	int size;//计算数组中有效数据个数
	int capicity;//计算数组大小
}SL;//为了方便我们后续使用,这里是相当于为数组重新取了个名字
 void slin(SL* s);
 void sldestory(SL* s);
 void slpushback(SL* s, sldatatype x);
 void slpushfront(SL* s, sldatatype x);
 void slpopback(SL* s);
 void slpopfront(SL* s);
 void print(SL s);
 void slpush(SL* s, int pos, sldatatype x);
 void slerase(SL* s, int pos);
 int slfind(SL* s, sldatatype x);

test.c

#include"sl.h"
void slintest()
{
	SL s1;
	slin(&s1);
	slpushback(&s1, 1);
	slpushback(&s1, 2);
	slpushback(&s1, 3);
	slpushback(&s1, 4);
	print(s1);
	int ret = slfind(&s1, 3);
		if (ret < 0)
			printf("找不到你要找的数字\n");
		else
			printf("找到了,下标时是%d\n",ret);
}
int main()
{
	slintest();
	return 0;
}

结束啦,下次再见。

数据中心机房是现代信息技术的核心设施,它承载着企业的重要数据和服务,因此,其基础设计与规划至关重要。在制定这样的方案时,需要考虑的因素繁多,包括但不限于以下几点: 1. **容量规划**:必须根据业务需求预测未来几年的数据处理和存储需求,合理规划机房的规模和设备容量。这涉及到服务器的数量、存储设备的容量以及网络带宽的需求等。 2. **电力供应**:数据中心是能源消耗大户,因此电力供应设计是关键。要考虑不间断电源(UPS)、备用发电机的容量,以及高效节能的电力分配系统,确保电力的稳定供应并降低能耗。 3. **冷却系统**:由于设备密集运行,散热问题不容忽视。合理的空调布局和冷却系统设计可以有效控制机房温度,避免设备过热引发故障。 4. **物理安全**:包括防火、防盗、防震、防潮等措施。需要设计防火分区、安装烟雾探测和自动灭火系统,设置访问控制系统,确保只有授权人员能进入。 5. **网络架构**:规划高速、稳定、冗余的网络架构,考虑使用光纤、以太网等技术,构建层次化网络,保证数据传输的高效性和安全性。 6. **运维管理**:设计易于管理和维护的IT基础设施,例如模块化设计便于扩展,集中监控系统可以实时查看设备状态,及时发现并解决问题。 7. **绿色数据中心**:随着环保意识的提升,绿色数据中心成为趋势。采用节能设备,利用自然冷源,以及优化能源管理策略,实现低能耗和低碳排放。 8. **灾难恢复**:考虑备份和恢复策略,建立异地灾备中心,确保在主数据中心发生故障时,业务能够快速恢复。 9. **法规遵从**:需遵循国家和地区的相关法律法规,如信息安全、数据保护和环境保护等,确保数据中心的合法运营。 10. **扩展性**:设计时应考虑到未来的业务发展和技术进步,保证机房有充足的扩展空间和升级能力。 技术创新在数据中心机房基础设计及规划方案中扮演了重要角色。例如,采用虚拟化技术可以提高硬件资源利用率,软件定义网络(SDN)提供更灵活的网络管理,人工智能和机器学习则有助于优化能源管理和故障预测。 总结来说,一个完整且高效的数据中心机房设计及规划方案,不仅需要满足当前的技术需求和业务目标,还需要具备前瞻性和可持续性,以适应快速变化的IT环境和未来可能的技术革新。同时,也要注重经济效益,平衡投资成本与长期运营成本,实现数据中心的高效、安全和绿色运行。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值