顺序表的创建

article/2025/8/22 5:14:40

三个朋友今天全部上岸大厂,祝贺。(太羡慕了)

静态分配创建一个顺序表;

1.顺序表的定义:

#define MaxSize 10
typedef struct {ElemType data[MaxSize];int length;
}SqlList;

这里我们用结构体的方式定义以一个顺序表;用静态数组存放数据元素;定义一个存放表长度的变量;这里我们用了静态分配的方式定义了一个顺序表;

2.顺序表的初始化

#include<stdio.h>
#include<math.h>
#include<iostream>
#include<string.h>
using namespace std;#define MaxSize 10
typedef struct {int data[MaxSize];int length;
}SqlList;
//初始化一个顺序表
void InitList(SqlList &L) {for(int i = 0; i<MaxSize; i++) {L.data[i] = 0;}L.length = 0;
}
int main() {SqlList L;InitList(L); return 0;
}

在main函数声明一个顺序表,这时候计算机就会为它分配一段连续的空间;这里分配的内存空间的大小就是MaxSIze*sizeof(数据类型);
还有一个点比较重要:
就是这段代码:

for(int i = 0; i<MaxSize; i++) {L.data[i] = 0;}

可能会想有必要吗?

#include<stdio.h>
#include<math.h>
#include<iostream>
#include<string.h>
using namespace std;#define MaxSize 10
typedef struct {int data[MaxSize];int length;
}SqlList;
//初始化一个顺序表
void InitList(SqlList &L) {L.length = 0;
}
int main() {SqlList L;InitList(L); for(int i = 0;i<MaxSize;i++){printf("data[%d] = %d\n",i,L.data[i]);} return 0;
}

我跑一下,你看看结果!!!
在这里插入图片描述
不初始化数组会出现内存中遗留的数据,这些“脏数据”当然不是我们想要的;原因是c它自己创建一个数组的时候不会初始化数组的元素;(这个自己一定要注意,java就没有这样的烦恼);
咱们静态创建一个顺序表,最大的坏处就是你没有办法衡量你的顺序表的长度,导致我们代码的健壮性是相当的差劲了;

指针即为地址,指针几个字节跟语言无关,而是跟系统的寻址能力有关;32位占4个字节,64位占8个字节;

#include<stdio.h>
#include<math.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;#define InitSize 10
typedef struct {int *data;//指示动态分配数组的指针 int MaxSize;//顺序表的最大容量 int length;//顺序表当前的长度 
} SeqList;//顺序表的类型定义(动态分配) 
//初始化一个顺序表
void InitList(SqlList &L) {L.data = (int *)malloc(InitSize*sizeof(int));L.length = 0;L.MaxSize = InitSize;
}
//动态增加数组的长度
void IncreaseSize(SeqList &L,int len){int *p = L.data;L.data=(int*)malloc((L.MaxSize+len)*sizeof(int));for(int i =0;i<L.length;i++){L.data[i] = p [i];}L.MaxSize = L.MaxSize + len;free(p);
} 
int main() {SqlList L;InitList(L);IncreaseSize(L,5);return 0;
}

malloc函数感觉挺好用的,数组的动态扩容比较重要;

void IncreaseSize(SeqList &L,int len){int *p = L.data;L.data=(int*)malloc((L.MaxSize+len)*sizeof(int));for(int i =0;i<L.length;i++){L.data[i] = p [i];}L.MaxSize = L.MaxSize + len;free(p);
} 

上次写还是大一了(惭愧);

#include<stdio.h>
#include<math.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;#define InitSize 10
typedef struct {int *data;//指示动态分配数组的指针int MaxSize;//顺序表的最大容量int length;//顺序表当前的长度
} SeqList;//顺序表的类型定义(动态分配)
//初始化一个顺序表
void InitList(SeqList &L) {L.data = (int *)malloc(InitSize*sizeof(int));L.length = 0;L.MaxSize = InitSize;
}
//动态增加数组的长度
void IncreaseSize(SeqList &L,int len) {int *p = L.data;L.data=(int*)malloc((L.MaxSize+len)*sizeof(int));for(int i =0; i<L.length; i++) {L.data[i] = p [i];}L.MaxSize = L.MaxSize + len;free(p);
}
//插入操作
bool ListInsert(SeqList &L,int i,int e) {if(i<1 || i>L.length+1) {printf("数据规格错误");return false;}if(L.length >= L.MaxSize) {printf("当前存储空间已满,不能插入");return false;}for(int j = L.length; j>=i; j--) {L.data[j] = L.data[j-1];}L.data[i-1] = e;L.length++;return true;
}
//删除操作
bool ListDelete(SeqList &L,int i,int &e) {if(i<1 || i>L.length) {printf("数据规格不合法");return false;}e  = L.data[i-1];for(int j = i; j< L.length; j++ ) {L.data[j-1] = L.data[j];}L.length--;return true;
}
//顺序表的按位查找
void getList(SeqList L,int i) {if(i<1 || i>L.length) {printf("数据元素不合法\n");}else{printf("查找到的数据是%d\n",L.data[i-1]);}
}
//s顺序表按值查找
int *LocateElem(SeqList L,int e){static int a[10];int flag = 0;for(int i = 0;i<L.length;i++){if(L.data[i] == e){a[flag] = i;flag++;}}return a; 
}
//顺序表正序输出
void print(SeqList L){for(int i = 0;i < L.length ;i++){printf("data[%d]=%d\n",i,L.data[i]);}
} 
int main() {SeqList L;InitList(L);ListInsert(L,1,1);ListInsert(L,2,3);ListInsert(L,3,3);ListInsert(L,4,3);print(L);int *a= LocateElem(L,3);for(int i = 0 ;i<10;i++){if(*(a+i)!= 0){printf("%d\n",*(a+i));	}}return 0;
}

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

相关文章

顺序表的详解

线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串.... 即顺序表为线性表的一种&#xff0c; 顺序表是一种物理地址连续的存储单元依次存储数据元素的线性结构&#…

什么是顺序表

顺序表 在程序中&#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…