首页 > 其他分享 >数据结构 顺序表 -- C语言实现

数据结构 顺序表 -- C语言实现

时间:2024-08-06 09:06:03浏览次数:12  
标签:ps -- void C语言 SLDataType int SL 数据结构 size

顺序表

概念

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存
储。在数组上完成数据的增删查改。
顺序表一般可以分为:

  1. 静态顺序表:使用定长数组存储元素。
  2. 动态顺序表:使用动态开辟的数组存储。

代码实现

动态顺序表

静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空
间开多了浪费,开少了不够用。所以现实中基本都是使用动态顺序表,根据需要动态的分配空间
大小,下面实现动态顺序表。

SeqLish.h

#define _CRT_SECURE_NO_WARNINGS 1

#pragma once
#include<stdio.h>


typedef int SLDataType;

#define FORMAT "%d"  //格式

typedef struct SeqList
{
	SLDataType *a;
	int size;
	int capacity;
}SL;


//初始化
void InitSeqList(SL*ps);//

//打印
void Print(SL*ps);

//尾插
void PushBack(SL* ps,SLDataType x);

//头插
void PushFront(SL*ps, SLDataType x);

//尾删
void PopBack(SL*ps);

//头删
void PopFront(SL*ps);

//内存释放
void SLDestory(SL*ps);

//查找
int SLFind(SL*ps);

//插入
void SLInsert(SL*ps, int pos, SLDataType x);

SeqList.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"SeqList.h"


void InitSeqList(SL*ps)
{
	ps->size = ps->capacity = 0;
	//ps->a = (SL*)realloc(ps->a, (ps->capacity)*sizeof(SL));
	ps->a = NULL;
}

void Print(SL*ps)
{
	int i = 0;
	while (i<=ps->size-1)
	{
		printf(FORMAT, ps->a[i++]);
	}
	printf("\n");
}


void checkcapacity(SL*ps)
{
	if (ps->size == ps->capacity)
	{
		//扩容二倍是个适中的方式
		int newcapacity = ps->capacity == 0 ? 4 : 2 * (ps->capacity);
		SLDataType *ptr = (SLDataType *)realloc(ps->a, newcapacity* sizeof(SLDataType));
		if (ptr == NULL)
		{
			perror("realloc fail");
			//exit(-1);
			return;
		}
		ps->a = ptr;
		ps->capacity = newcapacity;
	}
}

void PushBack(SL*ps, SLDataType x)
{
	checkcapacity(ps);
	ps->a[ps->size] = x;
	ps->size++;	
}


void PushFront(SL*ps, SLDataType x)
{
	checkcapacity(ps);
		int end = ps->size-1;
		for (; end >= 0;end--)
		{
			ps->a[end+1] = ps->a[end];
		}
		ps->a[0] = x;
		ps->size++;
}


void PopBack(SL*ps)
{
	if (ps->size > 0)
	{
		ps->size--;
	}
}


void PopFront(SL*ps)
{
	if (ps -> size >= 0)
	{
		int begin = 0;
		for (; begin < ps->size - 1; begin++)
		{
			ps->a[begin] = ps->a[begin + 1];
		}
	}
	ps->size--;
}

//内存释放
void SLDestory(SL*ps)
{
	free(ps->a);
	ps->a == NULL;
}

int SLFind(SL*ps)
{
	{
		SLDataType x = 0;
		scanf(FORMAT, &x);
		if (ps->size > 0)
		{
			int begin = 0;
			for (; begin <= ps->size - 1; begin++)
			{
				if (strcmp(ps->a[begin], x) == 0)
					return begin;
			}
			return -1;
		}
		
	}
}

//position:等级位置,定位(立场,高度)  location:位置
void SLInsert(SL*ps, int pos, SLDataType x)
{
	;
}

void SLErase(SL*ps, int pos)
{
	;
}

线性表区分

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使
用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,
线性表在物理上存储时,通常以数组或链式结构的形式存储。

