首页 > 其他分享 >动态顺序表的创建

动态顺序表的创建

时间:2023-04-06 23:34:31浏览次数:35  
标签:ps 顺序 int 创建 void SLDataType SL 动态 size

建立头文件

头文件名   SeqList.h

1.构建一个结构体,结构体内的成员变量有,有效元素的个数size, 该数组的容量capacity,存放数据所开辟动态空间的地址a。(a是指向动态开辟空间的指针)代码10-15行。

动态顺序表的创建_List

2.创建接口

动态顺序表需要完成增删查改等功能

如图

动态顺序表的创建_ci_02

完整代码如下,内部也已标有注释

SeqList.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include <assert.h>
#include<stdio.h>
#include <stdlib.h>

typedef int SLDataType;//int的重新定义
//结构体struct SeqList或者SL(类型)里面有,有效元素的个数size,
//该数组的容量capacity,存放数据所开辟空间的地址a
typedef struct SeqList
{
	SLDataType* a;
	int size;//有效元素的个数
	int capacity;//该数组的容量
}SL;
//下面的SL* ps是用来接收结构体的地址
void SeqListInit(SL* ps);//初始化
void SeqListPrint(SL* ps);//测试打印
void SeqListCheckCapacity(SL* ps);//检查容量,不够则加二倍

void SeqListPushBack(SL* ps, SLDataType x);//尾插
void SeqListPopBack(SL* ps);//尾删

void SeqListPushFront(SL* ps, SLDataType x);//头插
void SeqListPopFront(SL* ps);//头删
void SeqListInset(SL* ps, int pos,SLDataType x);//任意位置插入
void SeqListErase(SL* ps,int pos);//任意位置删除
int SeqListFind(SL* ps, SLDataType x);//查找
void SeqListFree(SL* ps);//释放空间

接口功能实现

先创建SeqList.c源文件

#include "SeqList.h"
void SeqListInit(SL* ps)//初始化
{
	ps->a =(SLDataType*) malloc(sizeof(SLDataType) * 4);
	if (ps->a == NULL)
	{
		printf("开辟内存失败\n");
		/*exit(-1);*/
	}
	ps->size = 0;//记录初始化后结构体里面的值
	ps->capacity = 4;
}
void SeqListPrint(SL* ps)//测试打印
{
	assert(ps);
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		printf("%d  ", ps->a[i]);
	}
	printf("\n");
}
void SeqListCheckCapacity(SL* ps)//检查容量,不够则加二倍
{
	if (ps->size >= ps->capacity)
	{
		ps->capacity *= 2;
		ps->a = (SLDataType*)realloc(ps->a, sizeof(SLDataType) * ps->capacity);
		if (ps->a == NULL)
		{
			printf("扩容失败\n");
			exit(-1);
		}
	}
}
//
void SeqListPushBack(SL* ps, SLDataType x)//尾插
{
	assert(ps);
	SeqListCheckCapacity(ps);
	ps->a[ps->size] = x;
	ps->size++;
}
void SeqListPopBack(SL* ps)//尾删
{
	assert(ps);
	ps->size--;
}
void SeqListPushFront(SL* ps, SLDataType x)//头插
{
	assert(ps);
	SeqListCheckCapacity(ps);

	SLDataType end = ps->size - 1;
	while (end >= 0)
	{
		ps->a[end + 1] = ps->a[end];
		end--;
	}
	ps->size++;
   ps->a[end+1] = x;
}
void SeqListPopFront(SL* ps)//头删
{
	assert(ps);
	int start = 1;
	while (start < ps->size)
	{
		ps->a[start - 1] = ps->a[start];
		start++;
	}
	ps->size--;
}
void SeqListInset(SL* ps, int pos, SLDataType x)//任意位置插入
{
	assert(ps);
	int end = ps->size - 1;
	while (end >= pos)
	{
		ps->a[end + 1] = ps->a[end];
		end--;
	}
	ps->a[pos] = x;
	ps->size++;
}
void SeqListErase(SL* ps, int pos)//任意位置删除
{
	assert(ps);
	int start = pos + 1;
	while (start < ps->size)
	{
		ps->a[start - 1] = ps->a[start];
		start++;
	}
	ps->size--;
}
int SeqListFind(SL* ps, SLDataType x)//查找
{
	assert(ps);
	int i = 0;
	while (i < ps->size)
	{
		if (ps->a[i] == x)
		{
			return i;
		}
		i++;
	}
}
void SeqListFree(SL* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
}

创建工程测试test.c源文件

