首页 > 其他分享 >顺序表基础

顺序表基础

时间:2024-08-02 15:59:06浏览次数:8  
标签:ps arr 顺序 capacity int 基础 sl size

在C语言中,顺序表是一种线性表的实现方式,通常使用数组作为底层存储结构。顺序表具有高效的随机访问特性,也可对元素进行插入和删除操作。主要用到动态内存管理(malloc,realloc,calloc,free),数组,结构体,指针,一般推荐使用动态顺序表。

//静态顺序表
struct Seplist
{
  int arr[100];//定长数组
  int size;//顺序表当前有效元素个数
}
//动态顺序表
struct Seplist
{
  int *arr;
  int  size;//有效的数据个数
  int capacity;//空间大小
  }

动态顺序表优势在于可根据具体情况增容,使用时要注意释放内存和指针置空。

typedef int SLDataType;//为方便后续对顺序表元素类型创建的改变,例如,要建立char型,直接将代码中int变为char即可
typedef struct Seplist
{
  int *arr;
  int  size;//有效的数据个数
  int capacity;//空间大小
  }SL;
//typedef struct Seplist SL;//给顺序表结构体起名,方便后面书写

 顺序表初始化

void SLIint(SL* ps)
{
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}

顺序表销毁

void SLDestroy(SL* ps)
{
	if (ps->arr)
	{
		free(ps->arr);
	}
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}

尾部插入

void SLPushBack(SL* ps, SLDataType x)//尾部插入,x表示插入的数
//这里得注意数组的越界访问,得扩大内存
{
	assert(ps);//等价于assert(ps!=NULL)
	if (ps->size == ps->capacity)//申请空间,增容一般为二倍,三倍更合理,频繁增容影响效率
	{
		int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;//三目运算符,判断capacity大小,如果为0,则capacity赋值为4,并开辟空间,不为0则变为2倍,也可在顺序表建立时直接赋值并开辟相应空间
		SLDataType* tmp = (SLDataType*)realloc(ps->arr, newcapacity * sizeof(SLDataType));
		if (NULL == tmp)//判断开辟是否成功
		{
			perror("realloc fail");
			exit(1);  //直接退出,不再执行    
		}
		ps->arr = tmp;
		ps->capacity = newcapacity;
	}
	ps->arr[ps->size] = x;
	ps->size++;
	//ps->arr[ps->size++];(也可以这样写,但可读性低)
}

头部插入

void SLCheckcapacity(SL* ps)//插入数据前看内存够不够
{
	if (ps->size == ps->capacity)//申请空间,增容一般为二倍,三倍更合理,频繁增容影响效率
	{
		int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;//三目运算符,判断capacity大小,如果为0,则capacity赋值为4,并开辟空间,不为0则变为2倍,也可在顺序表建立时直接赋值并开辟相应空间
		SLDataType* tmp = (SLDataType*)realloc(ps->arr, newcapacity * sizeof(SLDataType));
			if (NULL == tmp)//判断开辟是否成功
			{
				perror("realloc fail");
				exit(1);  //直接退出,不再执行    
			}
		ps->arr = tmp;
		ps->capacity = newcapacity;
	}
}
void SLPushFront(SL* ps, SLDataType x)
{
	assert(ps);
	SLCheckcapacity(ps);
	for (int i = ps->size; i > 0; i--)
	{
		ps->arr[i] = ps->arr[i - 1];
	}
	ps->arr[0] = x;
	ps->size++;
}

尾部删除

void SLPopBack(SL* ps)
{
	assert(ps);
	assert(ps->size);//顺序表不为空
		ps->size--;
}

 头部删除

void SLPopFront(SL* ps)
{
	assert(ps);
	assert(ps->size);
	for (int i = 0; i < ps->size - 1; i++)
	{
		ps->arr[i] = ps->arr[i + 1];
	}
	ps->size--;
}

 打印

void SLprint(SL s)
{
	for (int i = 0; i < s.size; i++)
	{
		printf("%d ", s.arr[i]);
	}
	printf("\n");
}

建议将上述所有函数名写入"Seplist.h"的自建头文件中

将对应函数写入"Seplist.c"的文件中,再创建别的文件建立main函数去验证每个顺序表函数的正确性

#include "Seplist.h"

