数据结构 day02

3. 线性表

3.1. 顺序表

3.1.3. 顺序表编程实现

 操作:增删改查

.h 文件 

#ifndef __SEQLIST_H__
#define __SEQLIST_H__
#define N 10
typedef struct seqlist
{int data[N];int last; //代表数组中最后一个有效元素的下标
} seqlist_t;//1.创建一个空的顺序表
seqlist_t *CreateEpSeqlist();
//2.向顺序表的指定位置插入数据
int InsertIntoSeqlist(seqlist_t *p, int post, int data);
//3.遍历顺序表
void ShowSeqlist(seqlist_t *p);
//4.判断顺序表是否为满,满返回1,未满返回0
int IsFullSeqlist(seqlist_t *p);
//5.判断顺序表是否为空
int IsEpSeqlist(seqlist_t *p);
//6.删除顺序表中指定位置的数据
int DeleteIntoSeqlist(seqlist_t *p, int post);
//7.清空顺序表 (清空:访问不到,但是内存中还有;销毁:内存清空)
void ClearSeqList(seqlist_t *p);
//8.修改指定位置的数据,post为被修改数据位置,data为修改成的数据
int ChangePostSeqList(seqlist_t *p,int post,int data);
//9.查找指定数据出现位置,data为被查找的数据,返回下标,未找到返回-1
int SearchDataSeqList(seqlist_t *p,int data);
#endif

 1.创建一个空的顺序表

#include <stdio.h>
#include "seqlist.h"
#include <stdlib.h>// 1.创建一个空的顺序表
seqlist_t *CreateEpSeqlist()
{// 1. 动态申请一块空间存放顺序表seqlist_t *p = NULL;p = (seqlist_t *)malloc(sizeof(seqlist_t));// 2. 检测空间是否开辟成功if (NULL == p){perror("malloc last!");return NULL;}else{// 空间开辟成功,对last初始化printf("malloc success!\n");p->last = -1;return p;}
}

2.向顺序表的指定位置插入数据

#include <stdio.h>
#include "seqlist.h"// 2.向顺序表的指定位置插入数据
int InsertIntoSeqlist(seqlist_t *p, int post, int data)
{// post容错,post范围,顺序表满了if (post > p->last + 1 || post < 0 || IsFullSeqlist(p)){perror("Insert Failed");return -1;}// 从post开始,到last,中间的元素向后移动一位for (int i = p->last; i >=post; i--){p->data[i+1] = p->data[i];}p->data[post] = data;p->last++;return 0;
}

3.遍历顺序表

#include <stdio.h>
#include "seqlist.h"//3.遍历顺序表
void ShowSeqlist(seqlist_t *p)
{for (int i = 0; i <= p->last; i++)printf("%-4d", p->data[i]);printf("\n");
}

4. 判断顺序表是否为满

#include <stdio.h>
#include "seqlist.h"// 4.判断顺序表是否为满,满返回1,未满返回0
int IsFullSeqlist(seqlist_t *p)
{// if (p->last + 1 == N)//     return 1;// else//     return 0;return p->last +1 == N;
}

5. 判断顺序表是否为空

#include <stdio.h>
#include "seqlist.h"// 5.判断顺序表是否为空
int IsEpSeqlist(seqlist_t *p)
{return p->last == -1;
}

 6. 删除顺序表中指定位置的数据

#include <stdio.h>
#include "seqlist.h"// 6.删除顺序表中制定位置的数据
int DeleteIntoSeqlist(seqlist_t *p, int post)
{// 容错判断if (IsEpSeqlist(p) || post < 0 || post > p->last){perror("Delete Failed!");return -1;}// 从下标为post+1 到last的元素向前移动一个单位for (int i = post + 1; i <= p->last; i++)p->data[i - 1] = p->data[i];p->last--;return 0;
}

7. 清空顺序表

#include <stdio.h>
#include "seqlist.h"// 7.清空顺序表 (清空:访问不到,但是内存中还有;销毁:内存清空)
void ClearSeqList(seqlist_t *p)
{p->last = -1;
}

8. 修改指定位置的数据

#include <stdio.h>
#include "seqlist.h"// 8.修改指定位置的数据,post为被修改数据位置,data为修改成的数据
int ChangePostSeqList(seqlist_t *p, int post, int data)
{// 容错判断if (post < 0 || post > p->last || IsEpSeqlist(p)){perror("Change Failed!");return -1;}// 修改指定位置的数据p->data[post] = data;return 0;
}

9. 查找指定数据出现位置

