c语言数据结构与算法--简单实现线性表(顺序表+链表)的插入与删除
老规矩,点赞+评论+收藏+关注!!!
目录
线性表
其特点是:
算法实现:
运行结果展示
链表
插入元素:
删除元素:
算法实现
运行结果
线性表是由n个数据元素组成的有限序列,每个元素都有唯一的下标,下标从0开始递增。线性表的元素之间存在一对一的线性关系,即除首元素外,每个元素有且只有一个前驱元素,除尾元素外,每个元素有且只有一个后继元素。线性表可以通过顺序存储或链式存储来实现。线性表的基本操作包括初始化、创建、增加、删除和查找等。
顺序表和链表是线性表的两种实现方式,都是用来存储逻辑关系为“一对一”的数据。它们的相同点是:都是线性表结构;元素逻辑存储上是连续的;每个元素都有唯一的前驱和唯一的后继。它们的不同点是:底层存储空间不一样,顺序表底层存储空间是连续的,而链表则是不连续的;插入和删除方式不同,顺序表任意位置进行插入和删除操作,需要搬运大量的元素,效率低,时间复杂度为O(N)。顺序表集中存储数据,适合访问、遍历数据,在数据量确定时空间利用率高;链表通过指针链接数据,适合插入、删除数据,在数据量不确定时空间利用率高。
线性表
线性表的顺序表示是指用一组地址连续的存储单元依次存储线性表的数据元素。
其特点是:
1.第 i 个元素 a i 的存储位置可以用公式计 LOC(a i) = LOC(a1)+(i-1)*L
其中 LOC(a1)第一个元素a1 的存储位置,L 每个元素需占的存储单元
2.表中相邻的元素 a i和 a i+1赋以相邻的存 储位置 LOC(a i)和 LOC(a i+1)
3.是一种随机存储结构:只要知道线性表的 起始位置就可随机存取线性表中的任一元素。
当我们要在线性表的顺序存储结构上的第 i 个位置上插入一个元素时,必须先将 线性表第 i 个元素之后的所有元素依次后移一个位置,以便腾空一个位置,再把新元素插入到该位置。若要删除第 i 个元素时,也必须把第 i 个元素之后的所有元素前 移一个位置。
算法实现:
1、引入头文件、定义结构体
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define INIT_SIZE 100 //初始分配量
#define INCRE_SIZE 10 //分配增量typedef struct {int *pList;int length;int listSize;
}SqList;
2、创建顺序表
//顺序表的创建
void initial(SqList &L) { //使pList指向连续存储空间的首地址L.pList = (int*)malloc(INIT_SIZE * sizeof(int));L.length = 0; //目前元素的个数为0L.listSize = INIT_SIZE; //空间最大存储的数量
}
3、定义插入函数
//第i个元素前插入e
void insert(int e,SqList &L,int i) {if (i <= L.length || L.length < L.listSize) {//将第i个元素开始依次往后移动一个位置,将L[i-1]的位置腾出for (int curIndex = L.length - 1; curIndex >= i - 1; --curIndex) {L.pList[curIndex + 1] = L.pList[curIndex];}L.pList[i - 1] = e;++L.length; //多存了个数据,元素个数加一}
}
4、定义删除函数
void delete_(SqList &L,int i) {if (i <= L.length || L.length < L.listSize) {//将第i个元素开始依次往后移动一个位置for (int curIndex = i-1; curIndex <= L.length; ++curIndex) {L.pList[curIndex] = L.pList[curIndex + 1];}--L.length; //多存了个数据,元素个数减一}
}
5、初始化输入表
//初始输入表
void initial_list(SqList* L) {int n,d;printf("请输入输入数字个数n(大于1的整数):");scanf_s("%d", &n);while (1) {if (n <= 0) {printf("请输入大于0的整数!!!");scanf_s("%d", &n);}else {break;}}//printf("%d", n);for (int i = 0; i <= n-1; i++) {printf("请输入第%d个数:",i+1);scanf_s("%d",&d);L->pList[i] = d;}L->length = n;
}
6、定义打印函数
//打印数组
void print_function(SqList L) {for (int i = 0; i < L.length; i++) {printf("%d ", L.pList[i]);}printf("\n");
}
7、主函数
int main() {SqList L;initial(L);initial_list(&L);printf("原数组:\n");print_function(L);printf("\n");while (1) {printf("请输入0/1/2对线性表进行操作(0是退出,1是插入,2是删除):\n");int num;scanf("%d", &num);if (num == 1) {printf("现在进入插入环节,请指定插入元素与插入位置:\n");int i, n;scanf("%d %d", &i, &n);insert(i, L, n);printf("插入后的数组:\n");print_function(L);}else if (num == 2) {printf("现在进入删除环节,请指定删除要元素位置:\n");int n;scanf("%d",&n);delete_(L, n);printf("删除后的数组:\n");print_function(L);}else if (num == 0) {break;}else {printf("请输入正确的操作(输入0/1/2)\n");}}return 0;
}
运行结果展示
输入数字个数n,并输入这n个数
选择下一步操作(0退出,1插入,2删除)
链表
双向链表
结点有两个指针域:一个指向直接后继,另一个指向直接前驱。目的是克服单链 表的单向寻查的缺点。
插入元素:
当插入数据元素时,首先生成一个结点,结点的数据域为插入的元素;然后找到元素的插入位置;最后修改指针域。例如下图中,在 p 结点后插入新生 成结点 s,则修改指针的语句为:
s ->data = e; s->next = p->next; p->next = s;
删除元素:
当删除数据元素时,仅修改待删除结点的前一个结点的指针。例如下 图中,待删除的结点为 q,q 的前一个结点为 p,删除后结点 q 的数据赋给 e,则修改 指针的语句为:
q= p ->next; p->next = q->next; e = q-> data; free(q);
算法实现
1、头文件、结构体的定义
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h> typedef struct Node {int data;struct Node* prior;struct Node* next;
} Node;
2、双链表中添加节点
// 在双链表末尾添加节点
void append(Node** head, int data) {Node* newNode = createNode(data);if (*head == NULL) {*head = newNode;}else {Node* temp = *head;while (temp->next != NULL) {temp = temp->next;}temp->next = newNode;newNode->prior = temp;}
}
3、定义打印函数
// 打印双链表
void printList(Node* head) {Node* temp = head;while (temp != NULL) {printf("%d ", temp->data);temp = temp->next;}printf("\n");
}
4、指定位置插入元素
// 在指定位置插入节点
void insertAtPosition(Node** head, int position, int data) {Node* newNode = createNode(data);if (position == 1) {newNode->next = *head;if (*head != NULL) {(*head)->prior = newNode;}*head = newNode;}else {Node* temp = *head;for (int i = 1; temp != NULL && i < position - 1; i++) {temp = temp->next;}if (temp == NULL) {printf("Position out of bounds\n");free(newNode);return;}newNode->next = temp->next;newNode->prior = temp;if (temp->next != NULL) {temp->next->prior = newNode;}temp->next = newNode;}
}
5、删除元素
// 删除指定值的节点
void deleteValue(Node** head, int data) {Node* temp = *head;Node* prior = NULL;while (temp != NULL && temp->data != data) {prior = temp;temp = temp->next;}if (temp == NULL) {printf("Value not found\n");return;}if (prior == NULL) {*head = temp->next;}else {prior->next = temp->next;}if (temp->next != NULL) {temp->next->prior = prior;}free(temp);
}
6、主函数
int main() {Node* list = NULL;int n, choice, position, data;printf("请输入数字n: ");scanf("%d", &n);printf("请输入%d个数字:\n", n);for (int i = 0; i < n; i++) {int num;scanf("%d", &num);append(&list, num);}printf("当前列表: ");printList(list);printf("请输入1和2选择操作(1:插入 2:删除)\n");scanf("%d", &choice);if (choice == 1) {printf("请输入插入位置和插入的数字: ");scanf("%d %d", &position, &data);insertAtPosition(&list, position, data);}else if (choice == 2) {printf("请输入要删除的数字: ");scanf("%d", &data);deleteValue(&list, data);}else {printf("无效选择\n");}printf("最终列表: ");printList(list);// 释放链表内存 Node* temp;while (list != NULL) {temp = list;list = list->next;free(temp);}return 0;
}
运行结果
输入数字个数n,并依次输入这n个元素
选择下一步操作(1插入,2删除)
您的点赞和关注是我持续更新下去的动力!!
相关文章:

c语言数据结构与算法--简单实现线性表(顺序表+链表)的插入与删除
老规矩,点赞评论收藏关注!!! 目录 线性表 其特点是: 算法实现: 运行结果展示 链表 插入元素: 删除元素: 算法实现 运行结果 线性表是由n个数据元素组成的有限序列ÿ…...

MySQL底层概述—1.InnoDB内存结构
大纲 1.InnoDB引擎架构 2.Buffer Pool 3.Page管理机制之Page页分类 4.Page管理机制之Page页管理 5.Change Buffer 6.Log Buffer 1.InnoDB引擎架构 (1)InnoDB引擎架构图 (2)InnoDB内存结构 (1)InnoDB引擎架构图 下面是InnoDB引擎架构图,主要分为内存结构和磁…...

MySQL:DATEDIFF()计算两个日期天数之差
题目需求: 计算出比前一天温度要高的日期。 select a.id from weather a, weather b where a.temperature > b.temperature and datediff(a.recordDate, b.recordDate) 1; DATEDIFF(date1, date2)函数用于计算两个日期之间的天数差。函数返回date1和date2之…...

Linux 编译Ubuntu24内核
参考来源: 编译并更新内核:https://www.cnblogs.com/smlile-you-me/p/18248433 编译报错–sub-make: https://forum.linuxfoundation.org/discussion/865005/facing-error-in-building-the-kernel 1.下载源码,执行如下命令,会在/usr/src下多…...

Android系统中init进程、zygote进程和SystemServer进程简单学习总结
Android系统中,init、zygote和SystemServer进程是系统启动和运行的关键进程,它们之间有着密切的关系,本文针对这三个进程的学习做一个简单汇总,方便后续查询。 1、init进程 Android用户空间执行的第一个程序就是它,可…...

Flask 基于wsgi源码启动流程
1. 点击 __call__ 进入到源码 2. 找到 __call__ 方法 return 执行的是 wsgi方法 3. 点击 wsgi 方法 进到 wsgi return 执行的是 response 方法 4. 点击response 方法 进到 full_dispatch_request 5. full_dispatch_request 执行finalize_request 方法 6. finalize_request …...

leetcode代码 50道答案
简单难度:两数之和 def twoSum(nums, target): for i in range(len(nums)): for j in range(i 1, len(nums)): if nums[i] nums[j] target: return [i, j] return [] 简单难度:有效的括号 def isVa…...

Centos-stream 9,10 add repo
Centos-stream repo前言 Centos-stream 9,10更换在线阿里云创建一键更换repo 自动化脚本 华为centos-stream 源 , 阿里云centos-stream 源 华为epel 源 , 阿里云epel 源vim /centos9_10_repo.sh #!/bin/bash # -*- coding: utf-8 -*- # Author: make.h...

【隐私计算大模型】联邦深度学习之拆分学习Split learning原理及安全风险、应对措施以及在大模型联合训练中的应用案例
Tips:在两方场景下,设计的安全算法,如果存在信息不对等性,那么信息获得更多的一方可以有概率对另一方实施安全性攻击。 1. 拆分学习原理 本文介绍了一种适用于隐私计算场景的深度学习实现方案——拆分学习,又称分割…...

DataWhale—PumpkinBook(TASK05决策树)
课程开源地址及相关视频链接:(当然这里也希望大家支持一下正版西瓜书和南瓜书图书,支持文睿、秦州等等致力于开源生态建设的大佬✿✿ヽ(▽)ノ✿) Datawhale-学用 AI,从此开始 【吃瓜教程】《机器学习公式详解》(南瓜…...

elasticsearch7.10.2集群部署带认证
安装elasticsearch rpm包安装 下载地址 https://mirrors.aliyun.com/elasticstack/7.x/yum/7.10.2/ 生成证书 #1.生成CA证书 # 生成CA证书,执行命令后,系统还会提示你输入密码,可以直接留空 cd /usr/share/elasticsearch/bin ./elasticsearch-certutil ca#会在/usr/share/el…...

Java基础-I/O流
(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 字节流 定义 说明 InputStream与OutputStream示意图 说明 InputStream的常用方法 说明 OutputStrea…...

全面解析多种mfc140u.dll丢失的解决方法,五种方法详细解决
当你满心期待地打开某个常用软件,却突然弹出一个错误框,提示“mfc140u.dll丢失”,那一刻,你的好心情可能瞬间消失。这种情况在很多电脑用户的使用过程中都可能出现。无论是游戏玩家还是办公族,面对这个问题都可能不知所…...

详细探索xinput1_3.dll:功能、问题与xinput1_3.dll丢失的解决方案
本文旨在深入探讨xinput1_3.dll这一动态链接库文件。首先介绍其在计算机系统中的功能和作用,特别是在游戏和输入设备交互方面的重要性。然后分析在使用过程中可能出现的诸如文件丢失、版本不兼容等问题,并提出相应的解决方案,包括重新安装相关…...

InfluxDB时序数据库笔记(一)
InfluxDB笔记一汇总 1、时间序列数据库概述2、时间序列数据库特点3、时间序列数据库应用场景4、InfluxDB数据生命周期5、InfluxDB历史数据需要另外归档吗?6、InfluxDB历史数据如何归档?7、太麻烦了,允许的话选择设施完备的InfluxDB云产品吧8、…...

Spring Boot 3.x + OAuth 2.0:构建认证授权服务与资源服务器
Spring Boot 3.x OAuth 2.0:构建认证授权服务与资源服务器 前言 随着Spring Boot 3的发布,我们迎来了许多新特性和改进,其中包括对Spring Security和OAuth 2.0的更好支持。本文将详细介绍如何在Spring Boot 3.x版本中集成OAuth 2.0…...

2024年09月CCF-GESP编程能力等级认证Scratch图形化编程二级真题解析
本文收录于《Scratch等级认证CCF-GESP图形化真题解析》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 一、单选题(共 10 题,每题 3 分,共 30 分) 第 1 题 据有关资料,山东大学于 1972 年研制成功 DJL-1 计算机,并于 1973 年投入运行,其综合性能居当时全国第…...

Linux 正则表达式(basic and extened)
正则表达式(Regular Expressions),整理自: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html gred sed 定义 Regular Expressions (REs) provide a mechanism to select specific strings from a set of character strings.…...

GB 35114-2017 学习笔记(规避版权阉割版)
GB 35114-2017 学习笔记(规避版权阉割版) openstd.samr.gov.cn 国家标准全文公开系统 这个政府网站提供GB 35114-2017标准的的预览和下载,有需要的自行下载 GB 35114-2017作为一个国家强制标准,在国家标准全文公开系统 自己做个…...

YOLO-FaceV2: A Scale and Occlusion Aware Face Detector
《YOLO-FaceV2:一种尺度与遮挡感知的人脸检测器》 1.引言2.相关工作3.YOLO-FaceV23.1网络结构3.2尺度感知RFE模型3.3遮挡感知排斥损失3.4遮挡感知注意力网络3.5样本加权函数3.6Anchor设计策略3.7 归一化高斯Wasserstein距离 4.实验4.1 数据集4.2 训练4.3 消融实验4.3.1 SEAM块4…...

进程间通信--详解
目录 前言一、进程间通信介绍1、进程间通信目的2、进程间通信发展3、进程间通信的分类4、进程间通信的必要性5、进程间通信的技术背景6、进程间通信的本质理解 二、管道1、什么是管道2、匿名管道pipe(1)匿名管道的原理(2)pipe函数…...

零基础上手WebGIS+智慧校园实例(1)【html by js】
请点个赞收藏关注支持一下博主喵!!! 等下再更新一下1. WebGIS矢量图形的绘制(超级详细!!),2. WebGIS计算距离, 以及智慧校园实例 with 3个例子!!…...

【Github】如何使用Git将本地项目上传到Github
【Github】如何使用Git将本地项目上传到Github 写在最前面1. 注册Github账号2. 安装Git工具配置用户名和邮箱仅为当前项目配置(可选) 3. 创建Github仓库4. 获取仓库地址5. 本地操作(1)进入项目文件夹(2)克隆…...

集合Queue、Deque、LinkedList、ArrayDeque、PriorityQueue详解
1、 Queue与Deque的区别 在研究java集合源码的时候,发现了一个很少用但是很有趣的点:Queue以及Deque; 平常在写leetcode经常用LinkedList向上转型Deque作为栈或者队列使用,但是一直都不知道Queue的作用,于是就直接官方…...

谈一下开源生态对 AI人工智能大模型的促进作用
谈一下开源生态对 AI人工智能大模型的促进作用 作者:开源呼叫中心系统 FreeIPCC,Github地址:https://github.com/lihaiya/freeipcc 开源生态对大模型的促进作用是一个多维度且深远的话题,它不仅加速了技术创新的速度,…...

基于python的机器学习(四)—— 聚类(一)
目录 一、聚类的原理与实现 1.1 聚类的概念和类型 1.2 如何度量距离 1.2.1 数据的类型 1.2.2 连续型数据的距离度量方法 1.2.3 离散型数据的距离度量方法 1.3 聚类的基本步骤 二、层次聚类算法 2.1 算法原理和实例 2.2 算法的Sklearn实现 2.2.1 层次聚类法的可视化实…...

实时数据开发 | 怎么通俗理解Flink容错机制,提到的checkpoint、barrier、Savepoint、sink都是什么
今天学Flink的关键技术–容错机制,用一些通俗的比喻来讲这个复杂的过程。参考自《离线和实时大数据开发实战》 需要先回顾昨天发的Flink关键概念 检查点(checkpoint) Flink容错机制的核心是分布式数据流和状态的快照,从而当分布…...

C++设计模式-策略模式-StrategyMethod
动机(Motivation) 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。 如何在运…...

小程序免备案:快速部署与优化的全攻略
小程序免备案为开发者提供了便捷高效的解决方案,省去繁琐的备案流程,同时通过优化网络性能和数据传输,保障用户体验。本文从部署策略、应用场景到技术实现,全面解析小程序免备案的核心优势。 小程序免备案:快速部署与优…...

Jmeter中的定时器
4)定时器 1--固定定时器 功能特点 固定延迟:在每个请求之间添加固定的延迟时间。精确控制:可以精确控制请求的发送频率。简单易用:配置简单,易于理解和使用。 配置步骤 添加固定定时器 右键点击需要添加定时器的请求…...