首页 > 其他分享 >震惊!!!居然有这么详细的顺序表 ,走过路过不要错过

震惊!!!居然有这么详细的顺序表 ,走过路过不要错过

时间:2024-07-13 09:58:37浏览次数:8  
标签:ps 顺序 路过 SeqList 错过 int void 震惊 size

 

一.顺序表

顺序表(Sequential List)是一种线性表,其元素在内存中连续存放,可通过索引直接访问。线性表在逻辑结构上是线性结构,也就是说是连续的一条直线,但是在物理结构上并不一定是连续的。线性表在物理结构上存储时,通常是以数组和链式结构的形式存储的。

顺序表是一种基础的数据结构,主要有以下几种类型:

  1. 静态顺序表

    • 使用静态数组实现,即数组的大小在编译时就已经确定,不可更改。
    • 优点是实现简单,元素访问速度快。
    • 缺点是空间固定,不易扩展。
  2. 动态顺序表

    • 使用动态数组实现,即通过指针和动态内存分配(如C语言中的malloc和realloc)来管理数组。
    • 优点是可根据需要动态调整数组的大小,具有较好的灵活性。
    • 缺点是当数组扩容时,可能需要进行数据的复制,有一定的性能开销。

以下是这两种顺序表在C语言中的简单定义:

静态顺序表:

#define MAX_SIZE 100  // 定义最大容量

typedef struct 
{
    int data[MAX_SIZE];  // 静态数组
    int length;          // 顺序表当前长度
} StaticSeqList;

动态顺序表:

typedef struct 
{
    int *data;           // 动态数组指针
    int length;          // 顺序表当前长度
    int capacity;        // 顺序表当前容量
} DynamicSeqList;

 除了这两种基本的顺序表外,还有一些其他的顺序表, 比如说单顺序表、多重顺序表、稀疏顺序表以及压缩顺序表,感兴趣的可以去了解一下。

顺序表具有以下特点:

存储空间连续:顺序表的元素存储在一块连续的内存空间中。
随机访问:顺序表支持通过索引随机访问元素,访问时间为常数级别。
动态扩容:顺序表在元素数量达到容量上限时,可以进行动态扩容。

  二.顺序表的实现

在C语言中,顺序表通常通过结构体和数组来实现。以下是一个简单的顺序表实现:

SeqList.h

#pragma once
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>

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

// 对数据的管理:增删查改 

//顺序表初始化
void SeqListInit(SeqList* ps);
//顺序表的销毁
void SeqListDestroy(SeqList* ps);
//顺序表的打印
void SeqListPrint(SeqList* ps);
//尾插
void SeqListPushBack(SeqList* ps, SLDataType x);
//头插
void SeqListPushFront(SeqList* ps, SLDataType x);
//尾删
void SeqListPopFront(SeqList* ps);
//头删
void SeqListPopBack(SeqList* ps);

// 顺序表查找
int SeqListFind(SeqList* ps, SLDataType x);
// 顺序表在pos位置插入x
void SeqListInsert(SeqList* ps, int pos, SLDataType x);
// 顺序表删除pos位置的值
void SeqListErase(SeqList* ps, int pos);

 SeqList.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"
//初始化
void SeqListInit(SeqList* ps)
{
	ps->a = NULL;
	ps->size = ps->capacity = 0;
}

