002线性逻辑结构——线性表

2024-09-04 03:52

本文主要是介绍002线性逻辑结构——线性表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.数据之间的逻辑关系

2.存储结构的实现

2.1顺序存储结构实现线性表:

对该顺序表进行一系列的增删改查:

①增:

        Ⅰ)顺序添加:

        Ⅱ)插入添加:

②删:

     

③改:

     

④查:

     

输出

整体代码示例


1.数据之间的逻辑关系

线性表:具有相同数据类型的有限个(n)数据元素的序列

              当n=0时是空表,n>1时,L=(a1,a2,a3,...,an)

                                                        a1表头元素        an表尾元素

              除了a1以外,其他元素都有唯一的前驱元素

              除了an以外,其他元素都有唯一的后继元素

2.存储结构的实现

2.1顺序存储结构实现线性表:

                                             顺序表-->在内存中,以数组的形式保存的线性表

                                                                                数组的大小>=线性表大小

下方代码以顺序表为例子:

#include <stdio.h>
#include <stdlib.h>
#define maxx 105
//实现一个存放int类型的数据的线性表
typedef struct ArrayList {int* data;		//指针模拟开数组int maxSize;	//数组的最大容量int length;		//线性表中元素的实际个数
}MyArray;MyArray initArray() {MyArray b;b.data = (int*)malloc(sizeof(int) * maxx);if (b.data == NULL) {printf("n内存分配失败\n");}b.maxSize = maxx;b.length = 0;return b;
}
int  main() {MyArray a;			//声明线性表aa = initArray();	//对a进行初始化return 0;
}

对该顺序表进行一系列的增删改查:

①增:
        Ⅰ)顺序添加:

                                                                      length

 i  0  1  2  3  4  5  6  ...  n  
dataxyz

如上面的数组中,想要添加元素,在.length中添加元素m,添加后length++

                                                                              length

 i  0  1  2  3   5  6  ...  n  
dataxyzm

代码实现:

//顺序插入数据
void add(MyArray* a, int t) {if (a->length < a->maxSize) {a->data[a->length] = t;a->length++;}else {printf("顺序表已满,不能插入\n");}}
        Ⅱ)插入添加:
 i  0  1  2  3   5  6  ...  n  
dataxyzm

                                                           i          length

 i  0  1  2  3  4  5  6  ...  n  
dataxyz

如上面的数组中,想要在位置  i  的位置添加元素k,需要将 i = 1 位置及其以后的所有元素往后移动一位,添加后length++        

                                                           i                  length

 i  0  1  2  3  4  5  6  ...  n  
dataxkyz

代码实现:

//在顺序表的i下标位置插入元素k
void insert(MyArray* a, int i, int k) {if (i<0 || i>a->length) {printf("插入位置不合法");}else {for (int j = a->length - 1; j >= i; j--) {a->data[j + 1] = a->data[j];}a->data[i] = k;a->length++;}}

*********************************************

②删:

        注意:删除这里需要用到查找的相关知识,具体可以跳到 ④查

                                                           i            length

 i  0  1  2  3  4  5  6  ...  n  
dataxky

如上面的数组中,想要删除元素k,需要记录下元素位置i,然后从i+1开始所有的元素往前移动一位,然后length--

                                                                length           

 i  0  1  2  3  4  5  6  ...  n  
dataxy

代码实现:

//删除元素为k 的数据
void delet(MyArray* a, int k) {//查找k的位置int i = find(a, k);if (i == -1) {printf("被删除的数据不存在\n");return;}for (int j = i; j < a->length - 1; j++) {a->data[j] = a->data[j + 1];}a->length--;return;
}
     

**************************************************

③改:

                注意:删除这里需要用到查找的相关知识,具体可以跳到 ④查

                                                           i          

 i  0  1  2  3  4  5  6  ...  n  
dataxyz

如上面的数组中,查找想要修改的 元素y 下标i ,再改成想要的 元素m

                                                                            

 i  0  1  2  3  4  5  6  ...  n  
dataxmz

代码实现:

//改动元素
void replace(MyArray *a,int y,int m) {int i = find(a, y);if (i == -1) {printf("想要修改的数据不存在\n");return;}a->data[i] = m;return;
}
     

**************************************************

④查:
 i  0  1  2  3  4  5  6  ...  n  
dataxkz

如上面的数组中,想要查找元素 元素k 是否在线性表中,可以遍历查找

             

代码实现:

