本文主要是介绍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 |
data | x | y | z |
如上面的数组中,想要添加元素,在.length中添加元素m,添加后length++
length
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | ... | n |
data | x | y | z | m |
代码实现:
//顺序插入数据
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 | 4 | 5 | 6 | ... | n |
data | x | y | z | m |
i length
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | ... | n |
data | x | y | z |
如上面的数组中,想要在位置 i 的位置添加元素k,需要将 i = 1 位置及其以后的所有元素往后移动一位,添加后length++
i length
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | ... | n |
data | x | k | y | z |
代码实现:
//在顺序表的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 |
data | x | k | y |
如上面的数组中,想要删除元素k,需要记录下元素位置i,然后从i+1开始所有的元素往前移动一位,然后length--
length
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | ... | n |
data | x | y |
代码实现:
//删除元素为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 |
data | x | y | z |
如上面的数组中,查找想要修改的 元素y 的 下标i ,再改成想要的 元素m
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | ... | n |
data | x | m | z |
代码实现:
//改动元素
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 |
data | x | k | z |
如上面的数组中,想要查找元素 元素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线性逻辑结构——线性表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!