//销毁
void SeqListDestroy(SeqList* ps)
{
	if (ps->a)//不为NULL先释放,然后置为NULL
	{
		free(ps->a);
	}
	ps->a = NULL;
	ps->size = ps->capacity = 0;
}
顺序表的打印
void SeqListPrint(SeqList* ps)
{
	for (int i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->a[i]);
	}
	printf("\n");
}
//检查空间是否充足
void SLcheckcapacity(SeqList* ps)
{
	if (ps->size == ps->capacity)
	{
		int  newcapacity = ps->capacity = 0 ? 4:2*ps->capacity;
		SLDataType* tmp = (SLDataType*)realloc(ps->a, newcapacity * sizeof(SLDataType));
		if (tmp == NULL)
		{
			perror("realloc fail!");//扩容失败
			exit(1);
		}
		ps->a = tmp;
		ps->capacity = newcapacity;
	}
	
}
//尾插
void SeqListPushBack(SeqList* ps, SLDataType x)
{
	assert(ps);//是否为NULL
	SLcheckcapacity(ps);
	ps->a[ps->size] = x;
	ps->size++;
}
//头插
void SeqListPushFront(SeqList* ps, SLDataType x)
{
	assert(ps);//是否为NULL
	SLcheckcapacity(ps);
	for (int i = ps->size; i > 0; i--)
	{
		ps->a[i] = ps->a[i - 1];
	}
	ps->a[0] = x;
	ps->size++;//size要+1
}
//尾删
void SeqListPopFront(SeqList* ps)
{
	assert(ps);//是否为NULL
	assert(ps->size);
	ps->size--;

}
//头删
void SeqListPopBack(SeqList* ps)
{
	assert(ps->a);
	assert(ps->size);
	for (int i = 0; i < ps->size-1; i++)//ps->size-1!!!
	{
		ps->a[i] = ps->a[i + 1];
	}
	ps->size--;
}
// 顺序表查找
int  SeqListFind(SeqList* ps, SLDataType x)
{
	for (int i = 0; i < ps->size; i++)
	{
		if (ps->a[i] == x)
			return i;
	}
	return -1;//循坏结束后没有找到返回-1
}
// 顺序表在pos位置插入x
void SeqListInsert(SeqList* ps, int pos, SLDataType x)
{
	assert(ps->a);
	assert(pos >= 0 && pos <= ps->size);
	SLcheckcapacity(ps);
	for (int i = ps->size; i > pos; i--)
	{
		ps->a[i] = ps->a[i - 1];
	}
	ps->a[pos] = x;
	ps->size++;
}
// 顺序表删除pos位置的值
void SeqListErase(SeqList* ps, int pos)
{
	assert(ps);
	assert(pos >= 0 && pos <= ps->size);
	for (int i = pos; i < ps->size-1; i++)
	{
		ps->a[i] = ps->a[i + 1];
	}
	ps->size--;
}

 test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h> 
#include "SeqList.h"
int main()
{
	
	SeqList s;
	SeqListInit(&s);
	s.a = (int*)malloc(sizeof(int)*5);
	s.size = 5;
	s.capacity = 5;

	//填充顺序表!!!
	int data[] = { 1,2,3,4,5 };
	for (int i = 0; i < s.size; i++)
	{
		s.a[i] = data[i];
	}
    
    SeqListPrint(&s);
	//尾插
	//SeqListPushBack(&s, 11);
	//SeqListPrint(&s);
	
	//头插
	//SeqListPushFront(&s, 11);
	//SeqListPrint(&s);
	
	//尾删
	//SeqListPopFront(&s);
	//SeqListPrint(&s);
	
	// 头删
	//SeqListPopBack(&s);
	//SeqListPrint(&s);
	
	//查找
	//int ret=SeqListFind(&s, 5);
	//if (ret == -1)
	//	printf("没有找到\n");
	//else
	//	printf("找到了,下标为%d\n", ret);
	
	//顺序表在pos位置插入x
	//SeqListInsert(&s, 3, 11);
	//SeqListPrint(&s);
	
	//顺序表删除pos位置的值
	SeqListErase(&s, 3);
	SeqListPrint(&s);

	//销毁
	SeqListDestroy(&s);
	return 0;
}

三、顺序表问题

 1.中间/头部的插入和删除,时间复杂度是O(N)。

2.增容需要申请新的空间,拷贝数据,释放旧空间,会产生不小的消耗。

3.增容一般是呈2倍增长,肯定会有一定的空间浪费。例如当前容量是100,满了以后增容到200,继续插入10个数据,后面90个数据空间就浪费了。

 宝子们,点赞收藏+关注,进阶大佬不迷路~

标签:ps,顺序,路过,SeqList,错过,int,void,震惊,size
From: https://blog.csdn.net/2401_83948390/article/details/140353633