//遍历查找元素k是否存在
int find(MyArray* a, int k) {for (int i = 0; i < a->length; i++) {if (a->data[i] == k) {return i;}return -1;//表示不存在}
}
     

输出

//输出顺序表中的数据
void show(MyArray a) {for (int i = 0; i < a.length; i++) {printf("%d\t",a.data[i]);}printf("\n");
}

整体代码示例

                        

#include <stdio.h>
#include <stdlib.h>
#define maxx 105
//实现一个存放int类型的数据的线性表
typedef struct ArrayList {int* data;		//指针模拟开数组int maxSize;	//数组的最大容量int length;		//线性表中元素的实际个数
}MyArray;MyArray initArray() {MyArray b;b.data = (int*)malloc(sizeof(int) * maxx);if (b.data == NULL) {printf("n内存分配失败\n");}b.maxSize = maxx;b.length = 0;return b;
}//顺序插入数据
void add(MyArray* a, int t) {if (a->length < a->maxSize) {a->data[a->length] = t;a->length++;}else {printf("顺序表已满,不能插入\n");}}//在顺序表的i下标位置插入元素k
void insert(MyArray* a, int i, int k) {if (i<0 || i>a->length) {printf("插入位置不合法");}else {for (int j = a->length - 1; j >= i; j--) {a->data[j + 1] = a->data[j];}a->data[i] = k;a->length++;}}//遍历查找元素k是否存在
int find(MyArray* a, int k) {for (int i = 0; i < a->length; i++) {if (a->data[i] == k) {return i;}return -1;//表示不存在}
}//删除元素为 的数据
void delet(MyArray* a, int k) {//查找k的位置int i = find(a, k);if (i == -1) {printf("被删除的数据不存在\n");return;}for (int j = i; j < a->length - 1; j++) {a->data[j] = a->data[j + 1];}a->length--;return;
}//改动元素
void replace(MyArray *a,int y,int m) {int i = find(a, y);if (i == -1) {printf("想要修改的数据不存在\n");return;}a->data[i] = m;return;
}
//输出顺序表中的数据
void show(MyArray a) {for (int i = 0; i < a.length; i++) {printf("%d\t",a.data[i]);}printf("\n");
}int  main() {MyArray a;				//声明线性表aa = initArray();		//对a进行初始化add(&a, 6);add(&a, 3);add(&a, 7);insert(&a, 1, 10);		//插入replace(&a, 6, 33);		//修改show(a);return 0;
}

   输出结果:

               

这篇关于002线性逻辑结构——线性表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1134918

相关文章

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

最新Spring Security实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)

《最新SpringSecurity实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)》本章节介绍了如何通过SpringSecurity实现从配置自定义登录页面、表单登录处理逻辑的配置,并简单模拟... 目录前言改造准备开始登录页改造自定义用户名密码登陆成功失败跳转问题自定义登出前后端分离适配方案结语前言

Java逻辑运算符之&&、|| 与&、 |的区别及应用

《Java逻辑运算符之&&、||与&、|的区别及应用》:本文主要介绍Java逻辑运算符之&&、||与&、|的区别及应用的相关资料,分别是&&、||与&、|,并探讨了它们在不同应用场景中... 目录前言一、基本概念与运算符介绍二、短路与与非短路与:&& 与 & 的区别1. &&:短路与(AND)2. &:非短

mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据

《mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据》文章主要介绍了如何从.frm和.ibd文件恢复MySQLInnoDB表结构和数据,需要的朋友可以参... 目录一、恢复表结构二、恢复表数据补充方法一、恢复表结构(从 .frm 文件)方法 1:使用 mysq

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

结构体和联合体的区别及说明

《结构体和联合体的区别及说明》文章主要介绍了C语言中的结构体和联合体,结构体是一种自定义的复合数据类型,可以包含多个成员,每个成员可以是不同的数据类型,联合体是一种特殊的数据结构,可以在内存中共享同一... 目录结构体和联合体的区别1. 结构体(Struct)2. 联合体(Union)3. 联合体与结构体的

PostgreSQL如何查询表结构和索引信息

《PostgreSQL如何查询表结构和索引信息》文章介绍了在PostgreSQL中查询表结构和索引信息的几种方法,包括使用`d`元命令、系统数据字典查询以及使用可视化工具DBeaver... 目录前言使用\d元命令查看表字段信息和索引信息通过系统数据字典查询表结构通过系统数据字典查询索引信息查询所有的表名可