数据结构 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.mzph.cn/diannao/70087.shtml

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

相关文章

数据恢复-01-机械硬盘的物理与逻辑结构

磁盘存储原理 磁盘存储数据的原理&#xff1a; 磁盘存储数据的原理是利用磁性材料在磁场作用下的磁化性质&#xff0c;通过在磁盘表面上划分成许多小区域&#xff0c;根据不同的磁化方向来表示0和1的二进制数据&#xff0c;通过读写磁头在磁盘上的移动&#xff0c;可以实现数据…

wordpress get_footer();与wp_footer();的区别的关系

在WordPress中&#xff0c;get_footer() 和 wp_footer() 是两个不同的函数&#xff0c;它们在主题开发中扮演着不同的角色&#xff0c;但都与页面的“页脚”部分有关。以下是它们的区别和关系&#xff1a; 1. get_footer() get_footer() 是一个用于加载页脚模板的函数。它的主…

DeepSeek 通过 API 对接第三方客户端 告别“服务器繁忙”

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 上一期分享了如何在本地部署 DeepSeek R1 模型&#xff0c;但通过命令行运行的本地模型&#xff0c;问答的交互也要使用命令行&#xff0c;体验并不是很好。这期分享几个第三方客户端&#xff0c;涵盖了桌…

跟着李沐老师学习深度学习(十一)

经典的卷积神经网络 在本次笔记中主要介绍一些经典的卷积神经网络模型&#xff0c;主要包含以下&#xff1a; LeNet&#xff1a;最早发布的卷积神经网络之一&#xff0c;目的是识别图像中的手写数字&#xff1b;AlexNet&#xff1a; 是第一个在大规模视觉竞赛中击败传统计算机…

使用JavaScript实现深浅拷贝

1. 拷贝的基本概念和必要性 在 JavaScript 中&#xff0c;数据类型分为基本数据类型&#xff08;如 Number、String、Boolean、Null、Undefined、Symbol&#xff09;和引用数据类型&#xff08;如 Object、Array&#xff09;。基本数据类型存储的是值本身&#xff0c;而引用数…

解析浏览器中JavaScript与Native交互原理:以WebGPU为例

引言 随着Web应用复杂度的提升&#xff0c;开发者对浏览器访问本地硬件能力的需求日益增长。然而&#xff0c;浏览器必须在开放性与安全性之间找到平衡——既不能放任JavaScript&#xff08;JS&#xff09;随意操作系统资源&#xff0c;又要为高性能计算、图形渲染等场景提供支…

T-Sql 打印所有用户表的建表脚本

-- 声明一个变量用于存储表名 DECLARE TableName NVARCHAR(128); -- 声明一个游标&#xff0c;用于遍历所有用户表 DECLARE TableCursor CURSOR FOR SELECT name FROM sys.tables WHERE type U; -- 打开游标 OPEN TableCursor; -- 从游标中获取第一行数据 FETCH NEXT FROM Ta…

25/2/16 <算法笔记> MiDas原理

MiDaS&#xff08;Monocular Depth Sensing&#xff09;是一种基于单目深度估计的技术&#xff0c;它通过深度学习方法使用单张RGB图像&#xff08;普通2D图像&#xff09;来估算场景的深度图&#xff08;Depth Map&#xff09;。相比于传统的依赖专用深度传感器&#xff08;如…

python+halcon 解读labelme标注生成marksimage

这一段代码封装了一个类&#xff0c;需要传统一个图片和标注后json文件所在的地址&#xff0c;标注的选项是polygon&#xff0c;主要是用于unet深度学习网络 在初始化时需要输入文件&#xff08;imagejeson&#xff09;路径&#xff0c;多分类任务的label_list。会在项目目录下…

从技术债务到架构升级,滴滴国际化外卖的变革

背 景 商家营销简述 在外卖平台的运营中&#xff0c;我们致力于通过灵活的补贴策略激励商家&#xff0c;与商家共同打造良好的合作关系&#xff0c;也会提供多样化的营销活动&#xff0c;帮助商家吸引更多用户下单。通过这些活动&#xff0c;不仅能够提高商家的销量&#xff0c…

