【数据结构】顺序表-程序员宅基地

技术标签: 数据结构  

个人主页:啊Q闻       

收录专栏:《C语言》           

 道阻且长,行则将至

前言

顺序表是我们后续实现通讯录的一个关键技术,今天我们就来学习一下顺序表。 

 一.顺序表的概念及结构

顺序表是线性表的一种。什么是线性表呢?

线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表有:顺序表,链表,栈,队列,字符串……

线性表在逻辑结构上是线性结构,在物理结构上不一定是连续的。

线性表在物理上存储时,通常以数组和链式结构的形式存储。

1.对于顺序表,顺序表在逻辑结构上是线性的,物理结构上是连续的。

2.顺序表的底层结构是数组,对数组进行封装,实现常用的增删查改等接口。有点类似与苍蝇馆子包装成五星级酒店。

二.顺序表的分类 

顺序表分为静态顺序表和动态顺序表

1.静态顺序表

概念:使用定长数组存储元素

正是因为静态顺序表是使用定长数组存储元素,所以其空间给少了不够用,给多了又会造成空间浪费。 

2.动态顺序表 

动态顺序表可以自己开辟空间,相较于静态顺序表更加灵活。 

显然,动态顺序表更加灵活好用,我们来完成一下动态顺序表的实现。 

三.动态顺序表的实现 

动态顺序表的实现要有的基本功能是增删查改,所以我们要实现的功能为顺序表的初始化和销毁,以及基本功能增删查改。 

我们创建三个文件:

一个头文件SeqList.h用于定义顺序表的结构,顺序表要实现的接口。

一个源文件SeqList.c用于具体实现顺序表里定义的接口。

一个源文件test.c用于测试顺序表。

SeqList.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int SLDataType;
typedef struct Seqlist
{
	SLDataType* arr;
	int size;
	int capacity;
}SL;
void Init(SL* ps);//初始化
void SLPlusCapacity(SL* ps);//扩容
void SLPushFront(SL* ps,SLDataType num);//前插
void SLPushBack(SL* ps, SLDataType num);//后插
void SLDeFront(SL* ps);//头删
void SLDeBack(SL* ps);//尾删
void SLInsert(SL* ps, SLDataType num, int pos);//指定位置插入
void SLDelete(SL* ps, int pos);//指定位置删除
int  SLFind(SL* ps, SLDataType num);//查找
void SLChange(SL* ps, SLDataType num,int a);//修改
void SLPrint(SL*ps);//打印
void SLDestory(SL* ps);//销毁

详解:


 SeqList.c

#include "SLlist.h"
void Init(SL* ps)
{
	ps->arr = NULL;
	ps->size = 0;
	ps->capacity = 0;
}//对每个值初始化
void SLPlusCapacity(SL* ps)//扩容
{
	assert(ps);
	if (ps->size == ps->capacity)
	{
		int newcapacity = 0;
		newcapacity = ps->capacity == 0 ? 4 : 2 * (ps->capacity);//三目表达式
		SLDataType* tmp = (SLDataType*)realloc(ps->arr, newcapacity *sizeof(SLDataType));
		if (tmp == NULL)
		{
			perror("realloc fail");
			exit(1);
		}
		ps->arr = tmp;
		ps->capacity = newcapacity;
	}
}
void SLPushFront(SL* ps, SLDataType num)//前插
{
	assert(ps);
	SLPlusCapacity( ps);
	int i = 0;
	for (i=ps->size;i>0;i--)
	{
		ps->arr[i] = ps->arr[i - 1];
	}
	ps->arr[0] = num;
	ps->size++;
}
void SLPushBack(SL* ps, SLDataType num)//后插
{
	assert(ps);
	SLPlusCapacity(ps);
	ps->arr[ps->size++] = num;
}
void SLDeFront(SL* ps)//前删
{
	assert(ps);
	assert(ps->size);
	int i = 0;
	for (i = 0; i < ps->size - 1; i++)
	{
		ps->arr[i] = ps->arr[i + 1];
	}
	ps->size--;
}
void SLDeBack(SL* ps)//后删
{
	assert(ps);
	assert(ps->size);
	ps->size--;
}
void SLInsert(SL* ps, SLDataType num, int pos)//指定位置插入
{
	assert(ps);
	assert(pos >= 0 && pos <= ps->size);
	SLPlusCapacity(ps);
	int i = 0;
	for (i=ps->size;i>pos;i--)
	{
		ps->arr[i] = ps->arr[i - 1];
	}
	ps->arr[pos] = num;
	ps->size++;
}
void SLDelete(SL* ps, int pos)//指定位置删除
{
	assert(ps);
	assert(pos >= 0 && pos <= ps->size);
	int i = 0;
	for (i=pos;i<ps->size-1;i++)
	{
		ps->arr[i] = ps->arr[i+1];
	}
	ps->size--;
}
 int  SLFind(SL* ps, SLDataType num)//查找
{
	assert(ps);
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		if (ps->arr[i] == num)
		{
			return i;
		}
	}
	return -1;
}
 void SLChange(SL* ps, SLDataType num,int a)//修改
 {
	 assert(ps);
	 ps->arr[a] = num;
 }

