首页 > 其他分享 >顺序表

顺序表

时间:2024-08-16 21:17:36浏览次数:9  
标签:顺序 datatype slt void int Sqlist size

线性表(线性存储)

2.1线性表

这是一种线性结构,含有n>=0个结点的有序列,其中的结点,有且只有一个开始结点,它没有前驱但有一个后继结点;有且只有一个终端结点,它没有后继但有一个前驱结点;其他结点都有一个前驱和一个后继。

线性表在计算机的存储基本上都是采用顺序存储链式存储两种方式。

2顺序表

2.2.1基本概念及描述

线性表采用顺序存储的方式存储。将表中的结点依次存放在计算机内存中一组连续的存储单元中 ,只需找到顺序表中第一个结点的存储地址,就可以访问顺序表中的任意结点。而数组中的元素是可以随机访问的,所以可以使用数组来表示顺序表。

2.2.2顺序表的实现

数组的下标是从0开始的,下标为i的元素对应的是第i+1个结点.

顺序表又分为静态顺序表动态顺序表,静态顺序表使用了定长数组存储元素

typedef int datatype;
#define N 7
typedef struct
{
    datatype a[N];
    int size;
}Sqlist;

缺陷:空间少了不够用,给多了会造成空间浪费

所以这里我们使用动态顺序表,按需申请,避免空间浪费

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>

typedef int datatype;
typedef struct
{
	datatype* a;
	int size;
	int capacity;
}Sqlist;

void display(Sqlist slt);//打印顺序表
void init(Sqlist* slt);//初始化
void CheckCapacity(Sqlist* slt);//扩容
void append(Sqlist* slt, datatype x);//尾插
void insert(Sqlist* slt, datatype x,int position);//在指定位置插入数据x
void del(Sqlist* slt, int postion);//删除指定位置的数据
int find(Sqlist slt, datatype x);//查找x在顺序表中的位置,返回其位置
void Destroy(Sqlist* slt);//销毁顺序表

(1)打印顺序表

void display(Sqlist slt)
{
	if (!slt.size)
		printf("顺序表是空的\n");
	else
	{
		for (size_t i = 0; i < slt.size; i++)
		{
			printf("%d ", slt.a[i]);
		}
		printf("\n");
	}
}

(2)初始化

void init(Sqlist* slt)
{
	slt->a = NULL;
	slt->size =slt->capacity= 0;
}

(3)扩容

void CheckCapacity(Sqlist* slt)
{
	if (slt->size == slt->capacity)//扩容
	{
		int newcapacity = slt->capacity == 0 ? 4 : 2 * slt->capacity;
		datatype* tmp = (datatype*)realloc(slt->a, sizeof(datatype) * newcapacity);
		if (tmp == NULL)
		{
			perror("realloc fail");
			exit(1);
		}
		slt->a = tmp;
		slt->capacity = newcapacity;
	}
}

(4)尾插

void append(Sqlist* slt, datatype x)
{
	CheckCapacity(slt);
	slt->a[slt->size++] = x;
}

(5)指定位置插入

花费的时间主要是元素后移操作,将position以及以后的元素向后移动一位,在position上插入x,该算法最好的情况是数据没有移动,就是尾插,最坏就是全部移动,时间复杂度取平均为n/2,时间复杂度为O(n)

void insert(Sqlist* slt, datatype x, int position)
{
	assert(slt);
	assert(position >= 0 && position < slt->size);
	CheckCapacity(slt);
	for (int i = slt->size; i > position; i--)
	{
		slt->a[i] = slt->a[i - 1];
	}
	slt->a[position] = x;
	slt->size++;
}

(6)指定位置删除

将pos位置之后的元素整体向前移动一位,时间复杂度为O(n)

void del(Sqlist* slt, int position)
{
	assert(slt);
	assert(position >= 0 && position < slt->size);
	for (int i = position; i < slt->size - 1; i++)
	{
		slt->a[i] = slt->a[i + 1];
	}
	slt->size--;
}

(7)查找

int find(Sqlist slt, datatype x)
{
	for (int i = 0; i < slt.size; i++)
	{
		if (slt.a[i] == x)
			return i;
	}
	return -1;
}

