顺序表的详解

article/2025/8/22 5:22:10

线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串....

即顺序表为线性表的一种,


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

顺序表一般分为

1.静态顺序表:使用定长数组存储元素

#defined N 7
typedef int SLDataType
typedef struct SeqList
{SLDataType* data[N];size_t size;
}

这时的数组是一个定长数组,长度为7。

其实这样的静态的顺序表缺点还是挺大的,除了简单,好像找不到什么优点,如果给德空间小了,就存不了数据了,如果给大了,就会显得浪费空间,所以为了弥补这样的缺点,于是就提出了动态顺序表的结构。何为动态顺序表,就是可以动态的分配空间,要多少给你分配多少,从而相对于静态的顺序表而言,很大程度上提升了大的灵活性。

typetef struct SeqList
{SLDataType* data;size_t size;size_t capicity;
}SeqList;

代码中给了一个数组的地址,然后给了存了数据个数的size,给了容量的大小,如果,size= capicity时,就进行扩容。

最后我们就可以写增删查改的结构函数了

 接下来我们从创建动态顺序表到各种结构来解释我们今天的顺序表

 首先第一步就是建立一个结构:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>typedef int SeqListData;
typedef struct SeqList
{SeqListData* data;int size;int capicity;
}seqList;

并且创建一个顺序表,并且对其进行初始化。

void test()
{seqList sq;SeqListInit(&sq);SeqListDestroy(&sq);
}

因为我们要用realloc,在栈上申请内存,所以当程序结束后,我们要对在栈上申请的内存进行释放,要不然会发生内存泄漏现象。所以写了一个销毁内存的接口;

void SeqListDestroy(seqList*ps)
{free(ps->data);ps->data = NULL;ps->capicity = 0;ps->size = 0;
}

因为这是动态的,所以当空间不足时,要分配内存给它,所以也要写一个接口,来检查它的内存是不是满了;

 

 

 接下来还有一个打印接口:

void SwqPrint(seqList*ps)
{assert(ps);for (int i = 0; i < ps->size; i++){printf("%d ", ps->data[i]);}printf("\n");
}

 完成了一系列的辅助接口,接下来就是完成我们的增删查改,首先来下简单的,尾插:

void SeqListPushBack(seqList*ps, SeqListData x)
{assert(ps);CheckCapacity(ps);ps->data[ps->size] = x;ps->size++; 
}

 因为我们创建的是数组,所以尾插就比较方便,直接在后面加数据就行。

所以完成尾加之后加是尾删:

void SeqListPopBack(seqList*ps)
{assert(ps);assert(ps->size>0);ps->size--;
}

所以尾删也很简单,就是使size减一,不访问这个数据就可以了。

#include"SeqList.h"void test()
{seqList sq;SeqListInit(&sq);SeqListPushBack(&sq, 1);//尾插如数据SeqListPushBack(&sq, 2);SeqListPushBack(&sq, 3);SeqListPushBack(&sq, 4);SwqPrint(&sq);SeqListPopBack(&sq);SwqPrint(&sq);SeqListDestroy(&sq);
}int main()
{test();return 0;
}

 这是我们的测试代码,用以上的接口来玩成一部分的功能

 接下来是头加和头删

void SeqListPushFront(seqList*ps, SeqListData x)
{CheckCapacity(ps);for (int i = ps->size - 1; i >=0; i--){ps->data[i+1] = ps->data[i];}ps->data[0] = x;ps->size++;
}
void SeqListPopFront(seqList*ps)
{assert(ps->size > 0);for (int i = 0; i < ps->size; i++){ps->data[i] = ps->data[i + 1];}ps->size--;
}

接下来测试下新增的几个接口

void test()
{seqList sq;SeqListInit(&sq);SeqListPushBack(&sq, 1);//尾插如数据SeqListPushBack(&sq, 2);SeqListPushBack(&sq, 3);SeqListPushBack(&sq, 4);SwqPrint(&sq);SeqListPopBack(&sq);SwqPrint(&sq);SeqListPushFront(&sq,10);SwqPrint(&sq);SeqListPopFront(&sq);SwqPrint(&sq);SeqListDestroy(&sq);
}int main()
{test();return 0;
}

 最后我们来写一个寻找的接口,给一个数据,如果数组里有那就对应的小标,如果没有就打印找不到。

