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

相关文章

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

线性因子模型 - 独立分量分析(ICA)篇

序言 线性因子模型是数据分析与机器学习中的一类重要模型,它们通过引入潜变量( latent variables \text{latent variables} latent variables)来更好地表征数据。其中,独立分量分析( ICA \text{ICA} ICA)作为线性因子模型的一种,以其独特的视角和广泛的应用领域而备受关注。 ICA \text{ICA} ICA旨在将观察到的复杂信号

JavaSE-易错题集-002

1. 下面有关java基本类型的默认值和取值范围,说法错误的是? A 字节型的类型默认值是0,取值范围是-2^7—2^7-1 B boolean类型默认值是false,取值范围是true\false C 字符型类型默认是0,取值范围是-2^15 —2^15-1 D long类型默认是0,取值范围是-2^63—2^63-1 答案:C 题解:注意字符型(char) char 占16位,

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据

✨机器学习笔记(二)—— 线性回归、代价函数、梯度下降

1️⃣线性回归(linear regression) f w , b ( x ) = w x + b f_{w,b}(x) = wx + b fw,b​(x)=wx+b 🎈A linear regression model predicting house prices: 如图是机器学习通过监督学习运用线性回归模型来预测房价的例子,当房屋大小为1250 f e e t 2 feet^

C语言程序设计(选择结构程序设计)

一、关系运算符和关系表达式 1.1关系运算符及其优先次序 ①<(小于) ②<=(小于或等于) ③>(大于) ④>=(大于或等于 ) ⑤==(等于) ⑥!=(不等于) 说明: 前4个优先级相同,后2个优先级相同,关系运算符的优先级低于算术运算符,关系运算符的优先级高于赋值运算符 1.2关系表达式 用关系运算符将两个表达式(可以是算术表达式或关系表达式,逻辑表达式,赋值表达式,字符

Science|癌症中三级淋巴结构的免疫调节作用与治疗潜力|顶刊精析·24-09-08

小罗碎碎念 Science文献精析 今天精析的这一篇综述,于2022-01-07发表于Science,主要讨论了癌症中的三级淋巴结构(Tertiary Lymphoid Structures, TLS)及其在肿瘤免疫反应中的作用。 作者类型作者姓名单位名称(中文)通讯作者介绍第一作者Ton N. Schumacher荷兰癌症研究所通讯作者之一通讯作者Daniela S. Thomm

【高等代数笔记】线性空间(一到四)

3. 线性空间 令 K n : = { ( a 1 , a 2 , . . . , a n ) ∣ a i ∈ K , i = 1 , 2 , . . . , n } \textbf{K}^{n}:=\{(a_{1},a_{2},...,a_{n})|a_{i}\in\textbf{K},i=1,2,...,n\} Kn:={(a1​,a2​,...,an​)∣ai​∈K,i=1,2,...,n

oracle11.2g递归查询(树形结构查询)

转自: 一 二 简单语法介绍 一、树型表结构:节点ID 上级ID 节点名称二、公式: select 节点ID,节点名称,levelfrom 表connect by prior 节点ID=上级节点IDstart with 上级节点ID=节点值 oracle官网解说 开发人员:SQL 递归: 在 Oracle Database 11g 第 2 版中查询层次结构数据的快速