void SLPrint(SL* ps)//打印
{
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->arr[i]);
	}
	printf("\n");
}
 void SLDestory(SL* ps)//销毁
 {
	 assert(ps);
	 if (ps->arr)
	 {
		 free(ps->arr);
	 }
	 ps->arr=NULL;
	 ps->size = ps->capacity = 0;

 }

详解:

 

 

   

test.c 

#include "SLlist.h"
void SLTest01()
{
	SL s1;//创建变量
	Init(&s1);
	SLPushFront(&s1, 1);
	SLPushFront(&s1, 2);
	SLPushFront(&s1, 3);
	SLPushFront(&s1, 4);
	//SLPrint(&s1);
    SLPushBack(&s1, 5);
	SLPushBack(&s1, 6);
	SLPrint(&s1);
	/*SLDeFront(&s1);
	SLPrint(&s1);
	SLDeBack(&s1);
	SLPrint(&s1);*/
	//SLInsert(&s1, 8, 3);
	//SLPrint(&s1);
	/*SLDelete(&s1, 3);
	SLPrint(&s1);*/
    /*int ret=SLFind(&s1, 2);
	if (ret < 0)
	{
		printf("要查找的数字不存在\n");
	}
	else
	{
		printf("找到了,数字在%d位置\n", ret);
	}*/

	SLChange(&s1, 9, 1);
	SLPrint(&s1);
	SLDestory(&s1);
}
int main()
{
	SLTest01();
	return 0;
}

感谢大家阅读,下篇博客将会分享利用顺序表实现通讯录,如果对你有帮助的话,三连支持一下吧

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/2302_80020887/article/details/136820924

智能推荐

新型无线充电技术:能为人体植入设备充电_无线充电植入人体-程序员宅基地

文章浏览阅读2.2k次。原标题:无线充电技术获新突破 可给体内植入设备充电一项新的突破性的无线充电技术可以让新的健康跟踪监测工具更深地植入我们的体内——如肝脏、心脏,甚至大脑中。这项无线充电技术名为“中场无线传输”(mid-field wireless transfer),可以给深植入人体内的微型电子设备(如传感器、起搏器和神经刺激器)充电。它只要用一张信用卡大小的设备,就可以在体外对这些植入设备_无线充电植入人体

NIKE旗下品牌JORDAN发力新零售, 瞄准了天猫小黑盒-程序员宅基地

文章浏览阅读205次。8090一代,从小到大穿球鞋的时间,往多了说可能有20年,往少了大抵也得有个10年左右,但球鞋真正成了潮流圈口口相传的大众文化,还得是近几年的事情。当然,在这个有关鞋的文化里,还有一群更小众的群体——sneaker(sneaker,指热爱和收藏球鞋的人)。他们是sneaker文化的忠实追随者,他们眼中永恒的传奇,是Air Jordan。现如今,多了一个让万千sneaker欢欣的消息,他们终于可以在..._showcase jordan

opencv 图像梯度(python)_cv2.cv_64f-程序员宅基地

文章浏览阅读3.2k次,点赞6次,收藏20次。图像梯度图像梯度Sobel理论基础计算水平方向偏导数的近似值计算垂直方向偏导数的近似值Sobel算子及函数使用注意点:参数ddepth方向计算x方向和y方向的边缘叠加Scharr算子及函数使用Sobel算子和Scharr算子的比较Laplacian算子及函数使用算子总结图像梯度图像梯度计算的是图像变化的速度。对于图像的边缘部分,其灰度值变化较大,梯度值也较大;相反,对于图像中比较平滑的部分,其灰度值变化较小,相应的梯度值也较小。图像梯度计算需要求导数,但是图像梯度一般通过计算像素值的差来得到梯度的近_cv2.cv_64f

DataGrip 链接不上linux 上的mysql_在linux上安装了mysql在datagrip中连接后无法跟在finalshell中的数据同步-程序员宅基地

文章浏览阅读1.6k次。DataGrip 链接不上linux 上的mysql使用Centos7 linux上安装的MySQL 5.7.35安装步骤可参考 https://blog.csdn.net/qq_33554286/article/details/88357634安装完MySQL 若提示是这样的ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this stateme_在linux上安装了mysql在datagrip中连接后无法跟在finalshell中的数据同步

