上海 建站,商务型网站,什么企业网站能自己做,vps搭建网站教程4.1线性表的思路理解 线性表是包含若干个数据元素的一个线性序列 线性表特征#xff1a;表头无前驱#xff0c;表尾无后继#xff0c;其他元素有且仅有一个直接前驱和直接后继。 顺序存储#xff1a;逻辑上相邻的元素#xff0c;其存储位置也相邻(但是对表的插入和删除)
… 4.1线性表的思路理解 线性表是包含若干个数据元素的一个线性序列 线性表特征表头无前驱表尾无后继其他元素有且仅有一个直接前驱和直接后继。 顺序存储逻辑上相邻的元素其存储位置也相邻(但是对表的插入和删除)
4.2线性表的创建 4.2.1结构体的构建 线性表的顺序存储结构
ctypedef int data_t;//int可以改成图书馆
#define N 128
typedef struct {data_t data[N];int last;
}sqlist, *sqlink;
last表示最后一个可能有100个数现在代表的就是有数据的最后一个元素其实就是一个下标。
4.2.2创建函数的实现
每一种数据结构 都会去定义这三个文件 sqlist.h 写数据结构定义 或结构体的定义(表的数组 last标记最后一个元素的位置) 增删改查各种运算接口 sqlist.c 运算的实现 test.c 直接去调用sqlist.h接口 接口去调用到sqlist.c函数原型里面实现 这样来写结构的好处 1 结构非常清晰 2 软件复用很好(可以将.c 和 .h 给其他同事或同学用 可以自己用 自己直接拿来调用.c和.h文件即可实现链表运算)
4.2.2.1 逻辑分析 1. 申请空间 2. 初始化 4.2.2.2 代码实现
sqlink list_create() {//mallocsqlink L;
4.3线性表的尾部插入
4.3.1逻辑分析
1. 判断是否为满
2. last往后移动一个位置
3. 赋值
//malloc需要头文件 #include stdlib.h 返回值void *(强制类型转换) 堆L (sqlink)malloc(sizeof(sqlist));if (L NULL) {printf(list malloc failed\n);return L; //失败 返回的是NULL 没有意义}//initialize 初始化//void *memset(void *s, int c, size_t n); 需要#include string.h|s起始地址 用
c去填充 n就是n个字节//从s开始的n个字节全部用c去填充memset(L, 0, sizeof(sqlist));L-last -1;//returnreturn L;
} 4.3线性表的尾部插入 4.3.1逻辑分析 1. 判断是否为满 2. last往后移动一个位置 3. 赋值 4.3.2代码实现
int list_insert(sqlink L, data_t value) {
int i;
//full
if (L-last N-1) {
printf(list is full\n);
return -1;
}
//update value last
L-last;
L-data[L-last] value;
return 0;
}
4.4线性表的打印 4.4.1逻辑分析 如何遍历顺序表 4.4.2 代码实现 1. 判断有没有表 2. 判断表是否为空 3. 通过last移动遍历打印
int list_show(sqlink L) {
int i;
if (L NULL)
return -1;
if (L-last -1)
printf(list is empty\n);
for (i 0; i L-last; i) {
printf(%d , L-data[i]);
}
puts();
return 0;
}
4.5线性表置空 4.5.1逻辑分析 1.首先判断表是否为空表 成功返回0 失败返回-1 2.置空 4.5.2 代码实现
int list_empty(sqlink L) {
if(L NULL){
printf“list is empty\n”
return -1
}memset(L, 0, sizeof(sqlist));L-last -1;
}
4.6线性表的尾部删除 4.6.1逻辑分析 1、判断下它是否为空 2、last向左移动一下
4.6.2 代码实现
int list_delete(sqlink L) {
int i;
if (L-last -1) {
printf(list is empty\n);
return -1;
}
//update
L-last--;
return 0;
}
4.7线性表的任意位置插入 4.6.1逻辑分析 1.首先判断表满没满 2.检查位置是否对 [0, last1] 3.整体往后移动 4.赋值 5.last往后移动一个位置 L-last; 4.6.2 代码实现
int list_insert(sqlink L, data_t value, int pos) {
int i;
//full
if (L-last N-1) {
printf(list is full\n);
return -1;
}
//check para 0posLast1 [0, last1]
if (pos 0 || pos L-last1) {
printf(Pos is invalid\n);
return -1;
}for(i L-last; i pos;i--){
L-data[i1] L-data[i];
}
//update value last
L-data[pos] value;
L-last;
return 0;
}
4.7线性表的任意位置删除 4.7.1逻辑分析 1. 判断下它是否为空 2. 判断删除的位置是否可以 [0, last] 3. 循环移动 4. last向左移一下 4.7.2 代码实现
int list_delete(sqlink L, int pos) {
int i;
if (L NULL) { //判断是不是空
printf(list is not exist\n);
return -1;
}
if (L-last -1) { //判断是不是空
printf(list is empty\n);
return -1;
}
//int ret ; ret L-data[pos];
//pos [0, last] || 满足其一就有问题
if (pos 0 || pos L-last) {
printf(delete pos is invalid\n);
return -1;
}
//move [pos1, last]
for (i pos1; i L-last; i) {
L-data[i-1] L-data[i];
}
/*
for(i pos; i L-last;i){
L-data[i] L-data[i1];
}
*/
//update
L-last--;
return 0;
// return ret;
}