#数据结构(一)

 线性表

  • 两者都属于线性表
  • 线性表:逻辑结构------必连续
  •       物理结构------不一定连续
  • 顺序表的物理结构 -----连续 ,链表的物理结构 ----不连续
  • 顺序表的本质是数组,数组是一块地址连续的空间。而链表只是像细线一样,将不同地址的节点串起来。(通过next指针实现)
  • 若需要经常头删,链表更合适
  • 顺序表可以通过下标,随机访问
     

一.顺序表

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

代码实现

1初始化:

在声明线性表的顺序存储结构,定义一个数组来存储顺序表的所有元素,还定义一个整形变量size来存储顺序表的实际长度

#include <stdio.h>
typedef int datatype;//定义类型int,别名为datatype
#define M 100typedef struct{datatype data[M];int size;
} seqlist;
2 创造顺序表

传参一个结构体类型的指针,一个数组用于赋值,数组长度

int Creatlist(seqlist* p, datatype a[], int n) {//创造顺序表if (n > M) {printf_s("顺序表空间不够");return 0;}for (int i = 0; i < n; i++) {p->data[i] = a[i];p->size = n;}return 1;
}
3 判断是否为空
int Empty(seqlist* p) {//判断是不是空的if (p->size == 0) return 1;else return 0;
}
4遍历输出
void Printlist(seqlist* p) {//遍历输出for (int i = 0; i < p->size; i++) {printf_s("%d ", p->data[i]);}printf_s("\n");
}
5 查找索引位置

传入结构体指针,数据,再进行遍历

int Locate(seqlist* p,datatype x) {//查找这个数在第几个位置for (int i = 0; i < p->size; i++) {if (p->data[i] == x) {return i + 1;}}return 0;
}
6 删除

删除固定索引位置的元素,需判断索引位置

int Delect(seqlist* p, int i) {//i是第几个数从:1开始到,删除if (i<1 || i>p->size) {printf_s("删除失败");return 0;}if (p->size == 0)return 0;//*x = p->data[i - 1];for (int j = i; j < p->size; j++) {p->data[j] = p->data[j + 1];}p->size -= 1;return 1;
}
7 在固定位置插入

在固定索引位置插入,需进行判断索引是否存在

int Insert(seqlist* p, int i, datatype x) {//i是第几个位置,数据x插入if (i<1 || i>p->size) { printf_s("位置错误,插入失败"); return 0; }if (p->size > M) { printf_s("上溢错误,插入失败"); return 0; }//12345for (int j = p->size; j >= i; j--) {p->data[j] = p->data[j - 1];}p->data[i - 1] = x;p->size++;return 1;
}

二 单链表

单链表是一种链式的存储结构,逻辑上相邻的元素的存储位置是通过指针连接的,因而每个节点的存储位置可以任意安排不需要相邻,所以插入删除操作只需要修改相关节点的指针域即可,

 补充:单链表有带头结点和不带头结点两种类型。

通常每个链表带有一个头节点,并通过头结点的指针唯一标识该链表,称之为头指针,相应的指向首节点或者开始节点的指针称为首指针,指向尾节点的称为尾指针。

  • 引入头结点的好处:①便于第一个结点的处理:增加头结点后,第一个结点的地址保存在头结
  • 点的指针域中,则对链表的第一个元素的操作和其他元素相同,无需进行特殊处理。
  • (若单链表不带头结点,则第一个结点无前驱结点,在其前插入结点和删除该结点操作复杂些。)
  • ②便于空表和非空表的统一处理:增加头结点后,无论链表是否为空,头指针都是指向头结点的非空指针。

1 初始化
#include <stdio.h>
#include <malloc.h>typedef int ElemType;typedef struct LNode {ElemType data;//数值域struct LNode *next;//指针域
} LinkNode;
2 头插法创建单链表

头插法的核心点是一直在头节点的后面添加元素,导致单链表是倒置的。

void CreatHeadMethod(LinkNode *&L, ElemType arr[], int len) {//传入链表,数组,数组长度LinkNode *s;//创建一个结构体指针节点(插入节点)L = (LinkNode *) malloc(sizeof(LinkNode));//为头节点开辟空间L->next = NULL;//头节点的指针域初始化为空for (int i = 0; i < len; i++) {s = (LinkNode *) malloc(sizeof(LinkNode));//为插入节点开辟空间s->data = arr[i];//数值域赋值s->next = L->next;L->next = s;//指针域连接}
}
3 尾插法创建单链表

存在一个工具指针一直指向最后的节点,便于在最后添加元素。

元素添加完向后赋值。

void CreatTailMethod(LinkNode *&L, ElemType arr[], int len) {LinkNode *s, *tail;//工作指针L = (LinkNode *) malloc(sizeof(LinkNode));//头节点开辟空间L->next = NULL;//头结点的初始化tail = L;//初始化(头节点不可进行更改)for (int i = 0; i < len; i++) {s = (LinkNode *) malloc(sizeof(LinkNode));s->data = arr[i];tail->next = s;tail = s;//tail不断更替为新插入的节点}tail->next = NULL;
}
4 遍历输出单链表
void ListPList(LinkNode *L) {LinkNode *p = L->next;while (p != NULL) {printf("%d ", p->data);p = p->next;}
}
5 销毁单链表
void Destroy(LinkNode *&L) {LinkNode *S;//工具节点S = L->next;//指向L的下一个节点(前节点)while (S != NULL) {//前节点不为空free(L);//释放后面的L = S;S = L->next;}free(L);//把最后一个不为空的前节点释放
}
6 删除
bool ListDelete(LinkNode *&L, int i, ElemType &e) {int j = 0;LinkNode *p = L, *q;if (i <= 0)return false;        //i错误返回假while (j < i - 1 && p != NULL)    //查找第i-1个结点{j++;p = p->next;}if (p == NULL)                //未找到位序为i-1的结点return false;else                        //找到位序为i-1的结点p{q = p->next;                //q指向要删除的结点if (q == NULL)return false;        //若不存在第i个结点,返回falsee = q->data;p->next = q->next;        //从单链表中删除q结点free(q);                //释放q结点return true;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/450559.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW提高开发效率技巧----VI继承与重载

在LabVIEW开发中&#xff0c;继承和重载是面向对象编程&#xff08;OOP&#xff09;中的重要概念。通过合理运用继承与重载&#xff0c;不仅能提高代码的复用性和灵活性&#xff0c;还能减少开发时间和维护成本。下面从多个角度介绍如何在LabVIEW中使用继承和重载&#xff0c;并…

萤石云服务支持云端视频AI自动剪辑生成

萤石视频云存储及媒体处理服务是围绕IoT设备云端存储场景下的音视频采集、媒体管理、视频剪辑和分发能力的一站式、专业云服务&#xff0c;并可面向广大开发者提供复杂设备存储场景下的完整技术方案。目前该服务新增了视频剪辑功能&#xff0c;支持将视频片段在云端进行裁剪并拼…

sentinel dashboard分布式改造落地设计实现解释(二)-分布式discovery组件

discovery discovery负责维护app/机器资料库&#xff0c;transport健康检测&#xff0c; transport上下线处理。discovery关键是分布式存储&#xff0c;后续研究一下raft&#xff0c;其复制&#xff0c;状态机&#xff0c;快照技术&#xff0c;但个人觉得&#xff0c;discover…

胤娲科技:AI短视频——创意无界,即梦启航

在这个快节奏的时代&#xff0c;你是否曾梦想过用几秒钟的短视频&#xff0c;捕捉生活中的每一个精彩瞬间&#xff1f;是否曾幻想过&#xff0c;即使没有专业的摄影和剪辑技能&#xff0c;也能创作出令人惊艳的作品&#xff1f; 现在&#xff0c;这一切都不再是遥不可及的梦想。…

基于光度学的小型视触觉传感器的开发

近年来&#xff0c;视觉触觉传感器&#xff08;VTS&#xff09;在机器人领域得到了广泛关注。传统的触觉传感器如压阻式、压电式和电容式触觉传感器在机器人感知方面有显著优势&#xff0c;但其分辨率相对较低。视触觉传感器使用相机获取触觉信息&#xff0c;能够提供高分辨率和…

执行jar文件no main manifest attribute错误

执行jar文件no main manifest attribute错误 问题是由于maven打包时候没有指定主启动程序&#xff0c;或下方配置中多余true配置跳过主程序配置 对应找到build中的所有有关true的删除&#xff0c;再重新打包即可

open-cd中的changerformer网络结构分析

open-cd 目录 open-cd1.安装2.源码结构分析主干网络1.1 主干网络类2.neck2.Decoder3.测试模型6. changer主干网络 总结 该开源库基于&#xff1a; mmcv mmseg mmdet mmengine 1.安装 在安装过程中遇到的问题&#xff1a; 1.pytorch版本问题&#xff0c;open-cd采用的mmcv版本比…

Axure重要元件一——动态面板

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 本节课&#xff1a;动态面板 课程内容&#xff1a;认识动态面板、动态面板基本操作 应用场景&#xff1a;特定窗口、重要交互、长页面、容器等 一、认识动态面板 动态…

flutter TabBar自定义指示器(带文字的指示器、上弦弧形指示器、条形背景指示器、渐变色的指示器)

带文字的TabBar指示器 1.绘制自定义TabBar的绿色带白色文字的指示器 2.将底部灰色文字与TabrBar层叠&#xff0c;并调整高度位置与胶囊指示器重叠 自定义的带文字的TabBar指示器 import package:atui/jade/utils/JadeColors.dart; import package:flutter/material.dart; im…

用户界面设计:视觉美学与交互逻辑的融合

1、什么是用户界面 用户界面&#xff08;UI&#xff09;是人与机器之间沟通的桥梁&#xff0c;同时也是用户体验&#xff08;UX&#xff09;的重要组成部分。用户界面设计包括两个核心要素&#xff1a;视觉设计&#xff08;即产品的外观和感觉&#xff09;和交互设计&#xff…

【JavaEE初阶】深入理解TCP协议中的封装分用以及UDP和TCP在网络编程的区别

前言 &#x1f31f;&#x1f31f;本期讲解关于TCP/UDP协议的原理理解~~~ &#x1f308;上期博客在这里&#xff1a;【JavaEE初阶】入门视角-网络原理的基础理论的了解-CSDN博客 &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; …

Android Framework AMS(09)service组件分析-3(bindService和unbindService关键流程分析)

该系列文章总纲链接&#xff1a;专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;上上一章节主要解读应用层service组件启动的2种方式startService和bindService&#xff0c;以及从APP层到AMS调用之间的打通。上一章节我们关注了s…

K-means 算法、层次聚类、密度聚类对鸢尾花(Iris)数据进行聚类

目录 1.基础知识 1.1 K-Means 算法 1.2 层次聚类&#xff08;Hierarchical Clustering&#xff09; 1.3 密度聚类&#xff08;DBSCAN&#xff09; 1.4 距离和相似度度量方法 1.5 总结&#xff1a; 2.K-means 算法对鸢尾花&#xff08;Iris&#xff09;数据进行聚类 2.1…

【动手学电机驱动】TI InstaSPIN-FOC(5)Lab04 电机力矩闭环控制

TI InstaSPIN-FOC&#xff08;1&#xff09;电机驱动和控制测试平台 TI InstaSPIN-FOC&#xff08;2&#xff09;Lab01 闪灯实验 TI InstaSPIN-FOC&#xff08;3&#xff09;Lab03a 测量电压电流漂移量 TI InstaSPIN-FOC&#xff08;4&#xff09;Lab02b 电机参数辨识 TI Insta…

智慧供排水管网在线监测为城市安全保驾护航

一、方案背景 随着城市化进程的不断推进&#xff0c;城市供排水管网作为城市基础设施的关键组成部分&#xff0c;其安全稳定的运行对于确保城市居民的日常生活、工业生产活动以及整个生态环境的健康具有至关重要的作用。近年来&#xff0c;由于各种原因&#xff0c;城市供排水管…

Mycat 详细介绍及入门实战,解决数据库性能问题

一、基本原理 1、数据分片 &#xff08;1&#xff09;、水平分片 Mycat 将一个大表的数据按照一定的规则拆分成多个小表&#xff0c;分布在不同的数据库节点上。例如&#xff0c;可以根据某个字段的值进行哈希取模&#xff0c;将数据均匀的分布到不同的节点上。 这样做的好处…

安卓开发中轮播图和其指示器的设置

在安卓开发中&#xff0c;轮播图&#xff08;Carousel&#xff09;是一种常见的UI组件&#xff0c;用于展示一系列图片或内容&#xff0c;用户可以左右滑动来切换不同的视图。轮播图通常用于展示广告、新闻、产品图片等。 轮播图的指示器&#xff08;Indicator&#xff09;则是…

k3s安装指定版本以及离线安装(docker)

首先下载你所需要版本的k3s安装包&#xff0c;目录结构如下所示&#xff0c;我这里是v1.19.15k3s2。 1.首先赋予可执行权限后进行安装。 # k3s 需要赋予可执行权限 sudo chmod x k3s sudo chmod x k3s-install.sh2.然后将k3s的二进制文件复制到/usr/local/bin/ cp k3s /us…

【Kafka】Kafka源码解析之producer过程解读

从本篇开始 打算用三篇文章 分别介绍下Producer生产消费&#xff0c;Consumer消费消息 以及Spring是如何集成Kafka 三部分&#xff0c;致于对于Broker的源码解析&#xff0c;因为是scala语言写的&#xff0c;暂时不打算进行学习分享。 总体介绍 clients : 保存的是Kafka客户端…

华为携手竹云发布海外一网通办解决方案,助力海外政务数智化发展

10月14日&#xff0c;第44届GITEX GLOBAL展会&#xff08;GITEX GLOBAL 2024&#xff09;在迪拜世界贸易中心盛大开幕。作为全球最具影响力的科技和创业盛会之一&#xff0c;本届活动吸引180多个国家的6500余家全球知名企业集聚迪拜&#xff0c;展示涵盖人工智能、网络安全、移…