英语—四级CET4考试—技巧篇—选词填空—实操教学—2014 年 6 月大学英语四级考试真题(第 2 套)

&#x1f3e0;个人主页&#xff1a;fo安方的博客✨ &#x1f482;个人简历&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;目前中南大学MBA在读&#xff0c;也考取过HCIE Cloud Computing、CCIE Security、PMP、CISP、RHCE、CCNP RS、PEST 3等证书。&#x1f433; &…

线性代数中的正交和标准正交向量

在线性代数中&#xff0c;理解正交向量和正交向量至关重要&#xff0c;尤其是对于机器学习中的应用。这篇博文将简化这些概念&#xff0c;而不会太深入地深入研究复杂的数学。 正交向量 如果两个向量的点积等于零&#xff0c;则认为这两个向量是正交的。但点积到底是什么呢&am…

企业文件共享中的权限管理与安全风险防范

在企业的日常运营中&#xff0c;文件共享是必不可少的一项工作。然而&#xff0c;文件共享过程中如果权限管理不当&#xff0c;极易引发安全风险&#xff0c;导致企业敏感信息泄露。因此&#xff0c;加强文件共享中的权限管理与安全风险防范&#xff0c;对于保障企业信息安全至…

急停信号的含义

前言&#xff1a; 大家好&#xff0c;我是上位机马工&#xff0c;硕士毕业4年年入40万&#xff0c;目前在一家自动化公司担任软件经理&#xff0c;从事C#上位机软件开发8年以上&#xff01;我们在开发C#的运动控制程序的时候&#xff0c;一个必要的步骤就是确认设备按钮的急停…

数据结构:图;邻接矩阵和邻接表

邻接矩阵&#xff1a; 1.概念&#xff1a; 邻接矩阵是图的存储结构之一&#xff0c;通过二维数组表示顶点间的连接关系。 2.具体例子 &#xff1a; 一.无向图邻接矩阵示例&#xff1a; 示例图&#xff08;顶点&#xff1a;A、B、C&#xff0c;边&#xff1a;A-B、B-C&…

Kubernetes-master 组件

以下是Kubernetes Master Machine的组件。 etcd 它存储集群中每个节点可以使用的配置信息。它是一个高可用性键值存储&#xff0c;可以在多个节点之间分布。只有Kubernetes API服务器可以访问它&#xff0c;因为它可能具有一些敏感信息。这是一个分布式键值存储&#xff0c;所…

【第2章:神经网络基础与实现——2.1 前馈神经网络的结构与工作原理】

老铁们好!今天我们要来一场长达两万字的超详细技术探险,我会像拆解乐高积木一样把前馈神经网络(Feedforward Neural Network)的每个零件摆在台面上,用最接地气的方式让你彻底搞懂这个深度学习基石的工作原理。准备好了吗?我们开始吧! 第一章:神经网络的 “乐高积木” 1…

【云安全】云原生- K8S kubeconfig 文件泄露

什么是 kubeconfig 文件&#xff1f; kubeconfig 文件是 Kubernetes 的配置文件&#xff0c;用于存储集群的访问凭证、API Server 的地址和认证信息&#xff0c;允许用户和 kubectl 等工具与 Kubernetes 集群进行交互。它通常包含多个集群的配置&#xff0c;支持通过上下文&am…

【环境安装】重装Docker-26.0.2版本

【机器背景说明】Linux-Centos7&#xff1b;已有低版本的Docker 【目标环境说明】 卸载已有Docker&#xff0c;用docker-26.0.2.tgz安装包安装 1.Docker包下载 下载地址&#xff1a;Index of linux/static/stable/x86_64/ 2.卸载已有的Docker 卸载之前首先停掉服务 sudo…

字节跳动后端二面

&#x1f4cd;1. 数据库的事务性质&#xff0c;InnoDB是如何实现的&#xff1f; 数据库事务具有ACID特性&#xff0c;即原子性、一致性、隔离性和持久性。InnoDB通过以下机制实现这些特性&#xff1a; &#x1f680; 实现细节&#xff1a; 原子性&#xff1a;通过undo log实…