相关文章

  • 【磁力合集】这14个BT磁力资源网站,你一定不能错过!记得收藏
      BT磁力资源网站的优点主要包括资源丰富、下载速度快和用户体验良好。   首先,BT磁力资源网站的资源丰富。这些网站汇集了大量的电影、剧集、音乐、游戏等各种类型的资源,用户可以根据自己的需求轻松地找到想要的文件。不仅如此,这些网站通常还会定期更新资源,保证用户能......
  • 如何不错过手机的重要消息-草稿
    你是不是手机里有许多未读消息,许多“小红点”,系统通知里有很多通知,久而久之你已习惯并麻木了?你只在自己需要的时候主动去找,而对于推送的信息一概不理。有时也有朋友向你抱怨发给你的信息你久久不回。或者反过来,你经常去看推送的消息,但大多是不太重要的,是广告,占用了你很多时间,但你......
  • 加速你的下载,IDM神器不可错过!快如闪电,稳如老狗
    嗨,各位小伙伴!......
  • 震惊全球大事件 —— 中国的混装油全民投毒事件
    中国的混装油全民投毒事件ChatGPT“中国的混装油全民投毒事件”指的是中国食用油市场中存在的一个严重的食品安全问题。这种问题主要涉及某些商家将劣质、变质、甚至有毒的油掺入食用油中,并以低价出售,严重威胁了公众的健康。事件的关键点包括:劣质油来源:这些劣质油可能来自于......
  • 不入耳耳机哪个牌子性价比高?千万别错过这五款优质精品
    近年来,市面上的各大无线耳机品牌在音质、续航、性能配置等方面都在不断进行着调整升级,多种音质在线,续航持久,佩戴舒适的不入耳耳机渐渐走进大众视野。可供选择的产品太多,大家难免选择困难,不入耳耳机哪个牌子性价比高?笔者今天特意整理出了专业机构的测评数据,在我亲身体验之后,想向......
  • 震惊!Linux 常用命令总结,不看必定后悔!!!
    Linux是一个强大的操作系统,拥有大量的命令行工具。以下是一些常用的Linux命令及其基本用法:ls -列出目录内容。ls:列出当前目录下的文件和文件夹。ls-l:以长格式列出详细信息,包括权限、所有者、大小等。ls-a:列出所有文件,包括隐藏文件。cd -改变当前目录。cd/path/......
  • Linux 干货:新手村全攻略,老手也不容错过
    以下是一篇详细的关于Linux系统的文章,涵盖了基础概念、常用命令、系统管理、网络配置、安全措施等多个方面,旨在提供全面的Linux知识。希望这些干货能对你有所帮助。掌握Linux:从基础到进阶Linux是一种开源的操作系统,广泛应用于服务器、开发环境、嵌入式系统等多种场景。了解......
  • 陪玩小程序源码,不容错过的加密算法整理清单
    陪玩小程序源码,不容错过的加密算法整理清单在开发陪玩小程序源码时,可采用的加密算法类型包含:对称加密对称加密算法,使用Cipher类即可,以广泛使用的AES为例,如下:publicbyte[]encrypt(byte[]data,Keykey){try{Ciphercipher=Cipher.getInstance("......
  • 震惊,程序运行一半就不运行了
    近期,我们的项目在生产环境中运行时频繁出现一个难以理解的Bug。这个问题颇为有趣,因此我决定在此记录下整个排查过程。首先,让我模拟一下出问题的代码:XController.java@ResourceprivateXServicexService;@GetMapping("/method1")publicvoidmethod1(){System.out.printl......
  • 游泳耳机哪种款式好?四款热销游泳耳机绝对不能错过!
    游泳时享受音乐或者保持通讯联系,选择一款合适的游泳耳机至关重要。然而,在市场上选择合适的游泳耳机并不容易,特别是面对各种款式和功能的选择时。无论是传统的入耳式还是创新的骨传导耳机,每种设计都有其独特的优势和适用场景。(上图为部分测试过的游泳耳机)本文将带你深入了解......