#include <stdio.h>
#include "seqlist.h"// 9.查找制定数据出现位置,data为被查找的数据,返回下标,未找到返回-1
int SearchDataSeqList(seqlist_t *p, int data)
{for (int i = 0; i <= p->last; i++)if (p->data[i] == data)return i;return -1;
}

 main.c

#include <stdio.h>
#include "seqlist.h"
#include <stdlib.h>int main(int argc, char const *argv[])
{// 创建空顺序表seqlist_t *p = NULL;p = CreateEpSeqlist();// 插入数据InsertIntoSeqlist(p, 0, 1);InsertIntoSeqlist(p, 1, 2);InsertIntoSeqlist(p, 2, 3);InsertIntoSeqlist(p, 3, 4);InsertIntoSeqlist(p, 4, 5);// 遍历顺序表ShowSeqlist(p);// 删除指定位置的数据DeleteIntoSeqlist(p, 2);ShowSeqlist(p);// 修改指定位置的数据ChangePostSeqList(p, 1, 999);ShowSeqlist(p);// 查找指定数据的位置printf("post = %d\n", SearchDataSeqList(p, 4));// 清空顺序表ClearSeqList(p);printf("%d\n",IsEpSeqlist(p));// 释放空间free(p);return 0;
}

3.2. 链表 Link

        链表又叫单链表,链式存储结构,用于存储逻辑关系为 “ 一对一 ” 的数据。每个元素配有指针域,存储和访问时通过指针域指向下一个节点的地址。

3.2.1. 链表的特性

逻辑结构:线性结构

存储结构:链式存储

特点:内存可以不连续

解决问题:长度固定,插入和删除操作繁琐

操作:增删改查

struct node_t
{int data;    // 数据域struct node_t next;    // 指针域,存放下一个节点的地址
};

3.2.2. 单向链表

1)有头单向链表

        第一位数据域无效,无法存储数据

2)无头单向链表

        第一位数据域有效

 单向链表的基本操作

 1. 定义结构体数组,作为链表的一个节点

typedef struct Link_list
{int data;struct Link_list *next;
}link_node_t, *link_list_t;

2. 定义链表节点

    link_node_t A = {'a', NULL};link_node_t B = {'b', NULL};link_node_t C = {'c', NULL};link_node_t D = {'d', NULL};

3. 定义头指针

        无头

link_list_t h = &A;

        有头            定义头节点,让头指针指向头节点

link_node_t S = {'\0', &A};
link_list_t h = &S;

4. 遍历链表

        无头

    while (h != NULL){printf("%-4c", h->data);h = h->next;}printf("\n");

        有头

按照有头节点方式遍历

while (h->next != NULL)
{h = h->next;printf("%-4c", h->data);
}

按照无头节点方式遍历

h = h->next;
while(h != NULL)
{printf("%-4c", h->data);h = h->next;
}
 有头单向链表的函数操作

头文件 .h 

#ifndef __LINKLIST_H__
#define __LINKLIST_H__typedef int datatype;
typedef struct node_t
{datatype data;       // 数据域struct node_t *next; // 指针域,指向自身结构体的指针
} link_node_t, *link_list_t;// 1.创建一个空的有头单向链表
link_list_t createEmptyLinkList();
// 2.链表指定位置插入数据
int insertIntoPostLinkList(link_node_t *p, int post, datatype data);
// 3.计算链表的长度。
int lengthLinkList(link_node_t *p);
// 4.遍历链表
void showLinkList(link_node_t *p);
// 5.链表指定位置删除数据
int deletePostLinkList(link_node_t *p, int post);
// 6.判断链表是否为空
int isEmptyLinkList(link_node_t *p);
// 7.清空单向链表
void clearLinkList(link_node_t *p);
// 8.修改指定位置的数据 post 被修改的位置 data修改成的数据
int changePostLinkList(link_node_t *p, int post, datatype data);
// 9.查找指定数据出现的位置 data被查找的数据 //search 查找
int searchDataLinkList(link_node_t *p, datatype data);
// 10.删除单向链表中出现的指定数据,data代表将单向链表中出现的所有data数据删除
int deleteDataLinkList(link_node_t *p, datatype data);
// 11.转置链表
// 解题思想:
//(1) 将头节点与当前链表断开,断开前保存下头节点的下一个节点,
//    保证后面链表能找得到,定义一个q保存头节点的下一个节点,
//    断开后前面相当于一个空的链表,后面是一个无头的单向链表
//(2) 遍历无头链表的所有节点,
//    将每一个节点当做新节点插入空链表头节点的下一个节点
//    (每次插入的头节点的下一个节点位置)
void reverseLinkList(link_node_t *p);
#endif

1. 创建一个空的有头单项链表