(8)销毁

void Destroy(Sqlist* slt)
{
	if (slt->a)
	{
		free(slt->a);
	}
	slt->a = NULL;
	slt->capacity = slt->size = 0;
}

标签:顺序,datatype,slt,void,int,Sqlist,size
From: https://www.cnblogs.com/likio/p/18363631

相关文章

  • 线程间的顺序执行(信息量)进程间的通信
    信号量是一种用于进程间或线程间同步和互斥的机制。它的核心机制基于计数和操作,用来管理对共享资源的访问。信号量的基本机制1.**信号量的定义**:  -信号量是一个用于控制对共享资源访问的整数计数器。它能够记录可用资源的数量或进程/线程的等待状态。2.**操作**: ......
  • 静态块,实例块,构造方法执行顺序
    publicclassTest{privatefinalStringa;static{System.out.println("静态初始化块执行");}//类加载时执行{System.out.println("实例初始化块执行");a="123";}//实例块在构造之前publicTest(){......
  • 数据结构(C++版)——顺序表
    一、顺序表有关的基本操作1、InitList(&L):初始化线性表,构造一个空的线性表L2、DestroyList(&L):销毁线性表L3、ClearList(&L):将线性表L重置为空表4、ListEmpty(L):若L为空表,则返回TURE,否则返回FALSE5、GetElem(L,i,&e):用e返回L中第i个数据元素的值6、LocateElem(L,e):在线性......
  • C语言-使用数组法,指针法实现将一个5X5的矩阵中最大的元素放在中心,四个角分别放四个最
    1.题目要求:将一个5X5的矩阵中最大的元素放在中心·,四个角分别放四个最小的元素(顺序为从左到右,从上到下,从小到大存放),写一函数实现之。2.数组法实现#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>//一、数组法实现intmain(){ intarr[5][5]={ {1,2,3,4,5},......
  • 【cmake】关于cmake链接库的顺序要求
    注意注意:在CMake中,你可以使用target_link_libraries命令来指定链接顺序。这个命令接受一个目标(target)和一系列库(库可以是库目标、库文件路径或导入的库目标)作为参数。链接顺序通常很重要,特别是当库之间存在依赖关系时。cmake_minimum_required(VERSION3.10)project(My......
  • 不依靠for循环,Python如何对列表进行去重并保留排列顺序
    在python中,我们想要从列表中删除重复元素,并且保留去重之前的先后排列顺序。在这里,我们本文不谈论for循环,我们来谈论其他的更优方法——OrderedDict和set。要知道,OrderedDict可以通过保留插入顺序来实现元素去重;而set集合,则可以直接去除列表中的重复元素。需要注意的是,我们的......
  • 40、Python之面向对象:扩展的对象属性解析顺序(描述符 + MRO)
    引言在上一篇文章中,我们简单回顾了Python中在继承语境下的属性解析顺序,同时补充了能够控制、影响属性解析的3个函数/方法(2个魔术方法+1个内置函数),相信对Python中属性的解析,相较于MRO,有了更进一步的认识。今天这篇文章中,我们将考虑属性描述符存在的情况下,对于Python中的属性......
  • 顺序结构与选择结构
    顺序结构从上到下依次执行,是由若干个依次执行的处理步骤组成的,他是任何一个算法都离不来的基本算法结构。packagecom.yang.struct;publicclassShunXuDemo{publicstaticvoidmain(String[]args){System.out.println("hello1");System.out.print......
  • 知识改变命运 数据结构【顺序表】
    1.线性表线性表(linearlist)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列…线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组......
  • 【数据结构】详细介绍线性表中的顺序表,带你复盘实现细节,附上顺序表编程练习题
    目录一.线性表二.顺序表 1.静态顺序表与动态顺序表2.动态顺序表的接口实现 2.1顺序表初始化 2.2判断是否需要扩容  2.3 顺序表指定位置插入2.4 顺序表头插2.5 顺序表尾插2.6 顺序表指定位置删除2.7 顺序表头删2.8 顺序表尾删2.9 顺序表查找2.1......