void SLTest01()
{
	SL  sl;
	SLIint(&sl);//注意这里的传址调用,直接传值不行,思考函数栈帧的创建和销毁过程很容易解决,下面一样
	//测试尾插
	SLPushBack(&sl, 1);
	SLPushBack(&sl, 2);
	SLPushBack(&sl, 3);
	SLPushBack(&sl, 4);
	SLprint(sl);//因为SLprint函数不需要改变顺序表内容并成功返回,只需要传给结构体变量,按照结构体打印即可
	//测试头插
	SLPushFront(&sl, 5);
	SLPushFront(&sl, 6);
	SLprint(sl);
//测试尾部删除
	SLPopBack(&sl);
	SLprint(sl);
	//测试头部删除
	SLPopFront(&sl);
	SLprint(sl);

	SLDestroy(&sl);
}


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

运行代码如下

标签:ps,arr,顺序,capacity,int,基础,sl,size
From: https://blog.csdn.net/2302_81069083/article/details/140857464

相关文章

  • SAP ABAP 基础与入门(一、数据类型定义与字符串处理)
    1.   基础1.1.  基本数据类型C、N、D、T、I、F、P、X、string、XstringP:默认为8字节,最大允许16字节。最大整数位:16*2=32-1=31-14(允许最大小数位数)=17位整数位类型最大长度(字符数)默认长度说明C1~262143个字符1 字符普通字符(常用于名称、备......
  • Python 基础教学 - 开发规范
    Python基础教学-开发规范一、引言在Python编程中,遵循良好的开发规范是编写高质量、可维护代码的关键。本文将为您详细介绍Python开发中的一些重要规范,帮助您养成良好的编程习惯。二、代码布局缩进使用4个空格进行缩进,避免使用制表符。示例:ifTrue:p......
  • Linux基本知识与基础命令
    一、简易历史linux最初由林纳斯·本纳第克特·托瓦兹(LinusBenedictTorvalds,1969年~)于1991年第一次向外公布,其logo是一只被成为Tux的企鹅(不是qq那只)操作系统,英语OperatingSystem简称为OS。说道操作系统就需要先讲一讲Unix,UNIX操作系统,是一个强大的多用户、多任务操作系统,支......
  • 关于一个简单的顺序表代码
    1.首先是头文件SeqList.h的代码:#pragmaonce#include<stdio.h>#include<assert.h>#include<stdlib.h>typedefintSXBint;typedefstructSL{ SXBint*a; intsize; intcapacity;}SLnode;//初始化voidSeqLsitInit(SLnode*ps);//尾插voidSeqPushback(S......
  • Python基础学习笔记(一)
    文章目录一、下载Python二、变量三、数据类型四、运算符五、语句六、容器类型七、函数function八、常用API九、面向对象类的创建:创建对象:实例成员:实例方法:类成员:静态方法:十、三大特征:封装、继承、多态十一、六大原则:Python基础学习笔记(二)一、下载Python官网:https......
  • Linux操作系统基础学习笔记(3)
    Linux操作系统基础学习笔记(3)前言3、Linux命令(1)manls可查看命令说明,相当于帮助文档(2)关机重启(root)(3)快捷键和常用命令(4)别名的配置(5)通配符(6)系统环境变量(7)符号下期前言本篇内容主要为Linux基本命令主要包括:查看命令说明的man指令关机重启的root一些快捷键,如......
  • 基于飞书机器人的基础跨账号消息提醒
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、添加飞书机器人二、在飞书机器人助手配置流程三、存在的问题以及后续前言飞书企业账号和个人账号是独立的,然而不知道为什么它不支持跨账号消息提醒。在多次忽略领导消息后痛定思痛,......
  • day16 Java基础——JavaDoc生成文档
    day16Java基础——JavaDoc生成文档目录day16Java基础——JavaDoc生成文档1.什么是JavaDoc2.生成JavaDoc2.1通过命令行生成JavaDoc2.2使用IDEA生成JavaDoc1.什么是JavaDocJavaDoc是一种标准的、用于生成Java代码API文档的工具。它通过在Java源代码中特定的......
  • 代码随想录算法训练营第57天 | 并查集理论基础
    并查集理论基础https://www.programmercarl.com/kamacoder/图论并查集理论基础.html107.寻找存在的路径https://kamacoder.com/problempage.php?pid=1179代码随想录https://www.programmercarl.com/kamacoder/0107.寻找存在的路径.html#思路并查集理论基础并查集用于判断......
  • 微信小程序默认的文字内容在左上角怎么办?带你0基础快速了解skyline渲染模式。
     ......