2023年Twitter营销应该知道的一些数据_twitter全球用户分布 2021-程序员宅基地

文章浏览阅读366次。不过,即使如此,Twitter 的用户群体仍然保持着强大的虽然目前拥有30亿活跃用户的Facebook方面稍显逊色,但Twitter在新闻传播领域的重要性不可低估,因为人们仍倾向于通过Twitter获取新闻趋势。较成熟的用户(25至49岁)占比高达59.2%,这最新显示于Snapchat和Instagram,Twitter更受到成熟用户的欢迎(Statista,2021 年数据)。另外,周末有趣,使用积极型的表情符号会有所增加,周五和周六的积极型表情符号最多达77.7%,比工作日增加了约1.9%。_twitter全球用户分布 2021

【玩转Linux】标准IO函数_linux io函数-程序员宅基地

文章浏览阅读657次,点赞2次,收藏2次。标准IO函数  1.fopen() / fclose()  2.fgetc()和getc()和getchar(),以及fputc()和putc()和putchar()  3.fgets()/gets()/fputs()/puts()  4.feof()/ferror()  5.fread(/fwrite()  6.fseek()/ftell()/rewind  7.printf()/fprintf()/sprintf()/snprintf()/scan_linux io函数

随便推点

2022/5/8 SSM框架整合增删改查(模糊查询+分页)(详细案例)_ssm模糊查询,反显,分页整合-程序员宅基地

文章浏览阅读835次。目录1丶项目结构2丶所需依赖3丶配置mybatis-config.xml文件4丶配置springmvc-servlet.xml文件5丶配置database.properties文件6丶配置applicationContext-mybatis.xml文件7丶配置web.xml文件8丶运行效果 8.1丶首页界面 8.2丶组合查询+分页 8.3丶添加 8.4丶修改 8.5丶删除..._ssm模糊查询,反显,分页整合

java开发怎么打补丁_[Java教程]【NC】出补丁与打补丁-程序员宅基地

文章浏览阅读1.6k次。[Java教程]【NC】出补丁与打补丁0 2021-01-02 20:00:06出补丁什么是补丁?如果我们的衣服上破了一个洞,可以拿块布给补上,这块布就是“补丁”。程序也是一样,如果系统有了漏洞或者想要完善某些功能,都需要打补丁。如何出补丁选中你需要打补丁的文件(一般你修改了哪些文件,就需要对哪些文件出补丁),右键选择“导出”,选中“UAPx6 Service Pack”,点击“下一..._java项目 补丁式开发 wrs

联想e470锁定计算机,联想ThinkPad笔记本Fn键关闭与启用方法-程序员宅基地

文章浏览阅读2.7k次。联想ThinkPad系列笔记本的F1-F12键跟传统的功能键是相反的,传统的功能键都是按Fn+功能键来实现快捷功能,ThinkPad默认设置是直接按功能键就实现快捷功能。不少用户使用很不习惯:比如按F5刷新网页,Alt+F4关闭窗口或关机等失效。既然大部分朋友都不习惯这个操作,那么小编就来教大家怎么关闭与启用Fn功能键,帮助大家把联想ThinkPad笔记本设置与一般的笔记本一样,希望大家喜欢。1...._thinkpad e470快捷键设置

vue中实现 图片的放大缩小和拖拽_vue图片放大缩小拖动-程序员宅基地

文章浏览阅读2.4k次。【代码】vue中实现 图片的放大缩小和拖拽。_vue图片放大缩小拖动

《FLUENT 14.0超级学习手册》——2.5 FLUENT 14.0的基本操作-程序员宅基地

文章浏览阅读1.9k次,点赞3次,收藏6次。本节书摘来自异步社区《FLUENT 14.0超级学习手册》一书中的第2章,第2.5节,作者: 唐家鹏 更多章节内容可以访问云栖社区“异步社区”公众号查看。2.5 FLUENT 14.0的基本操作FLUENT 14.0超级学习手册本节将介绍FLUENT 14.0的用户界面和一些基本操作。在本书中,若不作特殊说明,FLUENT均指FLUENT 14.0版..._fluent中参考值如何确定

理论计算机科学逻辑博导,软件学院研究生论文导师一览表-程序员宅基地

文章浏览阅读106次。软件学院研究生论文导师一览表软件学院研究生论文导师一览表更新日期:2012年9月19日导师序号单位123456789软件10学11院121314151617181920212223242526272829303132333435363738394041424344454647484950应用所件51525354姓名常会友朝红阳冯剑琳孙伟温武少李文军余阳高成英硕/博导专业研究方向博导博导博导博导博导..._理论计算机博导