数据结构之线性链表

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值