#include "SeqList.h"
//测试
void TestSeqList()
{
	SL s;
	SeqListInit(&s);
	SeqListPushBack(&s, 1);
	SeqListPushBack(&s, 2);
	SeqListPushBack(&s, 3);
	SeqListPushBack(&s, 3);
	SeqListPushBack(&s, 3);
	SeqListPushBack(&s, 3);
	SeqListPrint(&s);//测试尾部插入打印
	SeqListPopBack(&s);
	SeqListPrint(&s);//测试尾部删除打印
	SeqListPushFront(&s, 9);
	SeqListPrint(&s);//测试头部插入打印
	SeqListPopFront(&s);
	SeqListPrint(&s);//测试头部删除打印
	SeqListInset(&s, 3, -1);
	SeqListPrint(&s);//测试任意位置插入打印
	SeqListErase(&s, 3);
	SeqListPrint(&s);//测试任意位置删除打印
	int ret=SeqListFind(&s, 1);//查找
	SeqListFree(&s);//释放动态开辟空间
}
int main()
{
	TestSeqList();
	return 0;
}

代码内部有详细的注释。

标签:ps,顺序,int,创建,void,SLDataType,SL,动态,size
From: https://blog.51cto.com/u_16003640/6174247

相关文章

  • Mybatis-动态SQL案例
    案例根据非id两个字段删除voiddeleteBatchRelation(@Param("entites")List<AttrAttrgroupRelationEntity>entites);<deleteid="deleteBatchRelation">deletefrompms_attr_attrgroup_relationwhere--遍历循环删除itemseparator是......
  • 创建私人仓库管理国外 lab
    创建私人仓库管理lab代码gitclonegit://g.csail.mit.edu/xv6-labs-2021cdxv6-labs-2021gitcheckoututilmakeqemu#github是可选的远程仓库名,由于origin被使用,此处用githubgitremoteaddgithubhttps://github.com/cong0221/6.S081.git#<token>要替换......
  • WinDbg调试Dump转储文件及程序崩溃时自动创建转储文件的方式
    通过WinDbg分析转储文件在调试过程中回遇到一些很奇怪的问题,编译器调试无法正常定位问题,所以需要WinDbg,这篇博客是对照多篇文档的简易的入门整理一、必备知识1.1、下载WinDbg微软文档下载Windows调试工具-WinDbg-Windowsdrivers|MicrosoftLearnWinDbgPreview是......
  • 【Azure 应用服务】使用Docker Compose创建App Service遇见"Linux Version is too lo
    问题描述使用DockerCompose方式合并多个镜像(Images)文件,然后部署到AppService中,结果失败。报错LinuxVersion太长,不能超过4000个字符。错误消息:{"code":"DeploymentFailed","message":"Atleastoneresourcedeploymentoperationfailed.Pleaselistdeploymentoper......
  • 基于MATLAB Simulink的三相感应电机动态数学建模仿真模型
    Three_Phase_Induction_Motor:基于MATLABSimulink的三相感应电机动态数学建模仿真模型。仿真条件:MATLABSimulinkR2015bYID:5380650367252800......
  • vue3创建项目笔记
    E:\vue3学习>npminitvite@latestvite-blog----templatevueNeedtoinstallthefollowingpackages:[email protected]?(y)yScaffoldingprojectinE:\vue3学习\vite-blog...Done.Nowrun:cdvite-blognpminstallnpmrundevnpmnotice......
  • vue动态添加表单validateField验证
    1<template>2<el-formref="form":model="form":rules="rules"label-width="100px">3<divv-for="(input,index)ininputs":key="index">4<el-form-......
  • 顺序表
    顺序表概念和结构顺序表用一段连续的内存空间存储数据的结构指针dys指向动态开辟的空间,capacity记录容量,size记录数据个数 顺序表的实现SeqList.h#include<stdio.h>#include<assert.h>#include<stdlib.h>typedefintSLDataType;typedefstructSeqList{ SL......
  • 我的博客刚刚创建!
    在生信分析领域利用博客记录和分享代码的好处如下:方便知识共享:博客可以帮助研究人员将自己的经验和知识分享给其他人。通过记录自己的实验过程、数据分析流程以及代码实现,可以使得其他有类似问题的人快速了解相关知识。提高交流效率:生信领域涉及到很多复杂的数据处理和分析......
  • 【code】动态规划-两种状态
    买卖股票的最佳时机给定一个数组prices,它的第i个元素prices[i]表示一支给定股票第i天的价格。你只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能......