int  SeqListFind(seqList*ps, SeqListData x)
{int i = 0;for ( i = 0; i < ps->size ; i++){if (ps->data[i] == x){return i;}}if (i>ps->size){printf("找不到\n");}return 0;
}

以上就是我们顺序表的基本操作增删查改


http://chatgpt.dhexx.cn/article/yVsasx2I.shtml

相关文章

什么是顺序表

顺序表 在程序中&#xff0c;经常需要将一组&#xff08;通常是同为某个类型的&#xff09;数据元素作为整体管理和使用&#xff0c;需要创建这种元素组&#xff0c;用变量记录它们&#xff0c;传进传出函数等。一组数据中包含的元素个数可能发生变化&#xff08;可以增加或删…

数据结构——顺序表

目录 一. 什么是顺序表&#xff1f; 1&#xff0c;静态顺序表 2&#xff0c;动态顺序表 ①动态顺序表的实现及其初始化 ②空间的创建 ③顺序表的打印和销毁 ④顺序表的尾部插入和删除 ⑤顺序表的头部插入和删除 ⑥顺序表pos位置的插入和删除 ⑦顺序表指定元素的删除 二&am…

【数据结构】——顺序表介绍(独家介绍,小白必看!!)

重点和易错点都用彩笔标记出来了&#xff0c;放心食用&#xff01;&#xff01; 数据结构分为线性表和非线性表&#xff0c;今天我们要学习的顺序表就是线性表中的一个小类。那么&#xff0c;何为线性表&#xff0c;线性表是指n个具有相同性质的数据元素的有限序列&#xff0c…

顺序表详解

目录 一、线性表的概念 二、顺序表 1、顺序表的概念 1&#xff09;. 静态顺序表&#xff1a;使用定长数组存储元素。 2&#xff09;. 动态顺序表&#xff1a;使用动态开辟的数组存储。 三、接口实现 1、创建 2、初始化 3、扩容 4、尾插 5、打印 6、销毁 7、尾删 越界&…

php的strstr是什么意思,php strstr函数怎么用

strstr()函数是PHP中的一个内置函数&#xff0c;语法为strstr(string,search,before_search) &#xff0c;用于搜索字符串在另一字符串中是否存在&#xff0c;如果是&#xff0c;返回该字符串及剩余部分&#xff0c;否则返回 FALSE。此函数区分大小写。 php strstr()函数怎么用…

【数据结构】--- kmp算法和strstr函数

kmp算法和strstr函数 引言一、概念分析分析原理分析 KMP算法原理基本操作图解KMP原理 三、复杂度分析四、KMP算法代码 引言 现实生活中&#xff0c;字符串匹配在很多的应用场景里都有着极其重要的作用&#xff0c;包括生物信息学、信息检索、拼写检查、语言翻译、数据压缩、网…

实现strstr函数

strstr函数的作用是寻找子字符串在目标字符串中第一次出现的位置。 #include <stdio.h> #include<stdlib.h> #include<assert.h> const char * Strstr(const char * str1, const char * str2) {assert(str1 ! NULL);assert(str2 ! NULL);char* cur str1;ch…

字符串函数剖析(3)---strstr函数

1.strstr函数的巧妙 – 查找子字符串 1.1模拟实现strstr函数 strstr函数&#xff1a;在一个字符串中查找子串 学习新函数时&#xff0c;先去c库查找该函数的相关资料&#xff0c;更加助于你的学习 const char * strstr ( const char * str1, const char * str2 );先看函数…

C语言strstr()函数用法-字符串查找

1.函数定义 strstr()函数是一个参数为两个字符指针类型&#xff0c;返回值是char*类型的函数。 用于找到子串&#xff08;str2&#xff09;在一个字符串&#xff08;str1&#xff09;中第一次出现的位置&#xff08;不包括str2的串结束符&#xff09;&#xff0c;并返回该位置…

ConcurrentHashMap 实现原理

