目录
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; //声明线性表a
a = 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; //声明线性表a
a = initArray(); //对a进行初始化
add(&a, 6);
add(&a, 3);
add(&a, 7);
insert(&a, 1, 10); //插入
replace(&a, 6, 33); //修改
show(a);
return 0;
}
输出结果: