从0开始的数据结构的书写-------线性表(顺序表)

(复习考研的休息区,心血来潮,写点代码)

三个规则:

1、不使用c++ stl库进行书写

2、最好基于严蔚敏老师的数据结构

3、最好使用malloc和realloc动态分配内存

(如果有问题,请大家看看)

cpp 复制代码
// 线性表的顺序存储 
// 不使用stl 
#include<iostream>
#include<cstring>

using namespace std;

#define LIST_INIT_SIZE  100 // 线性表的初始空间
#define LISTINCREMENT 10 // 分配增量 
#define OK true
#define ERROR false 
#define ERRORINT 0x3f3f3f3f3f

typedef struct
{
	int *elem; // 顺序表的基址 
	int len; // 当前长度 
	int listsize; // 当前分配的存储容量
}SqList;

bool InitList_Sq(SqList &L)
{
	// L.elem = new int[LIST_INIT_SIZE];
	L.elem = (int *)malloc(sizeof(int) * LIST_INIT_SIZE);
	if(!L.elem) exit(0); // 分配失败 
	L.len = 0;
	L.listsize = LIST_INIT_SIZE;
	return OK;
}

bool ClearList(SqList &L)
{
	if(!L.elem) return ERROR;
	printf("已被清空\n");
	if(L.len == 0) return OK;
	for(int i = 0;i < L.len;i ++)
		L.elem[i] = 0; // 清零
	L.len = 0; 
	return OK;
}

bool ListEmpty(SqList L)
{
	if(!L.elem) exit(0);
	if(L.len == 0) return OK;
	return ERROR;
}

int ListLength(SqList L)
{
	if(!L.elem) exit(0);
	return L.len;
}

// 注意:线性表编号一定是从1~n 
int GetElem(SqList L , int idx)
{
	if(idx < 1 || idx > L.len) return ERRORINT;
	return L.elem[idx - 1];
}

/* 
'>'找到第一个大于e的值的位序 
'<'找到第一个小于e的值的位序 
'='找到第一个等于e的值的位序 
*/
int LocateElem(SqList L , int e , char ch)
{
	if(!L.elem) exit(0);
	if(ch == '=')
	{
		for(int i = 0;i < L.len;i ++)
			if(L.elem[i] == e) return i + 1;
	}
	else if(ch == '>')
	{
		for(int i = 0;i < L.len;i ++)
			if(L.elem[i] > e) return i + 1;
	}
	else if(ch == '<')
	{
		for(int i = 0;i < L.len;i ++)
			if(L.elem[i] < e) return i + 1;
	}
	return 0; // 没有找到 
}

bool ListInsert(SqList &L , int idx , int e)
{
	if(idx < 1 || idx > L.len + 1) return ERROR;
	if(L.len >= L.listsize) // 增加分配 
	{
		cout << "该表重新分配内存\n";
		L.elem = (int *)realloc(L.elem , sizeof(int) * (L.listsize + LISTINCREMENT));
		L.listsize += LISTINCREMENT;
	}
	
	for(int i = L.len - 1;i >= idx - 1;i --)
		L.elem[i + 1] = L.elem[i];
	printf("插入数据%d\n" , e);	
	L.elem[idx - 1] = e;
	L.len ++;
	return OK;
}

int ListDelete(SqList &L , int idx)
{
	if(idx < 1 || idx > L.len) return ERRORINT;
	int e = L.elem[idx - 1];
	printf("删除数据%d\n" , e);
	for(int i = idx - 1;i < L.len;i ++)
		L.elem[i] = L.elem[i + 1];
	L.len --;
	return e;
}

void ListPrint(SqList L)
{
	if(!L.elem) exit(0);
	cout << "当前顺序表是:"; 
	for(int i = 0;i < L.len;i ++)
		cout << L.elem[i] << " ";
	cout << "\n";
	return ;
}

int main()
{
	SqList L;
	InitList_Sq(L);
	for(int i = 10;i >= 1;i --) // 正向插入数据1~10 
		ListInsert(L , 1 , i);
	ListPrint(L);
	
	ListDelete(L , 1);
	ListDelete(L , 3);
	
	ListPrint(L);
}
相关推荐
散1121 天前
01数据结构-01背包问题
数据结构
消失的旧时光-19431 天前
Kotlinx.serialization 使用讲解
android·数据结构·android jetpack
Gu_shiwww1 天前
数据结构8——双向链表
c语言·数据结构·python·链表·小白初步
苏小瀚1 天前
[数据结构] 排序
数据结构
睡不醒的kun1 天前
leetcode算法刷题的第三十四天
数据结构·c++·算法·leetcode·职场和发展·贪心算法·动态规划
吃着火锅x唱着歌1 天前
LeetCode 978.最长湍流子数组
数据结构·算法·leetcode
Whisper_long1 天前
【数据结构】深入理解堆:概念、应用与实现
数据结构
IAtlantiscsdn1 天前
Redis7底层数据结构解析
前端·数据结构·bootstrap
我星期八休息1 天前
深入理解跳表(Skip List):原理、实现与应用
开发语言·数据结构·人工智能·python·算法·list
和编程干到底1 天前
数据结构 栈和队列、树
数据结构·算法