一. ConcurrentHashMap 是什么 在并发编程中&#xff0c;ConcurrentHashMap 是一个经常被使用的数据结构&#xff0c;相比于 Hashtable 以及Collections.synchronizedMap() 来说&#xff0c;ConcurrentHashMap 在线程安全的基础上提供了更好的写并发能力&#xff0c;同时还降低…

ConcurrentHashMap 详解

前言 ConcurrentHashMap。 以下的技术点都基于JDK1.8~ 基础回顾 我们都知道&#xff0c;从JDK1.8起&#xff0c;ConcurrentHashMap底层的数据结构就已经从原来的Segment分段锁变为了数组 链表 红黑树的形态。 它是一款并发容器&#xff0c;一款装数据的容器在并发环境下铁…

ConcurrentHashMap介绍

引言 学习ConcurrentHashMap&#xff0c;合理的问题顺序应该如下&#xff1a; ConcurrentHashMap是什么&#xff08;WHAT&#xff09;为什么要有ConcurrentHashMap&#xff08;WHY&#xff09;ConcurrentHashMap的实现原理&#xff08;HOW&#xff09;ConcurrentHashMap如何使…

一文彻底弄懂ConcurrentHashMap

一文彻底弄懂ConcurrentHashMap 导读前言锁synchronizedvolatile&#xff08;非锁&#xff09;自旋锁分段锁ReentrantLockCAS ConcurrentHashMap 实现原理JDK1.7 中的 ConcurrentHashMapSegmentConcurrentHashMap 并发读写的几种情况get 方法put 方法 JDK1.8 中的 ConcurrentHa…

ConcurrentHashMap杂谈

为什么使用ConcurrentHashMap 在并发编程中使用HashMap可能导致程序死循环&#xff0c;而使用线程安全的HashTable效率又非常低下 线程不安全的HashMap 在多线程环境下&#xff0c;使用HashMap进行put操作会引起死循环&#xff0c;导致CPU利用率接近100% 死循环案例&#xf…

图解ConcurrentHashMap

曾经研究过jkd1.5新特性&#xff0c;其中ConcurrentHashMap就是其中之一&#xff0c;其特点&#xff1a;效率比Hashtable高&#xff0c;并发性比hashmap好。结合了两者的特点。 集合是编程中最常用的数据结构。而谈到并发&#xff0c;几乎总是离不开集合这类高级数据结构的支…

Java集合:ConcurrentHashMap

本篇内容包括&#xff1a;ConcurrentHashMap 概述、ConcurrentHashMap 底层数据结构、ConcurrentHashMap 的使用以及相关知识点。 一、ConcurrentHashMap 概述 ConcurrentHashMap 是 HashMap 的线程安全版本&#xff0c;其内部和 HashMap 一样&#xff0c;也是采用了数组 链表…

Hashtable与ConcurrentHashMap区别

ConcurrentHashMap融合了hashtable和hashmap二者的优势。 hashtable是做了同步的&#xff0c;hashmap未考虑同步。所以hashmap在单线程情况下效率较高。hashtable在的多线程情况下&#xff0c;同步操作能保证程序执行的正确性。 但是hashtable每次同步执行的时候都要锁住整个结…

ConcurrentHashMap 面试题

作者&#xff1a;程序员库森 链接&#xff1a;https://www.nowcoder.com/discuss/591527?source_idprofile_create_nctrack&channel-1 来源&#xff1a;牛客网 本文汇总了常考的 ConcurrentHashMap 面试题&#xff0c;面试 ConcurrentHashMap&#xff0c;看这一篇就够了…

Hashmap和ConcurrentHashmap的区别

HashTable &#xff08;1&#xff09;底层数组链表实现&#xff0c;无论key还是value都不能为null&#xff0c;线程安全&#xff0c;实现线程安全的方式是在修改数据时锁住整个HashTable&#xff0c;效率低&#xff0c;ConcurrentHashMap做了相关优化 &#xff08;2&#xff0…

ConcurrentHashMap的作用与用法

ConcurrentHashMap的作用与用法 一.ConcurrentHashMap简介 ConcurrentHashMap是属于JUC工具包中的并发容器之一&#xff0c;在多线程开发中很经常会使用到这个类&#xff0c;它与HashMap的区别是HashMap是线程不安全的&#xff0c;在高并发的情况下&#xff0c;使用HashMap进行…