线性表编程记录
线性表的顺序表示(顺序表)
定义如下
#include <stdio.h>
#define MaxSize 10 //定义数组最大长度
#define flase 0 // 失败返回
#define true 1 // 成功返回
typedef struct{ // 顺序表的结构体
int data[MaxSize]; // 静态分配地址
int length; // 顺序表当前的长度
} SqList;
主函数 main
略
1.1 初始化顺序表
- 初始化数据,方便测试
- 初始化顺序表长度
/**
1. 初始化循序表(静态分配)
*/
void initList(SqList &L) {
// 初始为data赋值
int i=0;
for( ;i<5; i++)
L.data[i] = i;
L.length =i;
}
/**
1(动态分配的初始化)
*/
void initListAction(SqList &L) {
// 为data分配空间
L.data = (int *)malloc(sizeof(int) * MaxSize);
// 初始为data赋值
int i=0;
for( ;i<5; i++)
L.data[i] = i;
L.length =i;
}
1.2 打印顺序表
- 从第一个元素到最后一个元素,顺序打印
/**
2.循环遍历循序表
*/
void PrintList(SqList L) {
int i;
for(i=0; i<L.length; i++){
printf("%d\n", L.data[i]);
}
printf("---------------------------------------\n");
}
1.3去除顺序表的重复元素
略
1.4 在第i个位置插入元素
- 思想: 将第i个元素(下标为i-1)以及后面的元素向后依次移动。(初始j =len, 循环终止条件为 j<=i, 实际到j==就会终止了)
- 还要注意一些不可插入的条件: i的范围(1,len+1), 其中的len+1表示最后一个元素后面一个。 对应的下标为(0, len)。
- 当L.length 大于或者等于MaxSize的时候,表示表满了,不可再插入。
- 插入成功后,表的长度加一
/**
4. 在第i个位置插入元素
*/
bool listInsert(SqList &L, int i, int el) {
int j;
// 判断一些不可插入的点
// 了解可插入的点的范围 ( i表示的 第i-1下标)
// (插入的范围为 1 - len加1 个位置, len+1的位置其实就是下标为len的位置)
// (所以 下标的范围为 0-len, 启动len表示最后一个元素下一个元素的下标)
if(i<1 || i>L.length+1) {
// 不在可插入范围内
printf("i=(%d)不在可插入范围内\n", i);
return flase;
}
if(L.length>=MaxSize) {
// 顺序表满了
printf("顺序表满了\n");
return flase;
}
// 注意第i个元素的下标为(i-1)
// 从len开始,因为最后一个元素要放在下一个
// 结束循环的下标为i,表示的第i+1个元素
for(j=L.length; j>=i; j--) {
L.data[j] = L.data[j-1]; // 用前一个覆盖后面的元素
}
// 为第i个元素也就是下标为i-1赋值
L.data[i-1] = el;
// 长度加1
L.length++;
// 插入成功返回ture
return true;
}
1.5 删除指定位置的元素
- 删除前先判断 要删除的范围是否符合规范 删除的位置i的范围为(1-len)
- 删除的具体思想是, 将第i个位置后面的元素依次向前移动,也就是从i+1个位置(下标为i)的元素开始,椅子和遍历到最后一个元素len。
- 遍历向前移动后,最后一个元素要清空
- 表长度减一
/**
5. 删除顺序表的某个元素并保存到e
*/
bool ListDelete(SqList &L, int i, int &e){
// 先判断一下删除的位置是否有元素(范围:1-len)
if(i<1 || i>L.length) {
printf("删除的位置没有元素");
return false;
}
// 如果在合理的删除范围
// 先将删除位置i(下标:i-1) 对应的元素数值赋值给e
e = L.data[i-1];
// 将第i个位置以后的元素往前移动,最后一个元素的位置赋值0
int j;
for(j=i; j<L.length; j++) {
L.data[j-1] = L.data[j];
}
// 最后一个元素赋值0
L.data[j-1] = 0;
// 返回删除成功
printf("删除成功!\n");
L.length--;
return true;
}
1.6 查找指定元素的位序
- 注意位序是指的第几个 从 1 开始
- 下标是从0开始
/**
6. 查找指定元素的下标(返会第一个符合条件的元素位序(注意位序是指第几个,从1开始;下标从0开始))
*/
int locateElem(SqList L, int e) {
int i;
for (i=0; i<L.length; i++) {
if(e == L.data[i])
return i+1;
}
// 如果没找到,返回-1
return -1;
}
未完结… 后期添加