link_node_t *createEmptyLinkList()
{link_list_t h = (link_list_t)malloc(sizeof(link_node_t));// 容错判断if (h == NULL){perror("空间开辟失败\n");return NULL;}// 头节点初始化h->next=NULL;return h;
}

2. 链表指定位置插入节点

int insertIntoPostLinkList(link_node_t *p, int post, datatype data)
{link_list_t pnew = NULL; // 指向新节点// 容错判断if(post > lengthLinkList(p) || post < 0){perror("post 范围错误");return -1;}// 创建新节点并初始化pnew = (link_list_t)malloc(sizeof(link_node_t));pnew->data = data;pnew ->next = NULL;// 移动头指针,指向插入位置的前一个节点for(int i = 0; i < post; i++){p = p->next;}// 链接插入节点pnew->next = p->next;p ->next = pnew;return 0;
}

3. 计算链表长度

int lengthLinkList(link_node_t *p)
{int len = 0;while (p->next != NULL){p = p->next;len++;}return len;
}

4. 遍历链表

void showLinkList(link_node_t *p)
{while (p->next != NULL){p = p->next;printf("%-4d", p->data);}
}

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

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

相关文章

C# 两种方案实现调用 DeepSeek API

目录 序 开发运行环境 访问API的一个通用方法 原生官网实现 申请 API key 调用实现 调用示例 腾讯云知识引擎原子调用 申请 API key 调用示例 小结 序 DeepSeek&#xff08;深度求索&#xff09; 最近可谓火爆的一塌糊涂&#xff0c;具体的介绍这里不再赘述&#x…

23. AI-大语言模型

文章目录 前言一、LLM1. 简介2. 工作原理和结构3. 应用场景4. 最新研究进展5. 比较 二、Transformer架构1. 简介2. 基本原理和结构3. 应用场景4. 最新进展 三、开源1. 开源概念2. 开源模式3. 模型权重 四、再谈DeepSeek 前言 AI‌ 一、LLM LLM&#xff08;Large Language Mod…

web前端第三次作业:登录窗口拖动效果

<!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>登录窗口拖动效果</title> <style>…

【PCIe 总线及设备入门学习专栏 1.1 -- PCI 设备访问方法】

文章目录 CPU 地址空间与PCI 地址空间PCI 地址空间CPU 地址空间Host Bridge PCI 设备连接框图PCI 硬件信号Configuration Commands CPU 地址空间与PCI 地址空间 PCI 地址空间 PCI总线具有32位数据/地址复用总线&#xff0c;所以其存储地址空间为2的32次方4GB。也就是PCI上的所…

CentOS 7超详细安装教程(含镜像)

1. 安装前准备 1.1 CentOS简介 CentOS&#xff08;Community Enterprise Operating System&#xff0c;中文意思是&#xff1a;社区企业操作系统&#xff09;是一种基于 Red Hat Enterprise Linux&#xff08;RHEL&#xff09;源代码构建的免费开源操作系统。它在稳定性、安全…

【Linux】详谈 进程控制

目录 一、进程是什么 二、task_struct 三、查看进程 四、创建进程 4.1 fork函数的认识 4.2 2. fork函数的返回值 五、进程终止 5.1. 进程退出的场景 5.2. 进程常见的退出方法 5.2.1 从main返回 5.2.1.1 错误码 5.2.2 exit函数 5.2.3 _exit函数 5.2.4 缓冲区问题补…

音视频入门基础:RTP专题(9)——FFmpeg接收RTP流的原理和内部实现

一、引言 由《音视频入门基础&#xff1a;RTP专题&#xff08;2&#xff09;——使用FFmpeg命令生成RTP流》可以知道&#xff0c;推流端通过下面FFmpeg命令可以将一个媒体文件转推RTP&#xff0c;生成RTP流&#xff1a; ffmpeg -re -stream_loop -1 -i input.mp4 -vcodec cop…

大模型Deepseek的使用_基于阿里云百炼和Chatbox

目录 前言1. 云服务商2. ChatBox参考 前言 上篇博文中探索了&#xff08;本地&#xff09;部署大语言模型&#xff0c;适合微调、数据高隐私性等场景。随着Deepseek-R1的发布&#xff0c;大语言模型的可及性得到极大提升&#xff0c;应用场景不断增加&#xff0c;对高可用的方…

zookeeper watch

目录 回顾回调&观察者模式&发布订阅模式Zookeeper 客户端/ 服务端 watchgetChildren 为例最后归纳 回顾回调&观察者模式&发布订阅模式 回调的思想 类A的a()方法调用类B的b()方法类B的b()方法执行完毕主动调用类A的callback()方法 回调分为同步回调和异步回调…