标签:ps,--,void,C语言,SLDataType,int,SL,数据结构,size
From: https://www.cnblogs.com/DSCL-ing/p/18344047

相关文章

  • 单元测试示例
    环境准备<properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncodi......
  • kubernetes面试
    前言  此面经为企鹅侠自己面试遇到和收集其它朋友提供的信息整理而成,给予大家参考,希望能有所帮助。!!!文档有问题请大家及时指出做修改哈k8s是什么?请说出你的了解?  答:Kubenetes是一个针对容器应用,进行自动部署,弹性伸缩和管理的开源系统。主要功能是生产环境中的......
  • 【MySQL】库操作,数据类型
    目录MySQL简介SQL语句分类库操作语句展示数据库创建数据库使用数据库删除数据库数据类型整型浮点型字符串日期类型MySQL简介数据库有关系型数据库和非关系型数据库。关系型数据库:是指采用了关系模型来组织数据的数据库。简单来说,关系模型指的就是二维表格模型,......
  • Java调用Linux命令行SpringBoot
    原文链接:https://blog.csdn.net/u014628771/article/details/108308337需求在Linux服务器上的SpringBoot程序中,调用gitclone,之后遍历git仓库中的所有文件。遍历git仓库可以使用File类实现,现在的问题是需要在SpringBoot程序中调用gitclone命令。实现方式使用Javanative的Proc......
  • Zynq-7020的架构知识、与传统嵌入式芯片的区别以及选择时机
    引言Zynq-7020是赛灵思(Xilinx)公司推出的一款高度集成的可编程片上系统(SoC),融合了FPGA的灵活性和处理器的性能。本文将详细介绍Zynq-7020的架构知识,分析其与传统嵌入式芯片的区别,并探讨在何种情况下选择Zynq-7020。一、Zynq-7020的架构知识1.可编程逻辑单元(PL)FPGA部分:Zynq-7......
  • 基于Java中的SSM框架实现在线音乐网站系统项目【项目源码+论文说明】
    基于Java中的SSM框架实现在线音乐网站系统演示摘要本文讲述了使用JSP语言及HTML5语言及MySql数据库技术开发的音乐网站的设计与实现。本文所讲的JSP音乐系统是通过所学的知识创办一个类似于QQ音乐或者酷狗音乐性质的网站平台,使所有对国内外音乐欣赏感兴趣的人都可以不必再......
  • Qt在嵌入式开发中的作用
    引言Qt是一套跨平台的C++应用程序开发框架,以其丰富的功能和灵活性,在桌面、移动和嵌入式设备开发中广泛应用。本文将详细探讨Qt在嵌入式开发中的作用,涵盖其特点、优势、应用场景以及实际案例。一、Qt的特点1.跨平台Qt支持多个操作系统平台,包括Windows、macOS、Linux、iOS、......
  • spring
    微服务与SOA微服务(Microservices)和面向服务的架构(Service-OrientedArchitecture,SOA)都是用于设计大型软件系统的架构风格,但它们在目标、设计原则和实现方式上有所不同。以下是它们之间的主要区别:微服务(Microservices)和面向服务的架构(Service-OrientedArchitecture,SOA)都是用于设......
  • Git 对比 SVN 的区别和优势
    引言版本控制系统(VCS)是软件开发过程中不可或缺的一部分,它们用于管理代码的变更、协调开发团队的工作。Git和SVN(ApacheSubversion)是目前最流行的两个版本控制系统。本文将详细分析Git和SVN的区别及各自的优势,帮助开发者选择最适合自己项目的版本控制系统。一、Git和S......
  • UITableView的原理——探究及重新实现代码
    转自简书,原文地址,本文主要探讨一些特殊细节,像视图重用这类最基本的原理可在源码里查看。先前重新实现了一个list容器视图,由于Apple没有开源,在此分享过程中探索到的UITableView一些细节。MPTableView:AlistviewlikeUITableView,morefast,morefeatures.1·捉摸不定的con......