#include "AList.h"
#include <iostream>
bool InitList(SqlList& L) {
// 线性表指针指向首地址、初始化线性表元素个数及线性表可存储元素个数
L.elem = (int*)malloc(sizeof(int)* LIST_INT_SIZE);
if (L.elem == nullptr) {
exit(OVERFLOW);
}
L.length = 0;a
L.listSize = LIST_INT_SIZE;
return true;
}
bool DestoryList(SqlList& L) {
// 释放动态内存分配的空间并将线性表元素个数及线性表容量设置为0
free(L.elem);
L.length = 0;
L.listSize = 0;
return true;
}
// index: 插入在第几个元素之后 value: 插入的值
bool ListInsert(SqlList& L, int index, int value) {
int *newBase, *p, *q;
// 检测插入的位置是否合法,若不合法则返回一个false
if (index < 1 || index > L.length + 1){
return false;
}
// 若当前存储空间已满,则需重新分配并增加空间(newBase指向新空间首地址)
if (L.length >= L.listSize){
// 进行内存的重新分配(注意:使用realloc在原地址上进行分配)
if (!(newBase = (int*)realloc(L.elem, \
(L.listSize + LISTINCREMENT) * sizeof(int)))){
exit(OVERFLOW);
}
// 若原内存后无足够的内存分配时,会进行完整的重新分配,因此需重新赋值
L.elem = newBase;
L.listSize += LISTINCREMENT;
}
q = L.elem + index - 1; // 需插入的位置
// p = L.elem + L.length - 1: p指向最后一个元素
for (p = L.elem + L.length - 1; p >= q;--p){
// 对元素进行移动(即,从指定位置开始的元素都移动到下一个元素空间)
*(p + 1) = *p;
}
*q = value; // 插入元素
++L.length; // 线性链表中的元素加1
return true;
}
// 对线性链表进行遍历(对链表所有元素都调用vi函数)
bool ListTraverse(SqlList L, void(*vi)(int&)) {
int* p = L.elem;
for (int i = 1; i <= L.length; ++i){
vi(*p++);
}
std::cout << std::endl;
return true;
}
bool ClearList(SqlList& L) {
// 设置线性表当前的元素个数为0
L.length = 0;
}
bool ListEmpty(SqlList L) {
if (L.length == 0){
return true;
}else {
return false;
}
}
int ListLength(SqlList L) {
return L.length;
}
bool GetElem(SqlList L, int i, int& value) {
// i: 获取链表中的第i个元素 value:取值赋给变量value
if (i < 1 || i > L.length){
exit(0);
}
value = *(L.elem + i - 1);
return true;
}
// 获取某个元素在线性表中的位置
int LocateElem(SqlList L, int e, bool(*compare)(int, int)) {
int* p = L.elem;
int i = 1;
while (i <= L.length && !compare(*p++,e)){
++i;
}
if (i <= L.length) {
return i;
}else {
return 0;
}
}
bool PriorElem(SqlList L, int cur_e, int& pre_e) {
// 若cur_e是L的数据元素且不是第一个元素,则用pre_e返回它的前驱,
// 否则操作失败,pre_e无定义
int i = 2;
int* p = L.elem + 1;
while (i <= L.length && *p != cur_e){
p++;
i++;
}
if (i > L.length) {
return false;
}else {
pre_e = *--p;
return true;
}
}
bool NextElem(SqlList L, int cur_e, int& next_e) {
// 若curr_e是链表的元素但不是最后一个,则返回它的后继
// 否则操作失败,next_e无定义
int i = 1;
int* p = L.elem;
while (i < L.length && *p != cur_e){
i++;
p++;
}
if (i == L.length){
return false;
}else {
next_e = *++p;
return true;
}
}
bool ListDelete(SqlList L, int i, int& e) {
int *p, *q;
// 检查需删除元素的下标是否合法
if (i < 1 || i > L.length){
return false;
}
p = L.elem + i - 1; // 指向被删除的元素
e = *p; // 被删除的元素赋给e
q = L.elem + L.length - 1; // 指向链表尾部元素
for (++p; p <= q; ++p){
*(p - 1) = *p;
}
L.length--;
return true;
}
数据结构之线性链表
最新推荐文章于 2020-07-24 10:56:00 发布