PAT乙组(1016 部分A+B 1017 A除以B)C语言超详细

文章目录 1016 部分AB1017 A除以B 1016 部分AB 输入样例 1&#xff1a; 3862767 6 13530293 3输出样例 1&#xff1a; 399输入样例 2&#xff1a; 3862767 1 13530293 8输出样例 2&#xff1a; 0代码长度限制 16 KB 时间限制 150 ms 内存限制 64 MB 栈限制 8192 KB 思路解析…

论文笔记:Multi-Head Mixture-of-Experts

2024 neurips 1 背景 稀疏混合专家&#xff08;SMoE&#xff09;可在不显著增加训练和推理成本的前提下提升模型的能力【比如Mixtral 8*7B&#xff0c;表现可以媲美LLaMA-2 70B】 但它也有两个问题 专家激活率低&#xff08;下图左&#xff09; 在优化时只有一小部分专家会被…

【Azure 架构师学习笔记】- Azure Databricks (11) -- UC搭建

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (10) – UC 使用 前言 由于ADB 的更新速度很快&#xff0c;在几个月之后重新搭建ADB 时发现UC 已经更新了很多&#xff0c;为了后续做ADB 的功…

解锁养生秘籍,拥抱健康生活

在这个快节奏的时代&#xff0c;人们行色匆匆&#xff0c;常常在忙碌中忽略了健康。其实&#xff0c;养生并非遥不可及&#xff0c;它就藏在生活的细微之处&#xff0c;等待我们去发现和实践。 规律作息是健康的基础。日出而作&#xff0c;日落而息&#xff0c;顺应自然规律&am…

动手学Agent——Day2

文章目录 一、用 Llama-index 创建 Agent1. 测试模型2. 自定义一个接口类3. 使用 ReActAgent & FunctionTool 构建 Agent 二、数据库对话 Agent1. SQLite 数据库1.1 创建数据库 & 连接1.2 创建、插入、查询、更新、删除数据1.3 关闭连接建立数据库 2. ollama3. 配置对话…

最新国内 ChatGPT Plus/Pro 获取教程

最后更新版本&#xff1a;20250202 教程介绍&#xff1a; 本文将详细介绍如何快速获取一张虚拟信用卡&#xff0c;并通过该卡来获取ChatGPT Plus和ChatGPT Pro。 # 教程全程约15分钟开通ChatGPT Plus会员帐号前准备工作 一个尚未升级的ChatGPT帐号&#xff01;一张虚拟信用卡…

Redis哈希槽机制的实现

Redis哈希槽机制的实现 Redis集群使用哈希槽&#xff08;Hash Slot&#xff09;来管理数据分布&#xff0c;整个集群被划分为固定的16384个哈希槽。当我们在集群中存储一个键时&#xff0c;Redis会先对键进行哈希运算&#xff0c;得到一个哈希值。然后&#xff0c;Redis将该哈…

下载安装运行测试开源vision-language-action(VLA)模型OpenVLA

1. 安装 项目官网OpenVLA 首先按照官网提示的以下代码&#xff0c;执行创建环境->安装最小依赖->git克隆项目等 # Create and activate conda environment conda create -n openvla python3.10 -y conda activate openvla# Install PyTorch. Below is a sample comma…

外贸跨境订货系统流程设计、功能列表及源码输出

在全球化的商业环境下&#xff0c;外贸跨境订货系统对于企业拓展国际市场、提升运营效率至关重要。该系统旨在为外贸企业提供一个便捷、高效、安全的订货平台&#xff0c;实现商品展示、订单管理、物流跟踪等功能&#xff0c;满足跨境业务的多样化需求。以下将详细阐述外贸订货…

排序算法复习——包括插入排序、希尔排序、冒泡排序、快排(包括霍尔法、挖坑法、快慢指针法)、堆排、选择排序、归并排序等 (代码采用c/c++混编)

1.插入排序 插入排序就像我们打斗地主的时候&#xff0c;有一大把牌我们来不及理&#xff0c;就会一张一张的拿然后把拿到的牌放到合适的位置。 对于插入排序我们可以将待排序的数组理解为那一堆没有整理的牌&#xff0c;将排序好的部分理解为手上的牌&#xff0c;对于第i张牌我…

RocketMQ 5.0安装部署

0.前言 在微服务架构逐渐成为主流的今天&#xff0c;消息队列如同数字世界的快递员&#xff0c;承担着系统间高效通信的重要使命。 Apache RocketMQ 自诞生以来&#xff0c;因其架构简单、业务功能丰富、具备极强可扩展性等特点被众多企业开发者以及云厂商广泛采用。历经十余…